iptables 基础小结

发布于 2018-02-08  383 次阅读


规则查询

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:指定对应的匹配算法,可用算法为 bm、kmp,此选项为必需选项

--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:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有 second、minute 、hour、day

示例:

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

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

"令牌桶"算法

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