Iptables防火墙基本匹配应用

830 阅读10分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

Iptables防火墙基本匹配应用

1.Iptables防火墙规则管理

所谓的规则就是由运维配置的一条条防火墙策略,只有满足策略的源才会被防火墙放行,一条规则通常是由条件+动作来组合的。

Iptables防火墙定义规则时的命令格式以及常用参数`:

命令格式:iptables -t {表名} {选项} {链名} {条件} {动作}

常用参数`:

  • -t:指定要操作的表名称,不知道表名默认是filter表。
  • -A:追加一条规则到表中,也就是在最后一条处进行添加。
  • -D:删除表中的一条规则。
  • -I:在表中插入一条规则,在最顶部位置插入。
  • -R:修改表中规则的内容。
  • -L:列出当前表中所有的规则。
  • -n:列出防火墙规则时,将域名解析成IP,所有的地址都以IP的形式展示。
  • -S:列出整个防火墙中所有的规则。
  • -F:清空所有防火墙规则。
  • -Z:清空计数器,在防护墙中每进入防火墙的一条报文都会产生数据包和条目,通过`-Z可以清空这些条目。
  • -N:创建一个自定义的链。
  • -X:删除一个自定义的链。
  • -P:指定链的默认策略。
  • -v:显示详细信息。
  • -p:指定要操作的协议类型,不指定-p参数声明是那种协议,默认是all,也就是所有协议。
  • -s:指定源地址。
  • -d:指定目标地址。
  • --sport:指定源端口.
  • --dport:指定目标端口。
  • -i:指定从哪个网卡进入的报文。
  • -o:指定从哪个网卡出去的报文。
  • -m:指定扩展模块。
  • -j:指定策略的动作。

2.Iptables防火墙的基本使用

2.1.查看设置的规则

查看filter表的规则详细信息。

 [root@jiangxl ~]# iptables -t filter -L -n -v
 Chain INPUT (policy ACCEPT 0 packets, 0 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 0 packets, 0 bytes)
  pkts bytes target     prot opt in     out     source               destination  

2.2.设置一条防火墙规则

设置一条防火墙规则,禁止所有来源ping本机。

ping属于ICMP协议,禁ping属于来源客户端ping目标主机,需要在INPUT链的filter表中添加一条防火墙规则,禁止ICMP协议进入。

 [root@jiangxl ~]# iptables -t filter -I INPUT -p icmp -j REJECT 

规则解释:在INPUT链的filter表中添加了一条对于ICMP协议的数据包一律拒绝的规则。

效果如下,没有设置防火墙规则时,可以正常ping通,设置完防火墙规则后,无法ping通。

image-20220429114102683.png

2.3.修改现有防火墙的规则内容

在前面针对禁ping的防火墙规则设置的动作的REJECT拒绝,下面修改成DROP丢失。

1)首先查看当前防火墙规则的ID号,修改规则时需要指定规则的ID号,否则不知道要该哪条规则。

 [root@jiangxl ~]# iptables -t filter -L -n -v --line-number
 Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 1        5   276 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
 ​
 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 ​
 Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination  

2)将禁ping的规则动作修改成DROP。

 [root@jiangxl ~]# iptables -t filter -R INPUT 1 -p icmp -j DROP

3)查看规则是否修改成功。

 [root@jiangxl ~]# iptables -t filter -L -n -v --line-number
 Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 1        0     0 DROP       icmp --  *      *       0.0.0.0/0            0.0.0.0/0    

4)查看效果,已经是处于请求超时的状态了,禁ping的防火墙规则动作最好设置成DROP。

image-20220429114634260.png

2.4.查看/清空防火墙规则的计数器

1)查看当前防火墙规则的计数器

计数器中包含了数据包的请求次数和大小。

 [root@jiangxl ~]# iptables -t filter -L -n -v --line-number

在规则的详细信息中就可以看到,PKTS是发生的数据包次数,bytes是数据包的大小。

image-20220429114839669.png

2)清空计数器的值

一条规则中的计数器的指标是可以清空的,命令如下所示。

 [root@jiangxl ~]# iptables -t filter -Z

此时计数器的值就清空完毕了。

image-20220429115052439.png

2.5.删除一条防火墙规则

删除INPUT链filter表中ID为1的规则。

 [root@jiangxl ~]# iptables -t filter -D INPUT 1

3.Iptables防火墙基本匹配条件应用

应用匹配条件时,经常会用到以下几个参数。

  • -p:指定要操作的协议类型,不指定-p参数声明是那种协议,默认是all,也就是所有协议。
  • -s:指定源地址。
  • -d:指定目标地址。
  • --sport:指定源端口.
  • --dport:指定目标端口。
  • -i:指定从哪个网卡进入的报文。
  • -o:指定从哪个网卡出去的报文。
  • -m
  • -j:指定策略的动作。

3.1.基本匹配条件案例一

需求: 仅允许 192.168.20.21 访问 192.168.20.20 的80端口,其余的来源客户端都拒绝访问。

明确需求后,下面来分析应该如何实现。

这条需求分包含两种不同的条件,首先是允许192.168.20.21访问目标端口,然后是拒绝其他所有的客户端访问。

首先来思考允许的条件如何实现:

1、允许某个来源访问本机的特定服务,这种访问属于数据的流入,那么就会经过PREROUTING和INPUT两个链,允许或者拒绝这些操作都是在filter表实现的,PREROUTING链没有filter,因此首先就可以得出结论,这条规则会在INPUT链的filter表中进行添加。

2、允许192.168.20.21这个地址,那么就需要指定来源的IP,然后根据来源IP的请求,还需要指定目标端的地址。

3、限制来源地址仅访问本机的某个服务,那么就需要指定服务具体的协议以及端口号。

4、最后指定匹配完这些条件后,执行的动作,也就是ACCEPT。

然后来思考拒绝的条件如何实现:

1、首先明确拒绝其余来源访问本机的某个服务,那么一定是在INPUT链的filter表中添加具体的规则。

2、最后声明拒绝其他的来源地址。

注意: 由于不是全部拒绝,还有一个来源地址192.168.20.21是允许访问TCP的80端口的,因此在写入拒绝规则时,不能在使用-I参数添加到表的最顶端,应该通过-A参数添加到表的最后一行,追加进去。

1)实现该需求的防火墙规则如下

 1.允许192.168.20.21访问192.168.20.2080端口
 [root@jxl-1 ~]# iptables -t filter -I INPUT -s 192.168.20.21 -d 192.168.20.20 -p tcp --dport 80 -j ACCEPT
 ​
 2.拒绝其余来源IP访问本机的80端口
 [root@jxl-1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j DROP

注意第二条拒绝所有的时候一定要使用-A参数追加到最后一行,否则所有的来源都将不可访问。

2)查看设置的防火墙规则

INPUT链中一共有2条规则,第一条规则的动作是允许,允许192.168.20.21访问192.168.20.20的tcp 80端口,第二条规则的动作是拒绝,拒绝全部IP访问本机的80端口。

 [root@jxl-1 ~]# iptables -L -n -v --line-number
 Chain INPUT (policy ACCEPT 9483 packets, 17M bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 1        0     0 ACCEPT     tcp  --  *      *       192.168.20.21        192.168.20.20        tcp dpt:80
 2        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
 ​
 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 ​
 Chain OUTPUT (policy ACCEPT 9619 packets, 15M bytes)
 num   pkts bytes target     prot opt in     out     source               destination         

3)测试结果

只有来源地址为192.168.20.21的IP,才能访问到192.168.20.20的TCP 80端口的服务。

image-20220429174512257.png

3.2.基本匹配条件案例二

需求: 由本机发出的TCP协议的报文都允许,发出的其他协议报文都拒绝。

明确需求后,下面来分析应该如何实现,和案例一类似,分为两种规则,一是允许某一个协议,二是拒绝其余所有的协议。

首先要明确在哪一个链的哪一个表中添加Iptables防火墙规则,看需求中的关键字“由本机发出”,由本机发出都需要经过POSTROUTING和OUTPUT链,这种过滤规则一定会在OUPUT链进行添加,引起POSTROUTING链没有filter表。

明确完再哪一张表和哪一个链添加规则后,就非常容易了。

1)先来添加允许TCP协议报文流出的Iptables防火墙规则。

2)然后来添加拒绝剩余的其他报文,一定要将拒绝的规则添加在允许规则的下面,否则允许的规则将永不生效。

  • 可以先将之前添加的规则清空,以免受到干扰。

    • [root@jxl-1 ~]# iptables -t filter -F

1)实现该需求的防火墙规则如下

 1.允许本机的TCP协议报文流出
 [root@jxl-1 ~]# iptables -t filter -I OUTPUT -p tcp -j ACCEPT
 ​
 2.拒绝本机所有协议报文流出
 [root@jxl-1 ~]# iptables -t filter -A OUTPUT -p all -j DROP

2)查看设置的防火墙规则

在OUTPUT链可以看到两条规则,第一条规则允许TCP协议报文流出,第二条规则拒绝所有协议的报文流出。

 [root@jxl-1 ~]# iptables -L -n -v --line-number
 Chain INPUT (policy ACCEPT 5138 packets, 8863K bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 ​
 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 ​
 Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 1     6703   10M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           
 2        1    76 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0  

3)测试结果

由于拒绝了除TCP协议以外的所有协议,因此再使用ICMP协议时就产生了拒绝的现象,但是使用TCP协议就没有任何影响。

image-20220429175939538.png

3.3.基本匹配条件案例三

需求: 禁止其他主机从ens192发送来的ping请求。

首先来进行分析,案例三就非常简单了,只有一种条件,那就是禁止其他的主机从本机的ens192网卡发送来的数据报文,从字面意思可以清楚的知道这是一条数据流入的规则。

那么一定是在INPUT链的filter表添加相应的规则策略。

1)实现该需求的防火墙规则如下

 [root@jxl-1 ~]# iptables -t filter -I INPUT -i ens192 -p icmp -j DROP

2)查看设置的防火墙规则

在INPUT链中已经添加上了这条规则,凡是来自ens192网卡并且协议是icmp的报文都会被拒绝。

 [root@jxl-1 ~]# iptables -L -n -v --line-number
 Chain INPUT (policy ACCEPT 2680 packets, 4308K bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 1        0     0 DROP       icmp --  ens192 *       0.0.0.0/0            0.0.0.0/0           
 ​
 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 num   pkts bytes target     prot opt in     out     source               destination         
 ​
 Chain OUTPUT (policy ACCEPT 2752 packets, 4004K bytes)
 num   pkts bytes target     prot opt in     out     source               destination  

3)测试结果

在其他主机ping防火墙主机的ens192网卡,发现不通,但是ens224网卡就通。

image-20220429182133086.png

3.4.拒绝所有协议进入本机的规则配置

 iptables -t filter INPUT -j DROP

3.5.--dport参数声明多个连续的端口号

 --dport 20:22
 ​
 表示20-22三个端口都可以进行匹配。