前文中,我们一直在定义规则,准确的说,我们一直在iptables的默认链中定义规则,那么此处,我们就来了解一下自定义链。
你可能会问,iptables的默认链就已经能够满足我们了,为什么还需要自定义链呢?
原因如下:
当默认链中的规则非常多时,不方便我们管理。
想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如,我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。
所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。
假设,我们自定义一条链,链名叫IN_WEB,我们可以将所有针对80端口的入站规则都写入到这条自定义链中,当以后想要修改针对web服务的入站规则时,就直接修改IN_WEB链中的规则就好了,即使默认链中有再多的规则,我们也不会害怕了,因为我们知道,所有针对80端口的入站规则都存放在IN_WEB链中,同理,我们可以将针对sshd的出站规则放入到OUT_SSH自定义链中,将针对Nginx的入站规则放入到IN_NGINX自定义链中,这样,我们就能想改哪里改哪里,再也不同担心找不到规则在哪里了。
但是需要注意的是,自定义链并不能直接使用,而是需要被默认链引用才能够使用,空口白话说不明白,等到示例时我们自然会明白。
[root@nat2 vsftpd]# iptables -t filter -N IN_WEB [root@nat2 vsftpd]# iptables -nvL Chain INPUT (policy ACCEPT 53 packets, 3092 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 29 packets, 2228 bytes) pkts bytes target prot opt in out source destination Chain IN_WEB (0 references) pkts bytes target prot opt in out source destination [root@nat2 vsftpd]#
自定义链创建完成后,查看filter表中的链,如上图所示,自定义链已经被创建,而且可以看到,这条自定义链的引用计数为0 (0 references),也就是说,这条自定义链还没有被任何默认链所引用,所以,即使IN_WEB中配置了规则,也不会生效
现在我们往IN_WEB链里填加一条规则
[root@nat2 vsftpd]# iptables -t filter -I IN_WEB -s 192.168.56.122 -j REJECT
[root@nat2 vsftpd]# iptables -t filter -nvL IN_WEB Chain IN_WEB (1 references) pkts bytes target prot opt in out source destination 12 3680 REJECT all -- * * 192.168.56.122 0.0.0.0/0 reject-with icmp-port-unreachable [root@nat2 vsftpd]#
我们让INPUT链去引用他,完成禁止122主机ssh 130机器的目的
[root@nat2 vsftpd]# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j IN_WEB [root@nat2 vsftpd]# iptables -nvL Chain INPUT (policy ACCEPT 29 packets, 1700 bytes) pkts bytes target prot opt in out source destination 29 1700 IN_WEB tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 17 packets, 1268 bytes) pkts bytes target prot opt in out source destination Chain IN_WEB (1 references) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 192.168.56.122 0.0.0.0/0 reject-with icmp-port-unreachable [root@nat2 vsftpd]#
测试结果如下:
[root@bogon ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:94:80:13 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 valid_lft 86375sec preferred_lft 86375sec inet6 fe80::cb64:f600:adf3:77a0/64 scope link valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:f3:6b:3a brd ff:ff:ff:ff:ff:ff inet 192.168.56.122/24 brd 192.168.56.255 scope global dynamic enp0s8 valid_lft 367sec preferred_lft 367sec inet6 fe80::706:be4:9de5:587b/64 scope link valid_lft forever preferred_lft forever [root@bogon ~]# ssh root@192.168.56.130 ssh: connect to host 192.168.56.130 port 22: Connection refused [root@bogon ~]#
命令小结:
创建自定义链
#示例:在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB
引用自定义链
#示例:在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
重命名自定义链
#示例:将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB
删除自定义链
删除自定义链需要满足两个条件
1、自定义链没有被引用
2、自定义链中没有任何规则
#示例:删除引用计数为0并且不包含任何规则的WEB链
iptables -X WEB