iptables之filter表的学习和实验
作者:互联网
实验目标:本次实验主要完成以下内容:DROP掉外界主机的icmp协议的流量、DROP掉向外界主机发出的icmp协议的流量、DROP掉特定的源IP发送过来的流量,完成试验后删除所有规则。
实验设备:Ubuntu20
实验拓扑:3个namesapce代表三个主机,主机1作为流量接收设备,主机2、3作为流量发送设备。具体的拓扑构建见上一篇博客《两个network namesapce通过路由实现互通》(https://blog.csdn.net/weixin_40042248/article/details/112428503),在这个拓扑之上再加上一个ns3就可以了。
理论知识:
Netfileter/iptables (以下简称iptables)是nuix/linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具、它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables目录下,真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。
1、四表五链,iptables具有Filter, NAT, Mangle, Raw四种表,表中包含INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五个链,链中有各种规则。
(1) iptables 的filter表介绍,对于filter表的控制是我们实现本机防火墙功能的重要手段。
Filter表 | 和主机自身相关、负责防火墙(过滤本机流入、流出数据包)。 是iptables默认使用的表、这个表定义了三个链(chains)说明如下 | |
| INPUT | 负责过滤所有目标地址是主机(防火墙)地址的数据包、通俗的讲、就是过滤进入主机的数据包。 |
| FORWARD | 负责转发流经主机但不进入本机的数据包、起转发作用、和NAT表关系很大、后面会详细介绍 |
| OUTPUT | 处理所有原地址是本机地址的数据包、通俗的讲就是处理从主机发出去的数据包。 |
(2) iptabls 的nat表介绍。
NAT表 | 是网络地址转换的意思。即负责来源与目的IP地址和port的转换、和主机本身无关。一般用于局域网多人共享上网或者内网IP映射外网IP及不同端口转换服务等功能。Nat表的功能很重要、这个表定义了三个链(chains) | |
| OUTPUT | 主机发出去的数据包有关、在数据包路由之前改变主机产生的数据包的目的地址等。 |
| PREROUTING | 在数据包刚到达防火墙时、进行路由判断之前执行的规则、改变包的目的地址(DNAT功能)、端口等(通俗比喻,就是收信时、根据规则重写收件人的地址、这看上去不地道啊、)把公司IP映射到局域网的机器上、此链多用于把外部IP地址端口的服务、映射为内部IP地址及端口 |
| POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则、改变包的源地址(SNAT)、端口等(通俗比喻、就是寄信时写好发件人的地址、要让人家回信是能够有地址可回)刺链多用于局域网共享上网,把所有局域网的地址、转换为公网地址上 |
(3)iptables 的mangle表介绍。
Mangle表 | 主要负责修改数据包中特殊的路由标记,如TTL、TOS、MARK等、这个表定义了5个链(chains) | |
| INPUT | 同filter表的INPUT |
| FORWARD | 同filter表的FORWARD |
| OUTPUT | 同fileter表的OUTPUT |
| PREROUTING | 同nat表的PREROUTING |
| POSTOUTING | 同nat表的POSTOUTING |
2、iptables传输数据包的过程
(1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
(2)如果目的IP就是进入本机的,数据包就会沿着图向下移动,到达INPUT链,数据包到了INPUT链后,任何进程都会收到它。同时,本机上运行的程序也可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
(3) 如果目的IP不是本机时,也就是本机只作为路由器功能转发数据时,数据包就要转发出去,且内核规则允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
3、语法规则
语法规则介绍比较繁琐,可以参考其他博客,这里我只记录本次实验所用到的语法规则。
- -t<表>:指定要操纵的表;
- -A:向规则链中添加条目;
- -D:从规则链中删除条目;
- -i:向规则链中插入条目;
- -R:替换规则链中的条目;
- -L:显示规则链中已有的条目;
- -F:清楚规则链中已有的条目;
- -Z:清空规则链中的数据包计算器和字节计数器;
- -N:创建新的用户自定义规则链;
- -P:定义规则链中的默认目标;
- -h:显示帮助信息;
- -p:指定要匹配的数据包协议类型;
- -s:指定要匹配的数据包源ip地址;
- -j<目标>:指定要跳转的目标;
- -i<网络接口>:指定数据包进入本机的网络接口;
- -o<网络接口>:指定数据包要离开本机所使用的网络接口。
实验过程:拓扑构建见实验拓扑部分的介绍,这里直接开始实验。
1、DROP掉外界主机的icmp协议的流量
ns1的网卡veth1-ns1作为流量接收端,ns2的veth1-ns2和ns3的veth1-ns3作为流量发送端,在ns1中设置规则过滤掉icmp流量,所以这个功能就是实现一个简单的防火墙的功能,就是使用filter表进行规则的设置。
首先,进入ns1空间下,使用命令iptables -t filter -vnL 查看此空间内的filter表的规则,如下图所示,可以看出,三个链的规则都是空。
对于命令,由于filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,所以使用命令iptables -vnL也是默认查看的filter表的。如果想要查看其他的表的内容iptables -t 表名 -vnL。
此时,需要在ns1的filter表下添加规则过滤icmp报文,使用命令iptables -t filter -A INPUT -p icmp -j DROP添加规则,因为是drop掉外界进入的流量,所以需要对INPUT链进行操作,如下图所示。
此时ns2和ns3的网卡就无法ping通ns1了,如下图所示。
那么此时其他协议的访问可以正常进行么?这里就来使用http访问验证一下,首先,在ns1下,使用命令python3 -m http.server 8000开启一个http服务,端口为8000,然后进入ns2空间下,使用命令curl http://192.168.101.1:8000 对ns1进行http访问,如下图所示,可以看出访问成功。
根据以上实验结果,可以得出结论,这条命令有效阻止了ICMP数据的访问,实现了DROP掉外界主机的icmp协议的流量的目标,实现了一个简单的防火墙功能。
2、DROP掉向外界主机发出的icmp协议的流量
进行本步骤的实验之前,先接着上一步的操作进行,由于上一步规则只在INPUT链加了DROP掉外界主机的icmp协议的流量,所以此时虽然ns1没有DROP掉向外界主机发出的icmp协议的流量这条规则,但是实际上ns1已经不能向外界主机进行ping操作了,为什么呢?因为,ping命令执行后,不仅有ICMP回送请求报文,还有一个ICMP应答报文,也就是说request报文可以正常向外界发送,但是外界主机的reply报文已经无法返回给ns1了。
为了验证上述猜想,使用tcpdump进行抓包。在ns1中使用命令ping 192.168.102.1就是ns1 ping ns2内的网卡,此时,在物理机上抓取veth2-ns1和veth2-ns2的数据包进行分析,如下图所示。
可以看出,veth2-ns1和veth2-ns2均有request和reply报文,也就是说icmp的请求和应答报文都是正常的,但是在应答报文进入ns1空间的时候,由于其是icmp报文,所以被规则给过滤掉了。所以如下图所示,ns1并不能ping通其他主机。
现在开始本步骤的实验,由于DROP向外发出的ICMP数据流量,所以针对OUTPUT链进行规则添加,使用命令iptables -t filter -A OUTPUT -p icmp -j DROP添加规则,如下图所示。
此时,验证ns1的icmp request包是否还可以发送出去,在ns1中ping 192.168.102.1 ,然后再物理机终端使用tcpdump抓取veth2-ns1的数据包进行分析,如下图所示。可以看出ns1内显示不允许sendmsg,同时veth2-ns1并未抓取到任何数据包。
3、DROP掉特定的源IP发送过来的流量
在进行本次实验之前,需要删除前两个实验步骤添加的规则,使用命令iptables -t filter -D OUTPUT -p icmp -j DROP和iptables -t filter -D INPUT -p icmp -j DROP删除规则,如下图所示。删除完成后,ping命令就恢复了正常。
开始本次步骤的实验,DROP掉特定的源IP发送过来的流量,依然使用ns1作为流量接收端,ns2和ns3作为流量的发送端,实验要达到的效果即是添加规则DROP掉ns3的流量,ns2可以正常对ns1进行访问。
ns3的veth1-ns3网卡的ip地址为192.168.103.1,所以在ns1中执行命令iptables -t filter -A INPUT -s 192.168.103.1 -j DROP 阻止从源地址为192.168.103.1发送过来的数据,如下图所示。
然后,在ns2中ping ns1,在ns3中ping ns1,可以看出ns2可以ping 通,ns3不可以 ping通,如下图所示。
4、删除所有规则
在配置iptables之前,你通常需要用iptables –list命令或者iptables-save命令查看有无现存规则,因此有时需要删除现有的iptables规则:使用命令iptables –flush 或者 iptables -F 这两条命令是等效的。但是并非执行后就万事大吉了。你仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时只能手动清除:iptables -t NAT -F。
对于逐条清除规则,就需要诸如3的命令iptables -t filter -D OUTPUT -p icmp -j DROP和iptables -t filter -D INPUT -p icmp -j DROP删除规则。
实验总结:本次实验过程实验各个实验的目标,讲解了关于filter实现防火墙的一些实验步骤,并讲解了基础的语法知识,接下来就是做一些关于nat表的实验。希望此次实验给您带来帮助,如有不当,请留言指正,谢谢。
标签:iptables,DROP,filter,实验,规则,ns1,数据包 来源: https://blog.csdn.net/weixin_40042248/article/details/112477946