系统相关
首页 > 系统相关> > iptables之filter表的学习和实验

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、语法规则

语法规则介绍比较繁琐,可以参考其他博客,这里我只记录本次实验所用到的语法规则。

实验过程:拓扑构建见实验拓扑部分的介绍,这里直接开始实验。

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