iptables 在环回上拒绝 tcp-reset

Har*_*ris 6 networking tcp loopback iptables

我正在尝试检查软件在出现网络故障时的行为方式。该软件正在使用tcpsend()recv()进行通信。

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

sudo iptables -A INPUT -p tcp -s 10.100.52.234 -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)

让我们假设10.100.52.234是其中一个系统的 IP。这导致一瞬间的失败。一切都很好。


现在,我正在尝试使用 loopback address 在一台机器上模拟这一点127.0.0.1。一切都像以前的设置一样工作,但上面的命令不起作用。它不会使网络连接失败,软件只是挂起。没有发生通信,但也不会失败。

我已经使用了命令

sudo iptables -A INPUT -p tcp -s 127.0.0.1 -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)

sudo iptables -A INPUT -p tcp -i lo -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)

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

是否有不同的方法可以立即使环回地址的连接失败?

Kam*_*ski 4

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

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


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

您应该连接到127.0.0.2此处有解释)并制定规则,如下所示:

sudo iptables -I INPUT 1 -p tcp -d 127.0.0.2 -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)

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

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

Connection refused

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