【iptables 实战】04 高级用法:iptables模块之state扩展

一、场景描述

假设我们内部的主机,想访问新闻网站,即访问其80端口。要想正确地获取到http报文内容。我们对这个网络报文应该这么设置

  • 出去的报文,目标端口,80端口,放行
  • 进入的报文,源端口,80端口,放行
    这样我们能正常浏览网页了。
    但是,这么做的话,也有安全隐患,如下图所示
    【iptables 实战】04 高级用法:iptables模块之state扩展_第1张图片

黑客源报文为80端口的话,可以连接我们的主机。可以借此攻击我们。
这个问题的本质,实际上是,我们只想主动连别人,别人不要主动连上我。我请求目标端口为80的报文,只通过80端口,你给我的响应报文,你只要通过自己的80端口想连上我,我通通拒绝!
于是,流程就变成了下面的效果
【iptables 实战】04 高级用法:iptables模块之state扩展_第2张图片

二、TCP报文原理解析

TCP连接建立会经历三次握手,三次握手后,才开始正式的通信。
因此,如果黑客通过自己的80端口,想来连我,就会发起第一次握手,因此,如果我们能对这种连接报文拒绝,就能让他无法通过80端口来攻击我。

三、iptables的连接状态

iptables的状态跟踪连接有4种,分别是:NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED具体状态信息如下:

  • 1、NEW状态:说明这个数据包是收到的第一个数据包。
  • 2、ESTABLISHED状态:只要发送并接到应答,一个数据表的状态就从NEW变为ESTABLISHED,并且该状态会继续匹配这个连接后继数据包。
  • 3、RELATED状态:当一个数据包的状态处于ESTABLISHED状态的连接有关系的时候,就会被认为是RELATED,也就是说一个连接想要是RELATED状态,首先要有一个ESTABLISHED的连接。
  • 4、INVALID状态:不能被识别属于哪个连接状态或没有任何关系的状态,一般这种数据包都是被拒绝的。
  • 5、UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接
    【iptables 实战】04 高级用法:iptables模块之state扩展_第3张图片
    好了,我们已经大致了解了state模块中所定义的5种状态,那么现在,我们回过头想想刚才的问题。
    刚才问题的根源就是:怎样判断报文是否是为了回应之前发出的报文。
    刚才举例中的问题即可使用state扩展模块解决,我们只要放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,如果你还不放心,可以将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙,示例如下
[root@test-c ~]# iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@test-c ~]# iptables -t filter -A INPUT -j REJECT

你可能感兴趣的:(iptables,实战,网络)