iptables 拒绝环回上的 tcp-reset

iptables 拒绝环回上的 tcp-reset

我正在尝试检查如果发生网络故障,软件会如何表现。该软件使用 tcpsend()进行recv()通信。

以前,我通过将软件放在局域网上的两台不同机器上来使软件进行通信。因此,为了模拟网络故障,我使用了以下规则。

sudo iptables -A INPUT -p tcp -s 10.100.52.234 -j REJECT --reject-with tcp-reset

假设10.100.52.234是其中一个系统的 IP。这会立即导致故障。一切都很好。


现在,我尝试使用环回地址在一台机器上模拟这种情况127.0.0.1。一切都像以前的设置一样工作,但上述命令不起作用。它没有导致网络连接失败,软件只是挂起。没有发生通信,但也没有失败。

我已经使用命令

sudo iptables -A INPUT -p tcp -s 127.0.0.1 -j REJECT --reject-with tcp-reset

sudo iptables -A INPUT -p tcp -i lo -j REJECT --reject-with tcp-reset

两者都不起作用。软件需要很长时间才能失效。

有没有其他方法可以立即使环回地址的连接失败?

答案1

127.0.0.1我重现了您的结果(在监听时尝试 SSH 连接sshd)。软件确实挂了。

我认为软件正在等待响应或错误消息,但错误消息也符合同一规则并被拒绝。我不知道错误消息是否有连锁反应——我没有调查到那么远。我可能一开始就搞错了,所以如果有人有更好的解释,我会很高兴阅读。


以下是在我的 Debian 中有效的解决方案:

您应该连接到127.0.0.2这里有解释) 并制定如下规则:

sudo iptables -I INPUT 1 -p tcp -d 127.0.0.2 -j REJECT --reject-with tcp-reset

请注意,该-I INPUT 1片段确保规则插入到第一个位置,并优先于ACCEPT环回接口上可能已有的任何规则(就像我在 Debian 中一样)。

我重复了测试(尝试 SSH 连接,这次是127.0.0.2)。它立即失败了

Connection refused

我认为它可以如您所愿工作,因为现在错误消息注定要发生127.0.0.1,因此不会被拒绝规则捕获并能够通过。

相关内容