iptables 中的 RELATED 状态的使用是否正确?

iptables 中的 RELATED 状态的使用是否正确?

我看到很多人使用 ESTABLISHEDRELATED 标志一起用于在先前接受连接后接受流量(请参阅允许建立会话)。

假设我使用以下规则设置了防火墙:

-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp -s x.x.x.x --dport 22 -d x.x.x.x --syn -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -m tcp ! --syn -d x.x.x.x -j ACCEPT
-A INPUT -i all -p all -j REJECT

我预计任何新的连接都会被最后一条规则阻止,除非它是端口 80 或端口 22。但是,对于端口 22,我将连接限制为一个输入 IP 地址(比如我的家庭办公室)。

然后我希望该规则--state ESTABLISHED,RELATED只接受先前使用端口 80 或端口 22 的规则连接的流量。

不过,从我在防火墙计数器中看到的情况来看,感觉好像我已经建立了相关的,TCP 上的任何流量都可以发送到服务器......

在我的测试中,假设我在端口 8080 上有另一个 HTTP 服务器,我首先连接到明确允许的端口 80,然后,我可以以某种方式连接并发送 GET 并在端口 8080 上接收响应,即使它没有打开。

类似地,如果我连接到端口 22,则当前打开并监听 0.0.0.0 的任何其他 TCP 端口都可以访问。我担心的是,这意味着连接到端口 80 的人现在可以访问端口 22,因为 RELATED 允许这样做(假设端口 80 已打开,则将与端口 22 建立新连接)。

我说得对吗?我原本想将规则改为:

-A INPUT -i eth0 -p tcp -m state --state ESTABLISHED -m tcp ! --syn -d x.x.x.x -j ACCEPT

(即没有 RELATED 状态,只有 ESTABLISHED)

我还认为! --syn会使用该规则阻止建立新的连接,但这似乎也是不正确的......

答案1

我假设您的设置中有以下 3 件事:

  • 您对 ACCEPT 的 INPUT 表有一个默认策略(它是默认值)。
  • 最后一条规则上的数据包/字节计数器-A INPUT -i all -p all -j REJECT为 0
  • 您没有名为“all”的接口

据我所知,该-i参数没有像这样的关键字all,因此它被视为接口名称。加载此规则时没有错误,因为在尚不存在或未启动的接口上创建规则是合法的。因此,您的最后一条规则不会捕获任何内容,并且由于您的默认策略是ACCEPT,因此所有不匹配任何规则的数据包都会被接受。

如果您想要您所期望的,请不要提及任何接口,然后规则将应用于所有可用的接口:

-A INPUT -j REJECT

这也是在表上设置 DROP 默认策略的一个很好的例子(当然,至少要先将自己列入白名单):

iptables -P INPUT DROP

希望这能解决您的问题。如果数据包计数器或默认策略与我所想的不符,请告知我们。

相关内容