实例:
链基本操作:
[root@rh34 root]# iptables -L -n
(列出表/链中的所有规则,包过滤防火墙默认使用的是filter表,因此使用此命令将列出filter表中所有内容,-n参数可加快显示速度,也可不加-n参数。)
[root@rh34 root]# iptables -F
(清除预设表filter中所有规则链中的规则)
[root@rh34 root]# iptables -X
(清除预设表filter中使用者自定义链中的规则)
[root@rh34 root]# iptables -Z
(将指定链规则中的所有包字节计数器清零)
------------------------------------------------------------
设置链的默认策略,默认允许所有,或者丢弃所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我们在不同方向设置默认允许策略,若丢弃则应是DROP,严格意义上防火墙应该是DROP然后再允许特定)
---------------------------------------------------------------
向链中添加规则,下面的例子是开放指定网络接口(信任接口时比较实用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用户自定义链:
[root@rh34 root]# iptables -N brus
(创建一个用户自定义名叫brus的链)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此链中设置了一条规则)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默认的INPUT链添加一条规则,使所有包都由brus自定义链处理)
----------------------------------------------------------------
基本匹配规则实例:
匹配协议:
iptables -A INPUT -p tcp
(指定匹配协议为TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的协议)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主机)
iptables -A INPUT -s 192.168.1.0/24
(匹配网络)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主机)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的网络)
匹配接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某个指定的接口)
iptables -A FORWARD -o ppp+
(匹配所有类型为ppp的接口)
匹配端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配单一指定源端口)
iptables -A INPUT -p ucp --dport 53
(匹配单一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定端口以外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口范围,这里我们实现的是22到80端口 )
---------------------------------------------------------------------------------
指定IP碎片的处理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
设置扩展的规测匹配:
(希望获得匹配的简要说明,可使用: iptables -m name_of_match --help)
多端口匹配扩展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多个源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多个目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多个端口,无论是源还是目的端口)
-----------------------------------------------------------------------------
TCP匹配扩展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的标志都要被检查,但是只有设置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的标志都被检查,但是只有设置了SYN和ACK的才匹配)
iptables -p tcp --syn
(选项--syn是以上的一种特殊情况,相当于“--tcp-flags SYN,RST,ACK SYN”的简写)
--------------------------------------------------------------------------------
limit速率匹配扩展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小时允许通过300个数据包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定触发时间的值(默认为5),用来比对瞬间大量数据包的数量。)
(上面的例子用来比对一次同时涌入的数据包是否超过十个,超过此上限的包将直接被丢弃)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假设均匀通过,平均每分钟3个,那么触发值burst保持为3。如果每分钟通过的包的数目小于3,那么触发值busrt将在每个周期(若每分钟允许通过 3个,则周期数为20秒)后加1,但最大值为3。每分钟要通过的包数量如果超过3,那么触发值busrt将减掉超出的数值,例如第二分钟有4个包,那么触发值变为2,同时4个包都可以通过,第三分钟有6个包,则只能通过5个,触发值busrt变为0。之后,每分钟如果包数量小于等于3个,则触发值 busrt将加1,如果每分钟包数大于3,触发值busrt将逐渐减少,最终维持为0)
(即每分钟允许的最大包数量等于限制速率(本例中为3)加上当前的触发值busrt数。任何情况下,都可以保证3个包通过,触发值busrt相当于是允许额外的包数量)
---------------------------------------------------------------------------------
基于状态的匹配扩展(连接跟踪):
每个网络连接包括以下信息:源和目的地址、源和目的端口号,称为套接字对(cocket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些叫做状态(stateful)。能够监测每个连接状态的防火墙叫做状态宝过滤防火墙,除了能完成普通包过滤防火墙的功能外,还在自己的内存中维护一个跟踪连接状态的表,所以拥有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一个用逗号隔开的的列表,用来指定的连接状态可以有以下4种:
NEW:该包想要开始一个连接(重新连接或将连接重定向)。
RELATED:该包属于某个已经建立的连接所建立的新连接。例如FTP的数据传输连接和控制连接之间就是RELATED关系。
ESTABLISHED:该包属于某个已经建立的连接。
INVALID:该包不匹配于任何连接,通常这些包会被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有从非eth0接口来的连接请求包)
下面是一个被动(Passive)FTP连接模式的典型连接跟踪
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一个主动(Active)FTP连接模式的典型连接跟踪
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日志记录:
格式为: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
链基本操作:
[root@rh34 root]# iptables -L -n
(列出表/链中的所有规则,包过滤防火墙默认使用的是filter表,因此使用此命令将列出filter表中所有内容,-n参数可加快显示速度,也可不加-n参数。)
[root@rh34 root]# iptables -F
(清除预设表filter中所有规则链中的规则)
[root@rh34 root]# iptables -X
(清除预设表filter中使用者自定义链中的规则)
[root@rh34 root]# iptables -Z
(将指定链规则中的所有包字节计数器清零)
------------------------------------------------------------
设置链的默认策略,默认允许所有,或者丢弃所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我们在不同方向设置默认允许策略,若丢弃则应是DROP,严格意义上防火墙应该是DROP然后再允许特定)
---------------------------------------------------------------
向链中添加规则,下面的例子是开放指定网络接口(信任接口时比较实用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用户自定义链:
[root@rh34 root]# iptables -N brus
(创建一个用户自定义名叫brus的链)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此链中设置了一条规则)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默认的INPUT链添加一条规则,使所有包都由brus自定义链处理)
----------------------------------------------------------------
基本匹配规则实例:
匹配协议:
iptables -A INPUT -p tcp
(指定匹配协议为TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的协议)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主机)
iptables -A INPUT -s 192.168.1.0/24
(匹配网络)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主机)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的网络)
匹配接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某个指定的接口)
iptables -A FORWARD -o ppp+
(匹配所有类型为ppp的接口)
匹配端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配单一指定源端口)
iptables -A INPUT -p ucp --dport 53
(匹配单一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定端口以外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口范围,这里我们实现的是22到80端口 )
---------------------------------------------------------------------------------
指定IP碎片的处理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
设置扩展的规测匹配:
(希望获得匹配的简要说明,可使用: iptables -m name_of_match --help)
多端口匹配扩展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多个源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多个目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多个端口,无论是源还是目的端口)
-----------------------------------------------------------------------------
TCP匹配扩展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的标志都要被检查,但是只有设置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的标志都被检查,但是只有设置了SYN和ACK的才匹配)
iptables -p tcp --syn
(选项--syn是以上的一种特殊情况,相当于“--tcp-flags SYN,RST,ACK SYN”的简写)
--------------------------------------------------------------------------------
limit速率匹配扩展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小时允许通过300个数据包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定触发时间的值(默认为5),用来比对瞬间大量数据包的数量。)
(上面的例子用来比对一次同时涌入的数据包是否超过十个,超过此上限的包将直接被丢弃)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假设均匀通过,平均每分钟3个,那么触发值burst保持为3。如果每分钟通过的包的数目小于3,那么触发值busrt将在每个周期(若每分钟允许通过 3个,则周期数为20秒)后加1,但最大值为3。每分钟要通过的包数量如果超过3,那么触发值busrt将减掉超出的数值,例如第二分钟有4个包,那么触发值变为2,同时4个包都可以通过,第三分钟有6个包,则只能通过5个,触发值busrt变为0。之后,每分钟如果包数量小于等于3个,则触发值 busrt将加1,如果每分钟包数大于3,触发值busrt将逐渐减少,最终维持为0)
(即每分钟允许的最大包数量等于限制速率(本例中为3)加上当前的触发值busrt数。任何情况下,都可以保证3个包通过,触发值busrt相当于是允许额外的包数量)
---------------------------------------------------------------------------------
基于状态的匹配扩展(连接跟踪):
每个网络连接包括以下信息:源和目的地址、源和目的端口号,称为套接字对(cocket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些叫做状态(stateful)。能够监测每个连接状态的防火墙叫做状态宝过滤防火墙,除了能完成普通包过滤防火墙的功能外,还在自己的内存中维护一个跟踪连接状态的表,所以拥有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一个用逗号隔开的的列表,用来指定的连接状态可以有以下4种:
NEW:该包想要开始一个连接(重新连接或将连接重定向)。
RELATED:该包属于某个已经建立的连接所建立的新连接。例如FTP的数据传输连接和控制连接之间就是RELATED关系。
ESTABLISHED:该包属于某个已经建立的连接。
INVALID:该包不匹配于任何连接,通常这些包会被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已经建立的连接或由已经建立的连接所建立的新连接。即匹配所有的TCP回应包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有从非eth0接口来的连接请求包)
下面是一个被动(Passive)FTP连接模式的典型连接跟踪
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一个主动(Active)FTP连接模式的典型连接跟踪
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日志记录:
格式为: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"