除了断开/连接电缆或关闭/打开接口之外,是否可以通过其他方式使程序丢失并恢复其互联网连接?
为了了解该程序对这种情况的反应,这是必要的。
在这种情况下,我感兴趣的是一个程序的行为,因此只要一个应用程序失去连接就足够了,但另一方面,导致所有程序失去连接的解决方案也很好。
我想模拟的一个非编程示例是,当您在计算机和“无论互联网来自何处”之间有一个交换机,并且断开互联网和交换机之间的电缆时。在这种情况下,计算机会失去连接,但该计算机或应用程序无法检测到底发生了什么。
答案1
如果您知道程序应该与之通信的 IP 地址和端口号,一种可能的解决方案可能是使用本地防火墙规则来删除与应用程序相关的所有网络数据包,或者使用--reject-with
根据您想要模拟的确切中断类型自定义类型。
在下面的示例中,我将使用iptables
术语,这些术语本质上应该适用于firewalld
没有重大变化的情况,但相同的概念应该适用于nftables
或实际上任何防火墙管理系统。
只是删除所有内容:模拟本地网关之外某处的网络中断(即与本地网段和网关的连接仍然有效,但根本没有来自该区域之外的数据包到达系统。这会导致网络连接超时。真正的故障情况,一旦路由器等开始检测到故障,这可能最终会变成......
使用 REJECT
--reject-with icmp-[host|net]-unreachable
:与以前相同,但现在模拟路由器已检测到连接丢失,并向尝试通过故障链路进行连接的任何主机报告错误。这应该会导致应用程序比超时情况更快地检测到连接丢失并向用户报告错误。 (当然,有人可能阻止了假定的故障位置和您的系统之间的 ICMP 错误响应,因此所有连接失败都将类似于“DROP everything”情况。)
其他可能的情况:
丢弃从配置的 DNS 解析器服务器的端口 53 传入的任何响应(TCP 和 UDP):这模拟 DNS 服务器故障。现有连接将有效,与已知 IP 地址的连接仍将有效,但通过主机名的连接将失败。
在与应用程序相关的 TCP 端口上: REJECT 使用
--reject-with tcp-reset
模拟应用程序所需的服务未在远程主机上运行,但远程主机本身工作正常的情况。 (换句话说,这模拟了远程主机正在重新启动或正在进行某种维护并关闭其应用程序相关服务。)