iptables是设置包过滤规则的工具,真正提供过滤功能的是Netfilter。
Netfilter
在Linux内核设立检查点(hook),供核心模块注册使用,这样便可对网络层中每一个通过检查点的包进行过滤,决定要允许通过或予以丢弃。
由于内核的子系统位于系统保护区,用户无法直接操作,Netfilter便提供一个用户态空间下的工具iptables,利用iptables便可以在各个检查点建立规则,对包进行过滤。
ubuntu下没有关闭iptables的方法,只能通过清除规则来完成,不过在清除规则之前要确保所有表的所有链的默认处置都是ACCEPT,免得连不上机器。
iptables
iptables内置有3个表(table),分别是filter、nat、mangle。各表内置有若干个链(chain)。
对每一个报文,iptables依次测试每一条规则,看报文与规则是否相匹配。一旦找到一条匹配的规则,就根据此规则中指定的行动,对报文进行处置,而对后面的规则不再进行测试。
filter表
主要用来过滤包,是iptables默认的规则表。filter表内置的链:
链 说明
INPUT 过滤目的地是本机的包
FORWARD 不是本机产生的包,目的地是其他主机
OUTPUT 过滤本机产生的包
nat表
主要作用是包地址转换。nat表内置的链有:
链 说明
PREROUTING 包到达网络接口时,改写其目的地址
OUTPUT 改写本机产生的包的目的地址
POSTROUTING 包要离开主机前,改写其来源地址
mangle表
主要作用是修改包的表头和内容,如改变MARK、TOS和TTL等。内置的链有:
链 说明
PREROUTING 进入防火墙后、路由判断前,对包进行修改
INPUT 包经过路由判断后,在本机进程接收到它之前,对包进行修改
OUTPUT 本机产生的包,在决定包目的地址之后,对包进行修改
FORWARD 路由判断之后,要到另一个接口之前,对包进行修改
POSTROUTING 路由判断之后,要离开主机之前,对包进行修改
iptables语法
iptables的语法由3部分组成:iptables命令本身、条件判断、对包的处置方式(称为target)。
注意:所有链 名必须大写,表名必须小写,动作必须大写,匹配必须小写
iptables的主要参数
-A
:向规则链中添加一个规则,默认被添加到末尾。-T
:指定要操作的表,默认是filter。-D
:从规则链中删除规则,可以指定序号或者匹配的规则来删除。例如iptables -D INPUT 3
(按号码匹配)将删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)-R
:进行规则替换。例如iptables -R INPUT 9 -j ACCEPT
将原来编号为 9 的规则内容替换为“-j ACCEPT”。-I
:插入一条规则,默认被插入到首部。-F
:清空所选的链,重启后恢复。-P
:设置某个链的默认规则。如iptables -P INPUT DROP
将filter表的INPUT链的默认规则设为DROP。-N
:新建用户自定义的规则链。-X
:删除用户自定义的规则链。-p
:对比协议,可以是tcp, udp, icmp
等,也可以是数字的协议号。-s
:指定源地址。-d
:指定目的地址。-i
:进入接口。-o
:流出接口。-j
:采取的动作。可以是ACCEPT, DROP, SNAT, DNAT, MASQUERADE
。-sport port
:源端口。-dport port
:目的端口,端口必须和协议一起配合使用。--tcp-flags
:对比TCP状态,可以有:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等,还可以使用ALL、NONE进行对比。例如:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
。--icmp-type
:对比ICMP的类型编号,可以使用代码或数字编号进行对比。如:iptables -A INPUT -p icmp --icmp-type 8
。-m limit --limit
:用来对比某段时间内包的平均流量。iptables -A INPUT -m limit --limit 3/sec
用来对比每秒平均流量是否超过一次3个包。-m state --state
:根据状态进行对比。如iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许已建立的连接接收数据。
在添加的规则时,REJECT
(拒绝)目标和 DROP
(放弃)目标这两种行动有所不同。REJECT
会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused
的错误消息。DROP
会放弃分组,而对 telnet 用户不发出任何警告。
保存配置
机器重启后,iptables中的配置信息会被清空。iptables-save
和iptables-restore
是用来保存和恢复设置的。 可以在/etc/network/interfaces文件中添加2行:
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules