规则查询

iptables -t 表名 -L
查看对应表的所有规则,-t 选项指定要操作的表,省略"-t 表名"时,默认表示操作 filter 表,-L 表示列出规则,即查看规则
iptables -t 表名 -L 链名
查看指定表的指定链中的规则
iptables -t 表名 -v -L
查看指定表的所有规则,并且显示更详细的信息(更多字段),-v 表示 verbose,表示详细的,冗长的,当使用 -v 选项时,会显示出"计数器"的信息,一般简写为 iptables -t 表名 -vL
iptables -t 表名 -n -L
表示查看表的所有规则,并且在显示规则时,不对规则中的 IP 或者端口进行名称反解,-n 选项表示不解析 IP 地址,一般简写为iptables -t 表名 -nL
iptables --line-number -t 表名 -L
表示查看表的所有规则,并且显示规则的序号,--line-number 选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为 --line,注意,简写后仍然是两条横杠,仍然是长选项
iptables -t 表名 -v -x -L
表示查看表中的所有规则,并且显示更详细的信息(-v 选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x 选项表示显示计数器的精确值,一般简写为 iptables -t 表名 -vxL
实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以 filter 表为例
iptables --line -t filter -nvxL
也可以只查看某张表中的某条链,此处以 filter 表的 INPUT 链为例
iptables --line -t filter -nvxL INPUT

添加规则

注意点:添加规则时,规则的顺序非常重要

在指定表的指定链的尾部添加一条规则,-A 选项表示在对应链的末尾添加规则,省略 -t 选项时,表示默认操作 filter 表中的规则
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作
示例:iptables -t filter -A INPUT -s 192.168.1.100 -j DROP
在指定表的指定链的首部添加一条规则,-I 选项表示在对应链的开头添加规则
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作
示例:iptables -t filter -I INPUT -s 192.168.1.100 -j ACCEPT
在指定表的指定链的指定位置添加一条规则
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
示例:iptables -t filter -I INPUT 5 -s 192.168.1.100 -j REJECT
设置指定表的指定链的默认策略(默认动作),并非添加规则
命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT
上例表示将filter表中FORWARD链的默认策略设置为ACCEPT

删除规则

注意点:如果没有保存规则,删除规则时请慎重

按照规则序号删除规则,删除指定表的指定链的指定规则,-D 选项表示删除对应链中的规则
命令语法:iptables -t 表名 -D 链名 规则序号
示例:iptables -t filter -D INPUT 3
上述示例表示删除filter表中INPUT链中序号为3的规则
按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作
示例:iptables -t filter -D INPUT -s 192.168.1.100 -j DROP
上述示例表示删除 filter 表中 INPUT 链中源地址为 192.168.1.100 并且动作为 DROP 的规则
删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思
命令语法:iptables -t 表名 -F 链名
示例:iptables -t filter -F INPUT
删除指定表中的所有规则,执行时需三思
命令语法:iptables -t 表名 -F
示例:iptables -t filter -F

修改规则

注意点:如果使用 -R 选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源 IP,目标 IP

修改指定表中指定链的指定规则,-R 选项表示修改对应链中的规则,使用 -R 选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.100 -j ACCEPT
上述示例表示修改 filter 表中 INPUT 链的第 3 条规则,将这条规则的动作修改为 ACCEPT, -s 192.168.1.100 为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为 0.0.0.0/0
其他修改规则的方法:先通过编号删除规则,再在原编号位置添加一条规则
修改指定表的指定链的默认策略(默认动作),并非修改规则,可以使用如下命令
命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT
上例表示将 filter 表中 FORWARD 链的默认策略修改为 ACCEPT

保存规则

保存规则命令如下,表示将 iptables 规则保存至 /etc/sysconfig/iptables 文件中,如果对应的操作没有保存,那么当重启 iptables 服务以后,规则会被还原到没做操作之前
service iptables save
注意点:centos7 中使用默认使用 firewalld,如果想要使用上述命令保存规则,需要安装 iptables-services
也可使用如下方法保存规则
iptables-save > /etc/sysconfig/iptables
可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则
iptables-restore < /etc/sysconfig/iptables

基本匹配条件

-s 用于匹配报文的源地址,可以同时指定多个源地址,每个 IP 之间用逗号隔开,也可以指定为一个网段
iptables -t filter -I INPUT -s 192.168.1.100,192.168.1.101 -j DROP
iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT

-d 用于匹配报文的目标地址,可以同时指定多个目标地址,每个 IP 之间用逗号隔开,也可以指定为一个网段
iptables -t filter -I OUTPUT -d 192.168.1.100,192.168.1.101 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

-p 用于匹配报文的协议类型,可以匹配的协议类型 tcp、udp、udplite、icmp、esp、ah、sctp 等(centos7 中还支持 icmpv6、mh)
iptables -t filter -I INPUT -p tcp -s 192.168.1.100 -j ACCEPT
iptables -t filter -I INPUT ! -p udp -s 192.168.1.100 -j ACCEPT

-i 用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在 OUTPUT 链与 POSTROUTING 链中不能使用此选项
iptables -t filter -I INPUT -p icmp -i eth1 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth1 -j DROP

-o 用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在 INPUT 链与 PREROUTING 链中不能使用此选项
iptables -t filter -I OUTPUT -p icmp -o eth1 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth1 -j DROP

扩展匹配条件

tcp 扩展模块
常用的扩展匹配条件如下:

-p tcp -m tcp --sport 用于匹配 tcp 协议报文的源端口,可以使用冒号指定一个连续的端口范围
-p tcp -m tcp --dport 用于匹配 tcp 协议报文的目标端口,可以使用冒号指定一个连续的端口范围
iptables -t filter -I OUTPUT -d 192.168.1.100 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.100 -p tcp -m tcp ! --sport 22 -j ACCEPT

multiport 扩展模块
常用的扩展匹配条件如下:

-p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
iptables -t filter -I OUTPUT -d 192.168.1.100 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.100 -p tcp -m multiport --dports 22,80:88 -j REJECT

iprange 模块
指定"一段连续的 IP 地址范围",用于匹配报文的源地址或者目标地址
包含的扩展匹配条件如下

  • --src-range:指定连续的源地址范围
  • --dst-range:指定连续的目标地址范围
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.10-192.168.1.100 -j DROP
iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.10-192.168.1.100 -j DROP
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.10-192.168.1.100 -j DROP

string 模块
指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件
常用扩展匹配条件如下

  • --algo:指定对应的匹配算法,可用算法为 bmkmp,此选项为必需选项
  • --string:指定需要匹配的字符串
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "xy" -j REJECT
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "xy" -j REJECT

time 模块
根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件
常用扩展匹配条件如下

  • --timestart:用于指定时间范围的开始时间,不可取反
  • --timestop:用于指定时间范围的结束时间,不可取反
  • --weekdays:用于指定"星期几",可取反
  • --monthdays:用于指定"几号",可取反
  • --datestart:用于指定日期范围的开始日期,不可取反
  • --datestop:用于指定日期范围的结束时间,不可取反
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

connlimit 模块
对连接数量进行限制
常用的扩展匹配条件如下

  • --connlimit-above:单独使用此选项时,表示限制每个 IP 的链接数量
  • --connlimit-mask:此选项不能单独使用,在使用 --connlimit-above 选项时,配合此选项,则可以针对"某类 IP 段内的一定数量的 IP "进行连接数量的限制
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT

limit 模块
对"报文到达速率"进行限制
常用的扩展匹配条件如下

  • --limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量
  • --limit:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有 secondminutehourday

注意,如下两条规则需配合使用

iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT

"令牌桶"算法

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。


文章作者: Runfa Li
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Linux 小白鼠
Linux Linux iptables 防火墙
觉得文章不错,打赏一点吧,1分也是爱~
打赏
微信 微信
支付宝 支付宝