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

我曾经看到很多人一起使用ESTABLISHED RELATED标志来接受stream量,一旦连接被接受(见允许build立的会话 )。

假设我按照以下规则设置防火墙

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

我希望任何新的连接被阻塞的最后一条规则,除非它是端口80或端口22.但是,对于端口22,我限制连接到一个inputIP地址(比如说我的家庭办公室)。

然后我期望规则与 – --state ESTABLISHED,RELATED只接受以前使用端口80或端口22的规则连接的stream量。

从我在防火墙计数器中可以看到的情况来看,感觉就像我有了ESTABLISHED RELATED,TCP上的任何stream量都可以发送到服务器。

在我的testing中,假设我在端口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 xxxx -j ACCEPT 

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

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

让我在你的设置中假设以下三件事情:

  • 在ACCEPT的INPUT表上有一个默认的策略(这是默认值)。
  • 你的数据包/字节计数器在最后一个规则-A INPUT -i all -p all -j REJECT是0
  • 您没有名为“全部”的界面

AFAIK -i参数没有像all的关键词,所以它被认为是一个接口名称。 加载此规则时没有错误,因为在尚不存在或不存在的接口上创build规则是合法的。 所以你的最后一条规则什么也没有捕获,而且你的默认策略是ACCEPT ,所有不符合任何规则的数据包都被接受。

如果你想得到你所期望的,不要提及任何接口,然后规则将被应用到所有可用的接口:

 -A INPUT -j REJECT 

这也是在表格上设置DROP的默认策略的一个很好的例子(当然,以前至less白名单):

 iptables -P INPUT DROP 

希望这会解决你的问题。 让我们知道,如果包计数器或默认的政策是不是我所假设的。