前文中,我们一直在定义规则,准确的说,我们一直在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

 

posted on 2021-01-05 15:17  EZgod  阅读(463)  评论(0编辑  收藏  举报