背景
在第一篇文章里,我们曾说过 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