ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

iptables之filter表的学习和实验

2021-01-12 14:32:46  阅读:260  来源: 互联网

标签:iptables DROP filter 实验 规则 ns1 数据包


实验目标:本次实验主要完成以下内容: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有