语法规则
一条标准的 iptables
命令应该包含这么几部分:
规则表
对于规则表,常用选项:
-t
– 指定要使用到的规则表
规则链
对于规则链,常用选项:
-L
– 查看指定规则链中的所有规则-F
– 清空规则,相当于逐个删除所有规则-A
– 指定规则链,在当前规则链的尾部添加规则-I
– 指定规则链,在当前规则链的头部添加规则-D
– 删除规则-P
– 更改规则链默认的执行动作。只能是 DROP 或 ACCEPT-X
– 清空自定义规则链,不太常用
匹配属性
匹配属性也划分为 通用匹配、隐式匹配、显式匹配
通用匹配
所谓通用匹配,即不依赖其他条件或扩展,可以直接被使用的匹配。
常用选项:
-p
– 指定协议名-s
– 指定源地址-d
– 指定目标地址-i
– 指定入站网卡-o
– 指定出站网卡
示例:
Shell > iptables -t filter -A FORWARD -s 192.168.1.100 -j REJECT
Shell > iptables -t filter -I INPUT -s 10.1.1.0/24 -j DROP
Shell > iptables -t filter -I INPUT -p icmp -j DROP
Shell > iptables -t filter -A INPUT -i eth0 -s 192.168.1.0/24 -j DROP
Shell > iptables -t filter -A INPUT -i eth0 -s 192.168.100.0/24 -j DROP
隐式匹配
所谓隐式匹配,即以特定的条件作为使用的前提,比如端口、特定协议等。
常用选项:
--sport
– 指定源端口,可以指定单个端口,也可以指定多个连续端口(使用冒号),比如--sport 80
和--sport 2:20
--dport
– 指定目标端口--icmp-type
– 指定 icmp 的类型(type)与代码(code)
众所周知,ICMP 指的是互联网控制报文协议,它是 TCP/IP 协议族中网络层的其中一个协议。听名字就知道,该协议主要作用是做探测,比如探测网络是否通、主机是否可达、路由是否可用等。
人们根据应用场景的不同,将 ICMP 报文划分了以下的类型与代码:
示例:
# 往 filter 规则表中的 FORWARD 链的尾部添加规则
## 当有源地址来源于 192.168.4.0/24 这个网段的、使用 udp 协议、目标端口是 53 的报文往当前主机做转发,允许通过
Shell > iptables -t filter -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
# 往 filter 规则表中的 INPUT 链的头部添加规则
## 使用 tcp 协议且目标端口是20至21的报文往当前主机入站时,允许通过
Shell > iptables -t filter -I INPUT -p tcp -dport 20:21 -j ACCEPT
# 往 filter 规则表中的 INPUT 链的尾部添加规则
## 若有入站报文想探测本主机是否可达的(ping),则允许通过
Shell > iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT
显式匹配
显式匹配需要明确指定扩展模块。
常用的选项有:
-m
– 指定要使用的扩展模块
常用模块有:
-
multiport – 多端口匹配,需要首先指定使用的协议是 tcp 还是 udp。启用该模块,则还可以使用
--sports
和/或--dports
选项。# 往 filter 规则表的 INPUT 链的头部添加规则 ## 若有使用 tcp 协议且目标端口是50以及100至200 的入站报文,则允许通过 Shell > iptables -t filter -I INPUT -m multiport -p tcp --dports 50,100:200 -j ACCEPT
-
iprange – IP 地址的范围匹配,连续的符号为 "-"。若启用该模块,则还可以选择使用
--src-range
和/或--dst-range
选项# 往 filter 规则表的 FORWARD 链的尾部添加规则 ## 源地址是 192.168.100.5 至 192.168.100.20 的报文往当前主机做转发时,允许通过 Shell > iptables -t filter -A FORWARD -m iprange --src-range 192.168.100.5-192.168.100.20 -j ACCEPT
-
mac – 源 MAC 地址的匹配,MAC 的格式必须是冒号形式。若启用该模块,则还可以选择使用
--mac-source
选项Shell > iptables -t filter -A INPUT -m mac --mac-source 58:85:a2:03:bd:eb -j ACCEPT
-
state – 根据状态进行匹配,状态包括 NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED,若要指定多个状态,请用逗号隔开。
# NEW 表示新连接;ESTABLISHED 表示已经建立的连接;RELATED 表示有关联的连接;INVALID 表示无法识别的连接;UNTRACKED 表示为跟踪的连接 Shell > iptables -t filter -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
在使用该模块时请注意!所有已经建立的连接都应该放行;所有新连接都应该被严格检查;所有无法识别的连接都应该拒绝。
-
sting – 根据应用层中的字符串进行匹配。启用该模块,您还可以使用
--string
和/或--hex-string
和/或--algo
选项。Shell > iptables -t filter -A INPUT -m string --algo kmp --string "porn" -j DROP
-
time – 基于时间或时间段做访问控制。启用该模块,则还可以使用
--datestart
和/或--datestop
和/或--timestart
和/或--timestop
和/或--monthdays
和/或--weekdays
选项。相应的写法格式为:--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]
– 指定开始的时间日期--datestop YYYY[-MM][-DD[Thh[:mm[:ss]]]]
– 指定结束的时间日期--timestart hh:mm[:ss]
– 指定开始时间--timestop hh:mm[:ss]
– 指定结束时间--monthdays day[,day...]
– 指定月中的特定天,值为1至31,对于没有31的月份,值31不生效。--weekdays day[,day]|1-7
– 指定星期当中的特定天或星期几(数字 1 表示星期一,数字 7 表示星期日)
# 将月份的天与星期组合使用。这两个条件是和的关系,只有同时满足才生效 Shell > iptables -t filter -A INPUT -m time --monthdays 15,16,17,18,19,20 --weekdays 1,5 -j ACCEPT
-
connlimit – 连接数限制。启用该模块,您还可以使用
--connlimit-upto
和/或--connlimit-above
选项,前者表示小于等于,后者表示大于等于。Shell > iptables -t filter -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 5 -j DROP
-
limit – 限制数据包的数量。启用该模块,您还可以使用
--limit
和--limit-burst
选项,它们的用法为:--limit rate[/second|/minute|/hour|/day]
– 单位时间内的最大平均数量--limit-burst number
– 峰值限制,即要匹配的最大初始数据包数
Shell > iptables -t filter -I INPUT -d 192.168.100.21 -p icmp --icmp-type 8 -m limit --limit 20/second --limit-burst 5 -j ACCEPT
关于模块
iptables 所有支持的模块可通过以下命令查看:
Shell > rpm -ql iptables | grep -i -E *\.so
有时您使用 iptables
的扩展模块时,可能会出现内核未加载模块的情况,这里列出对照关系供大家参考。
iptables 扩展模块名称 | Linux 内核模块 |
---|---|
multiport | xt_multiport |
iprange | xt_iprange |
mac | xt_mac |
state | xt_state |
string | xt_string |
time | xt_time |
connlimit | xt_conlimit |
limit | xt_limit |
执行的动作
可以有:
- DROP(丢弃)
- ACCEPT(允许)
- QUEUE(队列)
- RETURN(返回)
- MASQUERADE(地址伪装)
- REJECT(拒绝)
- LOG(日志)
其他未提到的动作请参阅 man 8 iptables-extensions
使用技巧与注意事项
以下五个点需要注意:
- 规则链和要规则表对应,你不能说我用 nat 表,而使用 INPUT 链,这是不行的。由前文《防火墙01—基本概念》可知,每个规则表都有自己对应的规则链。
- 不指定 执行动作 时,则使用默认动作(每个规则链都有自己的默认动作,一般是 ACCEPT )。
- 不指定 规则表 时,则默认使用 filter 表。
- 不指定 规则链 时,则默认是使用所有链。命令
iptables -L
表示查看 filter 表的所有规则链。 - 执行动作的值必须大写
我们来看具体的例子:
# 不指定规则表,则默认使用 filter 表
Shell > iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 查看 mangle 表的所有规则链
Shell > iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
如上面命令所示,每个规则表下面的规则链都有默认的执行动作,通常都是 ACCEPT。
那么这个默认的执行动作可以改吗?可以,使用 -P
选项,如下所示:
Shell > iptables -t filter -P FORWARD DROP
Shell > iptables -t filter -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
我们再来看如何删除规则:
# 往头部添加第一条规则
Shell > iptables -t filter -I INPUT -s 192.168.100.20 -j ACCEPT
# 再往头部添加一条规则,此时这条规则位于最顶端
Shell > iptables -t filter -I INPUT -s 192.168.100.30 -j ACCEPT
Shell > iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.100.30 anywhere
ACCEPT all -- 192.168.100.20 anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
若我们需要删除 192.168.100.20 这条规则,直接指定数字 2 即可,如下:
Shell > iptables -t filter -D INPUT 2
Shell > iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.100.30 anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
若您需要完全解除 iptables 的限制,可使用 -F
选项(生产环境下慎用):
# 这将会把 filter 下的三个规则链里的规则全部清空
Shell > iptables -t filter -F