为了防止恶意攻击主动连接到你的主机,我们需要通过iptables的扩展模块判断报文是为了回应我们之前发出的报文还是主动向我们发送的报文,state模块可以让iptables实现 连接追踪机制 ,报文状态可以分成 NEW ESTAVLISHED RELATED INVALID UNTRACKED。具体的连接跟踪的原理详见(https://blog.csdn.net/weixin_40042248/article/details/112568071)。
本次实验是为了验证iptables的state模块如何进行连接跟踪,从而实现防火墙的功能。iptables的命令详解见(https://huhaizhou.blog.csdn.net/article/details/86619021)
本次实验的拓扑结构如下图所示。
为了使实验更加简便,我们使用了namespace进行验证,如上图所示,首先我们需要将两个空间连通,也就是可以相互ping通。具体步骤见(https://blog.csdn.net/weixin_40042248/article/details/112428503)
接下来,在ns1中执行以下命令
iptables -F 清除规则
iptables -P INPUT DROP 添加filter的默认规则,将进入的流量DROP掉
iptables -P OUTPUT ACCEPT 添加filter的默认规则,将允许向外发送数据流
iptables -P FORWARD ACCEPT 添加filter的默认规则,将允许转发功能
iptables -L 查看规则
执行完这些命令后,此时的ns1不能被外界主机访问,但是可以向外界发送数据流,也能够转发数据流。
然后,针对ns2执行以下命令
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables –t filter –A INPUT –p icmp –j ACCEPT 添加规则,允许icmp报文进入ns2中
iptables -L
执行完这些命令之后,此时的ns1只允许icmp报文进入。
所以,设置完这些规则之后,能时ns1 ping ns2是否可以ping通呢?如下图所示。可以看出ns1并不能ping通ns2,这是为什么呢?按说ns2允许icmp报文进入呀。
为了了解清楚为什么不可以ping通,在ns1中执行ping命令,然后在宿主机终端上输入命令tcpdump -i veth2-ns1 -n,抓取数据包,如下图所示,可以看出icmp请求和回送报文都能正确发送,那么说明回送报文正确发送了,但是并未进入ns1中,为什么没有进入ns1呢?主要是因为我们通过命令iptables -P INPUT DROP 设置了规则不允许外界流量进入。
那么该如何设置才能ping通呢,由于安全原因,不能直接修改命令iptables -P INPUT DROP,因为这样防火墙就失去了意义,必须让内核模块知道icmp回送报文是本机请求的回送报文,面对自己请求的报文就让防火墙对报文放行,这样既实现了防火墙的功能又不会阻止自己的请求报文。所以为了识别这个报文的身份,就用到了连接跟踪的知识。
接下来,在ns1中使用命令iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT,添加规则,对ESTABLISHED状态的报文放行如下图所示。
此时,在ns1中ping ns2就可以顺利ping通了,如下图所示。
以上就是state模块的简单使用以及连接跟踪的简单应用,希望可以给您带来帮助,如有不当之处,请留言指正,谢谢!
https://blog.51cto.com/6226001001/1712514