iptables详解

Posted bluer丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables详解相关的知识,希望对你有一定的参考价值。

5链
INPUT,OUTPUT,PREROUTING,FORWARD,POSTROUTING    
                
                  INPUT                  OUTPUT
                    ^                      ^
                    |                      |
                    |                      |
-->PREROUTING-->是否为本机-->FORWARD-->POSTROUTING-->其他主机

所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

4表
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw

但是我们知道,iptables为我们定义了4张”表”,当他们处于同一条”链”时,执行的优先级如下。
优先级次序(由高而低):
raw –> mangle –> nat –> filter

查询规则
filter表
iptables -t filter -L
使用-t选项,指定要操作的表,使用-L选项,查看-t选项对应的表的规则,-L选项的意思是
PREROUTING关卡天生就没有过滤的能力
只查看指定表中的指定链的规则,比如,我们只查看filter表中INPUT链的规则,示例如下(注意大小写)。
iptables -L INPUT

iptables -vL INPUT  #查看更详细的信息  各个字段如下:
pkts:对应规则匹配到的报文的个数。
bytes:对应匹配到的报文包的大小总和。
target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。
prot:表示规则对应的协议,是否只针对某些协议应用此规则。
opt:表示规则对应的选项。
in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。
out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。
source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。
destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

iptables -vnL INPUT    #显示为IP

iptables --line-number -nvL INPUT   #加编号

iptables --line-number -nvxL INPUT  #查看详细
[root@localhost ~]# iptables --line-number -nvxL INPUT
Chain INPUT (policy ACCEPT 7146 packets, 1335040 bytes)
num      pkts      bytes target     prot opt in     out     source               destination         
1           3      180 ACCEPT     tcp  --  *      *       192.168.100.2        0.0.0.0/0            tcp dpt:9200
policy表示当前链的默认策略  
packets表示当前链(上例为INPUT链)默认策略匹配到的包的数量,0 packets表示默认策略匹配到0个包
bytes表示当前链默认策略匹配到的所有包的大小总和

在iptables的世界中,最常用的匹配条件是报文的”源地址”、”目标地址”、”源端口”、”目标端口”等,在iptables的世界中,最常用的动作有ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)


规则编写:
iptables -t filter -I INPUT -s 192.168.100.4 -j DROP
使用 -t选项指定了要操作的表,此处指定了操作filter表,与之前的查看命令一样,不使用-t选项指定表时,默认为操作filter表。
使用-I选项,指明将”规则”插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则之意。
使用-s选项,指明”匹配条件”中的”源地址”,即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址。
使用-j选项,指明当”匹配条件”被满足时,所对应的动作,上例中指定的动作为DROP,在上例中,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)。
再次查看filter表中的INPUT链,发现规则已经被添加了,在iptables中,动作被称之为”target”,所以,上图中taget字段对应的动作为DROP。

使用-A选项,表示在对应的链中”追加规则”,-A为append之意,只是-A表示在链的尾部追加规则
而之前示例中使用的-I选项则表示在链中”插入规则”,-I表示在链的首部插入规则而已。
在上述规则后追加一条
iptables -t filter -A INPUT -s 192.168.100.4 -j ACCEPT
在192.168.100.4依然是无ping通的
然后我们在添加至INPUT链的最前面试试
iptables -t filter -I INPUT -s 192.168.100.4 -j ACCEPT
在192.168.100.4可以ping通了

查看规则编号
iptables --line-number -nvxL INPUT
在指定编号创建规则  
iptables -t filter -I INPUT 2 -s 192.168.100.5 -j DROP    #新建规则编号为2

删除规则:
方法一:根据编号删除
iptables --line-number -nvxL INPUT   #查询编号
iptables -t filter -D INPUT 2        #删除第二条
使用了-t选项指定了要操作的表(没错,省略-t默认表示操作filter表),使用-D选项表示删除指定链中的某条规则,-D INPUT 3表示删除INPUT链中的第3条规则。
方法二:根据具体的匹配条件与动作删除规则
iptables -D INPUT -s 192.168.100.4 -j ACCEPT
删除中源地址为192.168.1.146,动作为ACCEPT的规则
全部删除:iptables -t 表名 -F  注意:强调,在没有保存iptables规则时,请勿随便清空链或者表中的规则,除非你明白你在干什么。

修改规则:
R选项修改指定的链中的规则,在修改规则时指定规则对应的编号即可(有坑,慎行),示例命令如下
例如将source为192.168.100.4的DROP改为REJECT
-R选项表示修改指定的链,使用-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的第一条规则的动作修改为REJECT
注意:上例中, -s选项以及对应的源地址不可省略,即使我们已经指定了规则对应的编号,但是在使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件
例中的命令没有使用-s指定对应规则中原本的源地址,那么在修改完成后,你修改的规则中的源地址会自动变为0.0.0.0/0(此IP表示匹配所有网段的IP地址),而此时,-j对应的动作又为REJECT,所以在执行上述命令时如果没有指明规则原本的源地址,那么所有IP的请求都被拒绝了(因为没有指定原本的源地址,当前规则的源地址自动变为0.0.0.0/0),如果你正在使用ssh远程到服务器上进行iptables设置,那么你的ssh请求也将会被阻断。
综上因素我们如果修改一条规则,尽量先删除再创建。如果一定使用费-R不要忘了指明规则原本对应的匹配条件。
我们还可以修改指定链的”默认策略”,没错,就是下图中标注的默认策略。
每张表的每条链中,都有自己的默认策略,我们也可以理解为默认”动作”。
iptables -t filter -P FORWORD DROP
使用-t指定要操作的表,使用-P选项指定要修改的链,上例中,-P FORWARD DROP表示将表中FORWRD链的默认策略改为DROP

保存规则:
在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”。
centos6中
使用”service iptables save”命令即可保存规则,规则默认保存在/etc/sysconfig/iptables文件中
如果你刚刚安装完centos6,在刚开始使用iptables时,会发现filter表中会有一些默认的规则,这些默认提供的规则其实就保存在/etc/sysconfig/iptables中。
当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。

centos7中
配置好yum源以后安装iptables-service
 yum install -y iptables-services
停止firewalld
 systemctl stop firewalld
禁止firewalld自动启动
 systemctl disable firewalld
启动iptables
 systemctl start iptables
将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
 systemctl enable iptables
就可以使用service iptables save了

其他通用方法:
还可以使用另一种方法保存iptables规则,就是使用iptables-save命令
使用iptables-save并不能保存当前的iptables规则,但是可以将当前的iptables规则以”保存后的格式”输出到屏幕上。
所以,我们可以使用iptables-save命令,再配合重定向,将规则重定向到/etc/sysconfig/iptables文件中即可。
iptables-save > /etc/sysconfig/iptables
我们也可以将/etc/sysconfig/iptables中的规则重新载入为当前的iptables规则,但是注意,未保存入/etc/sysconfig/iptables文件中的修改将会丢失或者被覆盖。
使用iptables-restore命令可以从指定文件中重载规则,示例如下
iptables-restore < /etc/sysconfig/iptables
再次提醒:重载规则时,现有规则将会被覆盖。

iptables的匹配条件
基本匹配条件:
原地址匹配:
指定源地址时,一次指定多个,用”逗号”隔开即可
iptables -t filter -I INPUT -s 192.168.100.5,192.168.100.6 -j DROP
上例中,一次添加了两条规则,两条规则只是源地址对应的IP不同,注意,上例中的”逗号”两侧均不能包含空格,多个IP之间必须与逗号相连。
除了能指定具体的IP地址,还能指定某个网段,示例如下
iptables -t filter -I INPUT -s 192.168.200/24 -j DROP
上例中192.168.200/24网段将全部被DROP
还可以对匹配条件取反,示例如下:
iptables -t filter -I INPUT ! -s 192.168.100.2 -j DROP
上例表示除去192.168.100.2其余的全部DROP
iptables -t filter -I INPUT ! -s 192.168.100.2 -j ACCEPT
此例子中在服务器192.168.100.2仍然能ping通的原因是虽然限制了除了192.168.100.2都ACCEPT但是并为有策略拒绝192.168.100.2
目标地址匹配:
例如我们一台机器有192.168.100.4,192.168.100.101两个IP我们拒绝192.168.100.3访问192.168.100.4但是不拒绝访问192.168.100.101
iptables -t filter -I INPUT -s 192.168.100.3 -d 192.168.100.4 -j DROP
此时我们在192.168.100.3 ping 192.168.100.4 无法ping通,但是可以ping通192.168.100.101
协议匹配:
我们可以使用-p选项,指定需要匹配的报文的协议类型。
iptables -t filter -I INPUT -s 192.168.100.3 -d 192.168.100.4 -p tcp -j DROP
拒绝192.168.100.3的tcp链接,通过测试我们发现从192.168.100.3ssh到192.168.100.4已经无法访问了(tcp)但是ping(icmp)可以通
-p的协议包括:tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
当不指定-p时,默认-p all
网卡匹配:
我们使用-i指定网卡
iptables -t filter -I INPUT -i enpOs8 -p icmp -j DROP
表示拒绝由网卡enpOs8流入的ping报文请求
-i选项是用于判断报文是从哪个网卡流入的,那么,-i选项只能用于上图中的PREROUTING链、INPUT链、FORWARD链,这是-i选项的特殊性,因为它只是用于判断报文是从哪个网卡流入的,所以只能在上图中”数据流入流向”的链中与FORWARD链中存在,而上图中的”数据发出流向”经过的链中,是不可能使用-i选项的,比如上图中的OUTPUT链与POSTROUTING链,他们都不能使用-i选项。
o选项,匹配报文将由哪块网卡流出,没错,-o选项与-i选项是相对的,-i选项用于匹配报文从哪个网卡流入,-o选项用于匹配报文将从哪个网卡流出。
-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。


扩展匹配条件:
端口匹配:
基本匹配条件我们可以直接使用,而如果想要使用扩展匹配条件,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行
iptables -t filter -I INPUT -s 192.168.100.3 -p tcp -m tcp --dport 22 -j DROP
扩展匹配条件–dport,指定了匹配报文的目标端口,如果外来报文的目标端口为本机的22号端口(ssh默认端口),则拒绝之,而在使用–dport之前,我们使用-m选项,指定了对应的扩展模块为tcp,也就是说,如果想要使用–dport这个扩展匹配条件,则必须依靠某个扩展模块完成,上例中,这个扩展模块就是tcp扩展模块,最终,我们使用的是tcp扩展模块中的dport扩展匹配条件。
-m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口。
-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫tcp。
一定要注意,如果这个扩展匹配条件所依赖的扩展模块名正好与-p对应的协议名称相同,那么则可省略-m选项,否则则不能省略-m选项,必须使用-m选项指定对应的扩展模块名称
iptables -I INPUT -s 192.168.100.3 -p tcp --sport 22 -j DROP
--sport表示从哪个端口出发,上述条件我们发现从本机到192.168.100.4ssh将无法访问
扩展匹配条件是可以取反的,同样是使用”!”进行取反,比如 “! –-dport 22″,表示目标端口不是22的报文将会被匹配到。
不管是–sport还是–dsport,都能够指定一个端口范围,比如,–dport 22:25表示目标端口为22到25之间的所有端口,即22端口、23端口、24端口、25端口,示例如下
iptables -t filter -I INPUT -s 192.168.100.3 -p tcp --dport 22:25 -j REJECT
我们还可以用:22 表示0-22端口 或者22:表示22-65535端口
tcp扩展模块的–sport或者–dport都可以指定一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助另一个扩展模块,”multiport”模块。

multiport扩展模块:
我们可以使用multiport模块的–sports扩展条件同时指定多个离散的源端口。
我们可以使用multiport模块的–dports扩展条件同时指定多个离散的目标端口。
iptables -t filter -I INPUT -s 192.168.100.3 -p tcp -m multiport --dport 22,80,3389 -j ACCEPT
表示开启22,80,3389多个端口
注意multiport扩展只能用于tcp协议与udp协议,即配合-p tcp或者-p udp使用。

iprange扩展模块:
如果我们需要指定一段连续的IP地址范围,可以使用iprange扩展模块。
iprange扩展模块中有两个扩展匹配条件可以使用
–src-range
–dst-range
iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.100.200-192.168.100.220 -j DROP
192.168.100.200-192.168.100.220段IP则DROP
string扩展模块:
string扩展以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
iptables -t filter -I INPUT -m string --algo bm --string "XXOO" -j REJECT
如果报文中包含"XXOO"就会拒绝进入本机
’-m string’表示使用string模块,’–algo bm’表示使用bm算法去匹配指定的字符串,’ –string “OOXX” ‘则表示我们想要匹配的字符串为”OOXX”
总结一下string模块的常用选项
–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但是我们必须指定一个。
–string:用于指定需要匹配的字符串。
time扩展模块:
通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件
我想要自我约束,每天早上9点到下午6点不能看网页
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
”-m time”表示使用time扩展模块,–timestart选项用于指定起始时间,–timestop选项用于指定结束时间。
只有周六日不能看网页,那么可以使用如下规则。
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
定只有周六日的早上9点到下午6点不能浏览网页
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time  --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7   -j REJECT
其它选项
-–monthdays
-–datestart  --datestop
connlimit扩展模块:
可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。
想要限制,每个IP地址最多只能占用两个ssh链接远程到server端,我们则可以进行如下限制。
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
我们还可以配合-–connlimit-mask选项,去限制”某类网段”的链接数量
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24  -j REJECT
--connlimit-mask 24 代表子网掩码是255.255.255.0 表示一个C段,最多两个ssh链接

limit扩展模块:
limit模块是对”报文到达速率”进行限制的。
如果我想要限制单位时间内流入的包的数量,就能用limit模块。
我们想要限制,外部主机对本机进行ping操作时,本机最多每6秒中放行一个ping包,那么,我们可以进行如下设置(注意,只进行如下设置有可能无法实现限制功能,请看完后面的内容)
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
”-p icmp”表示我们针对ping请求添加了一条规则(ping使用icmp协议),”-m limit”表示使用limit模块, “–limit 10/minute -j ACCEPT”表示每分钟最多放行10个包,就相当于每6秒钟最多放行一个包,换句话说,就是每过6秒钟放行一个包,那么配置完上述规则后,我们在另外一台机器上对当前机器进行ping操作
但是刚才配置的规则并没有如我们想象中的一样,ping请求的响应速率完全没有发生任何变化
由于我们的默认规则是ACCEPT所以超过的部分并为阻止
我们可以修改INPUT链的默认策略,或者在上例限制规则的后面再加入一条规则
iptables -t filter -A INPUT -p icmp -j REJECT
结果发现,只有前5个ping包没有受到限制,之后的ping包已经开始受到了规则的限制了,究其原因引入另一个选项:-–limit-burst
limit-burst选项是干什么用的呢?我们先用不准确的大白话描述一遍,”–limit-burst”可以指定”空闲时可放行的包的数量”,其实,这样说并不准确,但是我们可以先这样大概的理解,在不使用”–limit-burst”选项明确指定放行包的数量时,默认值为5,所以,才会出现上图中的情况,前5个ping包并没有受到任何速率限制,之后的包才受到了规则的限制。
如果想要彻底了解limit模块的工作原理,我们需要先了解一下”令牌桶”算法,因为limit模块使用了令牌桶算法。
我们可以这样想象,有一个木桶,木桶里面放了5块令牌,而且这个木桶最多也只能放下5块令牌,所有报文如果想要出关入关,都必须要持有木桶中的令牌才行,这个木桶有一个神奇的功能,就是每隔6秒钟会生成一块新的令牌,如果此时,木桶中的令牌不足5块,那么新生成的令牌就存放在木桶中,如果木桶中已经存在5块令牌,新生成的令牌就无处安放了,只能溢出木桶(令牌被丢弃),如果此时有5个报文想要入关,那么这5个报文就去木桶里找令牌,正好一人一个,于是他们5个手持令牌,快乐的入关了,此时木桶空了,再有报文想要入关,已经没有对应的令牌可以使用了,但是,过了6秒钟,新的令牌生成了,此刻,正好来了一个报文想要入关,于是,这个报文拿起这个令牌,就入关了,在这个报文之后,如果很长一段时间内没有新的报文想要入关,木桶中的令牌又会慢慢的积攒了起来,直到达到5个令牌,并且一直保持着5个令牌,直到有人需要使用这些令牌,这就是令牌桶算法的大致逻辑。
那么,就拿刚才的”令牌桶”理论类比我们的命令,”–limit”选项就是用于指定”多长时间生成一个新令牌的”,”–limit-burst”选项就是用于指定”木桶中最多存放几个令牌的”
使用”–limit”选项时,可以选择的时间单位有多种,如下
/second
/minute
/hour
/day
比如,3/second表示每秒生成3个”令牌”,30/minute表示没分钟生成30个”令牌”。

-–tcp-flags扩展模块:
用于匹配报文的tcp头的标志位
iptables -t filter -I INPUT -p tcp -m tcp --dport --tcp-flags SYN,ACK,FIN,RST,UGR,PSH SYN -j REJECT
第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的6个标志位,这6个标志位分别为为”SYN、ACK、FIN、RST、URG、PSH”,我们可以把这一部分理解成需要匹配的标志位列表。
第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0。
也可以写作
iptables -t filter -I INPUT -p tcp -m tcp --dport --tcp-flags ALL SYN -j REJECT
tcp扩展模块还为我们专门提供了一个选项,可以匹配上文中提到的”第一次握手”,那就是–syn选项
iptables -t filter -I INPUT -p tcp -m tcp --dport --syn -j REJECT

udp扩展:
udp扩展模块,这个扩展模块中能用的匹配条件比较少,只有两个,就是–sport与–dport,即匹配报文的源端口与目标端口。
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
-m udp也可以省略原理与tcp相同

icmp扩展:
常用的扩展匹配条件
–-icmp-type:匹配icmp报文的具体类型《请参考icmp报文类型》 
此刻需求有变,我们只想要ping通别人,但是不想让别人ping通我们,我们则可以进行如下设置(我们发出的ping请求报文对应的type为8,code为0)
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
因为type为8的类型下只有一个code为0的类型,所以我们可以省略对应的code,示例如下
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
除了能够使用对应type/code匹配到具体类型的icmp报文以外,我们还能用icmp报文的描述名称去匹配对应类型的报文,示例如下
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

state扩展:
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙

iptables的黑白名单机制
当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制。
同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制。
修改默认规则 iptables -P INPUT DROP
这就是默认策略设置为DROP的缺点,在对应的链中没有设置任何规则时,这样使用默认策略为DROP是非常不明智的,因为管理员也会把自己拒之门外,即使对应的链中存在放行规则,
当我们不小心使用”iptables -F”清空规则时,放行规则被删除,则所有数据包都无法进入,这个时候就相当于给管理员挖了个坑,所以,我们如果想要使用”白名单”的机制,
最好将链的默认策略保持为”ACCEPT”,然后将”拒绝所有请求”这条规则放在链的尾部,将”放行规则”放在前面,这样做,既能实现”白名单”机制,又能保证在规则被清空时,管理员还有机会连接到主机
例如:
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCPECT
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCPECT
iptables -A INPUT -j REJECT    #-A 表示放在底部

iptables自定义链:
新建链:-N 新建
iptables -t filter -N IN_WEB
“-t filter”表示操作的表为filter表,与之前的示例相同,省略-t选项时,缺省操作的就是filter表。
“-N IN_WEB”表示创建一个自定义链,自定义链的名称为”IN_WEB”
自定义链创建完成后,查看filter表中的链,如上图所示,自定义链已经被创建,而且可以看到,这条自定义链的引用计数为0 (0 references),也就是说,这条自定义链还没有被任何默认链所引用,所以,即使IN_WEB中配置了规则,也不会生效
自定义链已经创建完毕,现在我们就可以直接在自定义链中配置规则了
iptables -t filter -I IN_WEB -s 192.168.100.112 -j REJECT
iptables -I IN_WEB -s 192.168.100.111 -j REJECT
现在,自定义链中已经有了一些规则,但是目前,这些规则无法匹配到任何报文,因为我们并没有在任何默认链中引用它
既然IN_WEB链是为了针对web服务的入站规则而创建的,那么这些规则应该去匹配入站的报文,所以,我们应该用INPUT链去引用它
iptables -I INPUT -p tcp --dport 80 -j IN_WEB
我们在INPUT链中添加了一条规则,访问本机80端口的tcp报文将会被这条规则匹配到
上述规则中的”-j IN_WEB”表示:访问80端口的tcp报文将由自定义链”IN_WEB”中的规则进行处理,没错,在之前的示例中,我们使用”-j”选项指定动作,而此处,我们将”动作”替换为了”自定义链”,当”-j”对应的值为一个自定义链时,
就表示被当前规则匹配到的报文将交由对应的自定义链处理,具体怎样处理,取决于自定义链中的规则,当IN_WEB自定义链被INPUT链引用以后,可以发现,IN_WEB链的引用计数已经变为1,表示这条自定义链已经被引用了1次,
自定义链还可以引用其他的自定义链
修改自定义链的名字:iptables -E IN_WEB WEB
使用”-X”选项可以删除自定义链,但是删除自定义链时,需要满足两个条件:
1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。
2、自定义链中没有任何规则,即自定义链为空。
iptables -X WEB
我们直接删除会报:iptables: Too many links.
所以我们要删除引用规则
iptables -D INPUT 1  #注意第几条规则
我们再次删除自定义链
iptables -X WEB
报:iptables: Directory not empty.  是因为WEB链中存在规则
iptables -t filter -F WEB  #清空规则
iptables -X WEB  #删除成功

以上是关于iptables详解的主要内容,如果未能解决你的问题,请参考以下文章

iptables详解之filter

iptables详解

iptable详解

Linux防火墙iptables详解

iptables详解

iptables详解