背景
在第一篇文章里,我们曾说过 Linux 内核默认内置了 5 条链,分别是 prerouting、postrouting、input、output、forward,数据包流入和流出都会经过其中一些链。
那自定义链和上面的 5 条链有什么区别呢?什么情况下需要自定义链呢?或者说自定义链的好处是什么?
区别:
自定义链和内置的链有一个最大的区别就是:自定义链默认不会生效,需要在内置的 5 条链引用才会生效。怎么引用呢? -j 指定动作/自定义链。
对于自定义链怎么和表关联,这是由 /sbin/iptables 命令指定的,在创建自定义链的时候就关联上了。
好处:
假设现在某台 Linux 服务器上有 1000 条 iptables 规则,有些是针对 mysql 服务的,有些是针对 nginx 服务的,有些是针对 sshd 服务的。这时我们需要插入一条关于 mysql 的规则,限制只能 172.16.0.0/16 网段访问。这时应该怎么办呢?我们在插入前需要把前面的 1000 规则中针对 mysql 服务的规则筛选出来,然后浏览一遍,最后在插入我们新增的规则。
这样做是不是很麻烦啊,简直是非常麻烦。此时应该怎么办呢?聪明的你一定想到自定义链的意义了。
假设我们有一条链叫 IN_MYSQL ,它上面应用的规则全是针对 mysql 服务的,此时我们如果还想增加关于 mysql 服务的规则,直接在 IN_MYSQL 链上修改就行了。
自定义链的好处就是,它可以将规则分类进行管理,让操作人员管理起来更加清晰。但是自定义链默认不会使用,需要在内置的 5 条链上引用。
举例
创建 IN_MYSQL 链
iptables -t filter -N IN_MYSQL
-t:指定表为filter,若不指定,默认也是filter-N:自定义链名称

红色方框内的是我们刚刚创建的自定义链
蓝色方框内的是docker自己创建的自定义链。这里先不管
括号内的信息表示链的引用次数,1表示1次引用,0表示没有引用
给 IN_MYSQL 链配置规则:只允许 172.16.0.0/16 网段访问
iptables -t filter -I IN_MYSQL -p tcp -m tcp -s 172.16.0.0/16 --dport 3306 -j ACCEPT
iptables -t filter -A IN_MYSQL -p tcp -m tcp --dport 3306 -j REJECT
-I:插入规则,后面指定链名-A:追加规则,后面指定链名

在 INPUT 链中引用 IN_MYSQL 链
iptables -t filter -I INPUT -j IN_MYSQL
-j:指定处理动作/自定义链,这里就是自定义链的引用

引用之后我们再来看现在的状态, IN_MYSQL 链的引用次数已经变成了 1,此时在看 INPUT 链中的规则,target 的值正是自定义链 IN_MYSQL
赶快自己动手试试吧!
小结
这篇我们讲了自定义链的区别和好处,同时做了一个示范,自定义链 IN_MYSQL
- 区别:自定义链不能直接使用
- 好处:将规则分开管理,便于维护
- 创建自定义链:
-N选项,iptables -t filter -N IN_MYSQL - 添加规则到自定义链:创建规则是将链名写为自定义链即可
iptables -t filter -I IN_MYSQL -p tcp -m tcp --dport 3306 -s 172.16.0.0/16 -j ACCEPT - 引用自定义链:
-j选项,和处理动作一样iptables -t filter -I INPUT -j IN_MYSQL
本文解析了Linux iptables自定义链与内置链的区别,阐述了自定义链如何分类管理规则,提高维护效率。通过实例演示了自定义链的创建、配置及引用过程。
1321

被折叠的 条评论
为什么被折叠?



