我正在尝试检查如果发生网络故障,软件会如何表现。该软件使用 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
,因此不会被拒绝规则捕获并能够通过。