前文中,咱们一直在定义规则,准确的说,咱们一直在iptables的默认链中定义规则,那么此处,咱们就来了解一下自定义链。web
你可能会问,iptables的默认链就已经可以知足咱们了,为何还须要自定义链呢?ssh
缘由以下:tcp
当默认链中的规则很是多时,不方便咱们管理。spa
想象一下,若是INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,咱们忽然想要修改针对httpd服务的相关规则,难道咱们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。.net
因此,iptables中,能够自定义链,经过自定义链便可解决上述问题。3d
假设,咱们自定义一条链,链名叫IN_WEB,咱们能够将全部针对80端口的入站规则都写入到这条自定义链中,当之后想要修改针对web服务的入站规则时,就直接修改IN_WEB链中的规则就行了,即便默认链中有再多的规则,咱们也不会惧怕了,由于咱们知道,全部针对80端口的入站规则都存放在IN_WEB链中,同理,咱们能够将针对sshd的出站规则放入到OUT_SSH自定义链中,将针对Nginx的入站规则放入到IN_NGINX自定义链中,这样,咱们就能想改哪里改哪里,不再同担忧找不到规则在哪里了。code
可是须要注意的是,自定义链并不能直接使用,而是须要被默认链引用才可以使用,空口白话说不明白,等到示例时咱们天然会明白。orm
说了这么多,咱们来动手建立一条自定义链,使用-N选项能够建立自定义链,示例以下blog
如上图所示,"-t filter"表示操做的表为filter表,与以前的示例相同,省略-t选项时,缺省操做的就是filter表。seo
"-N IN_WEB"表示建立一个自定义链,自定义链的名称为"IN_WEB"
自定义链建立完成后,查看filter表中的链,如上图所示,自定义链已经被建立,并且能够看到,这条自定义链的引用计数为0 (0 references),也就是说,这条自定义链尚未被任何默认链所引用,因此,即便IN_WEB中配置了规则,也不会生效,咱们如今不用在乎它,继续聊咱们的自定义链。
好了,自定义链已经建立完毕,如今咱们就能够直接在自定义链中配置规则了,以下图所示,咱们配置一些规则用于举例。
如上图所示,对自定义链的操做与对默认链的操做并无什么不一样,一切按照操做默认链的方法操做自定义链便可。
如今,自定义链中已经有了一些规则,可是目前,这些规则没法匹配到任何报文,由于咱们并无在任何默认链中引用它。
既然IN_WEB链是为了针对web服务的入站规则而建立的,那么这些规则应该去匹配入站的报文,因此,咱们应该用INPUT链去引用它。
固然,自定义链在哪里建立,应该被哪条默认链引用,取决于实际的工做场景,由于此处示例的规则是匹配入站报文,因此在INPUT链中引用自定义链。
示例以下。
上图中,咱们在INPUT链中添加了一条规则,访问本机80端口的tcp报文将会被这条规则匹配到
而上述规则中的"-j IN_WEB"表示:访问80端口的tcp报文将由自定义链"IN_WEB"中的规则进行处理,没错,在以前的示例中,咱们使用"-j"选项指定动做,而此处,咱们将"动做"替换为了"自定义链",当"-j"对应的值为一个自定义链时,就表示被当前规则匹配到的报文将交由对应的自定义链处理,具体怎样处理,取决于自定义链中的规则,当IN_WEB自定义链被INPUT链引用之后,能够发现,IN_WEB链的引用计数已经变为1,表示这条自定义链已经被引用了1次,自定义链还能够引用其余的自定义链,感兴趣的话,动手试试吧。
在以前的文章中,咱们说过,"动做"在iptables中被称为"target",这样描述并不许确,由于target为目标之意,报文被规则匹配到之后,target能是一个"动做",target也能是一个"自定义链",当target为一个动做时,表示报文按照指定的动做处理,当target为自定义链时,表示报文由自定义链中的规则处理,如今回过头再理解以前的术语,彷佛更加明了了。
那么此刻,咱们在192.168.1.139上尝试访问本机的80端口,已经被拒绝访问,证实刚才自定义链中的规则已经生效了。
过了一段时间,咱们发现IN_WEB这个名字不太合适,咱们想要将这条自定义链重命名,把名字改为WEB,能够吗?必须能啊,示例以下
如上图所示,使用"-E"选项能够修改自定义链名,如上图所示,引用自定义链处的名称会自动发生改变。
好了,咱们已经可以建立自定义了,那么怎样删除自定义链呢?
使用"-X"选项能够删除自定义链,可是删除自定义链时,须要知足两个条件:
一、自定义链没有被任何默认链引用,即自定义链的引用计数为0。
二、自定义链中没有任何规则,即自定义链为空。
那么,咱们来删除自定义链WEB试试。
如上图所示,使用"-X"选项删除对应的自定义链,可是上例中,并无成功删除自定义链WEB,提示:Too many links,是由于WEB链已经被默认链所引用,不知足上述条件1,因此,咱们须要删除对应的引用规则,示例以下。
如上图所示,删除引用自定义链的规则后,再次尝试删除自定义链,提示:Directory not empty,是由于WEB链中存在规则,不知足上述条件2,因此,咱们须要清空对应的自定义链,示例以下
如上图所示,使用"-X"选项能够删除一个引用计数为0的、空的自定义链。
为了方便之后回顾,咱们将上述命令进行总结。
1
2
|
#示例:在filter表中建立IN_WEB自定义链
iptables -t filter -N IN_WEB
|
1
2
|
#示例:在INPUT链中引用刚才建立的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
|
1
2
|
#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB
|
删除自定义链须要知足两个条件
一、自定义链没有被引用
二、自定义链中没有任何规则
1
2
|
#示例:删除引用计数为0而且不包含任何规则的WEB链
iptables -X WEB
|
好了,自定义链就总结到这里,但愿这篇文章可以对你有所帮助~~~各位客官,再见啦,么么哒~~~~