iptables是低版本的CentOS中用于防火墙管理的工具(当然在Ubuntu系中也时常见到)。虽然现在习惯了CentOS新版firewalld的操作,但考虑到以后不可避免会遇到CentOS 6的时候,为方便备查整理一下零散的笔记。
工作机制
Linux在内核中选取五个位置放了五个钩子函数(hook function),分别是INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。写好的规则被送往netfilter,告诉内核如何去处理数据包。
实际上,通过ps会发现,iptables本身在工作时并没有特定的进程,而是本身作为一个内核模块被加载(可以通过lsmod | grep table查看)。所以,需要注意的是,在大部分Linux发行版中,仅通过systemctl或service命令是无法准确判断iptables规则是否正在工作(可以使用iptables查询命令去确认)。
数据包流动时涉及到的钩子:
方向 | 钩子 |
---|---|
流入本机 | PREROUTING --> INPUT --> 用户空间进程 |
流出本机 | 用户空间进程 --> OUTPUT --> POSTROUTING |
转发 | PREROUTING --> FORWARD --> POSTROUTING |
数据包的处理过程,这张图画的很好:
-
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP通过路由判断是否需要转送出去;
-
如果数据包就是进入本机的,数据包就会沿着图向上移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它;
-
离开本机的数据包,比如本机上运行的程序发送出的数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出;
-
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
iptables工具通过table实现数据包管理,每张表又包含不同的Chain(也就是上面反复提到的钩子函数)。目前Linux通常主要通过3张表就可以实现管理:filter,nat,mangle(还有基本用不到的raw和security)。
filter是防火墙规则中默认的表。这个表包含内置的Chain有INPUT、FORWARD和OUTPUT。从上面数据流程的分析可以看出,这个表涉及到的钩子函数可以实现管理本机数据包的进出。
nat表内含3条Chain:PREROUTING,OUTPUT和POSTROUTING,用于管理后端内部主机访问internet时的地址转换。
mangle表在2.4.17版本的系统内核为止仅支持PREROUTING和OUTPUT俩个钩子,从2.4.18开始支持所有5个钩子函数。用于实现自定义的规则处理方式。
通用语法
iptables [-t table] Option chain condition -j target_name
-t table: filter,nat,mangle等,默认filter Option: Chain管理 -N:new, 自定义一条新的规则链 -X:delete,删除自定义的空的规则链 -P:policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢弃 Chain查询 -L:list, 列出指定链上的所有规则,本选项须置后 -n:numberic,以数字格式显示地址和端口号 -v:verbose,详细信息 -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值 --line-numbers:显示规则的序号 rule管理: -A:append,追加 -I:insert, 插入,要指明插入至的规则编号,默认为第一条 -D:delete,删除;(1) 指明规则序号;(2) 指明规则本身 -R:replace,替换指定链上的指定规则 -F:flush,清空指定链的规则 -Z:zero,计数器置零 chain: 指定链 condition: 匹配条件 -j target_name: 指定动作
一般开局
# 查看当前默认表的规则 iptables -t filter -nvL # 清空现有规则 # all the chains in the table if none is given iptables -F,--flush [chain] # 清除自定义的空规则 iptables -X # 清0计数器 iptables -Z # 保存规则 service iptables save # # 初始化完成,此时的配置文件为空,且默认全部放行。开始配置 # # 首先配置默认filter表的链策略 # 一般的业务机器,凡是收到我们未明确指定的数据包,均丢弃 # 注意!!开局是本地访问时使用,不适合远程ssh执行,因为下一步操作会马上导致远程ssh断开 # 远程ssh时,可以预先放行22端口后再执行链策略初始化,或者直接写入配置文件后重启服务即可。 # 配置文件位置往往不固定,推荐手动find # 再次声明,下面这条命令远程执行非常危险! # 就算是关闭防火墙,这个命令也会打开防火墙并执行阻止策略 iptables -P INPUT DROP iptables -P FORWARD DROP #iptables -P OUTPUT DROP iptables -P OUTPUT ACCEPT # 根据业务需求,开始追加新规则到链尾 # 允许本机正常通信 iptables -A INPUT -i lo -j ACCEPT # 放行外界进入的22端口的请求 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行ping iptables -A INPUT -p icmp -j ACCEPT # 重启服务生效 service iptables save service iptables restart # 可参考上述做法,放行其他端口的业务 # 要是非常严格的机器,为提高安全级别,初始化链策略时,OUTPUT也可以丢弃 # 此时,要实行来回方向都放行 # 如下方是22端口的来回放行做法 # 在默认filter表的INPUT链上,接收从eth0进入的目标端口为22的TCP数据包,允许的数据包状态为刚刚发起连接或已建立连接 #iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # 在默认filter表的OUTPUT链上,允许离开eth0的源端口为22的TCP数据包,允许的数据包状态为已建立连接 #iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # (不推荐)假如于默认链策略为接收时,需要在末尾拒绝所有其他数据包 # iptables -A INPUT -j DROP # # 特例,OPEN VPN端口NAT转发(需要提前开启系统级数据转发) # # 接受对VPN端口的数据包 iptables -A INPUT -p TCP --dport 1194 -j ACCEPT # 来自VPN内网的数据包,通过SNAT将源IP转换为网卡IP转发出去 iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE service iptables save service iptables restart # 查看当前状态 iptables --list iptables -t nat --list
评论列表,共 0 条评论
暂无评论