假设我有一个想要运行的快速网络分区测试,例如断开 ReDiS 集群的两半,并且我想使用 IPTables 暂时断开一组服务器与另一组的连接。
这与 Fedora 邮件列表中提出的问题非常相似:
https://www.redhat.com/archives/rhl-list/2006-January/msg03380.html
EXISTING,RELATED
如果我在 的输出中没有看到iptables --list
,我是否需要担心这个?
fedora 邮件列表上的以下答案似乎说是的,如果我EXISTING,RELATED
在iptables --list
.
https://www.redhat.com/archives/rhl-list/2006-January/msg03396.html
给反身标记者的注释,在那里:这个问题,更重要的是,它的答案,将讨论 IPTables 是否会在更新其规则时丢弃现有连接。
据我所知,本网站上有关此主题的其他问题并未解决现有连接和尝试连接之间的差异:
如何关闭除通过 IPTABLES 列出的所有网络的某些 TCP/UDP 端口(传入)
我在以下 URL 链接的页面上通过 Google 搜索找到了我的大部分研究结果:
https://duckduckgo.com/?q=iptables+close+existing+connections
任何 iptables 规则都不会关闭现有的 TCP 连接,因为这涉及主动发送带有 FIN 位的消息。这是由应用程序完成的,而不是由数据包过滤器完成的。
另一方面,iptables 可以随时阻止您的应用程序通过任何现有连接接收或传输新数据包,它还可以拒绝建立任何新连接。
这与您是否有状态防火墙无关。
这完全取决于您插入新防火墙规则的确切位置。因为,请记住,您的防火墙规则会按照它们列出的顺序进行检查,并且处理将在第一个决定性匹配时停止。
即一个简单的状态防火墙:
现在,如果您想要一个新规则:
并将其插入位置#1,从该主机收到的所有数据包都将被阻止。
在位置 #2 插入该规则,现有连接上的数据包仍将被允许,但无法建立新连接。
在位置 #3 插入特定的新规则是没有用的,因为效果与根本没有针对 10.0.0.89 的特定策略相同,但这是放置规则以授予对 10.0.0.89 的访问权限的正确位置港口。
并且使用
iptables -A INPUT
将新规则附加到 INPUT 链是没有用的,因为这会将规则放置在所有流量都已被规则拒绝的位置 #4INPUT -j REJECT --reject-with icmp-host-prohibited
。简而言之:使用
iptables -I
(而不是ipatbles -A
)中的规则编号选项将新的(临时)规则放置在具有预期效果的位置:如果使用相同的状态防火墙配置,您想停止允许纯 HTTP,您可以删除允许流量到端口 80 的规则
但是这样做不会清空 iptables 使用的会话状态表,并且规则仍然允许到端口 80 的现有连接
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
您可以通过简单地停止/重新启动网络服务器来解决这个问题,这将通过发送 FIN 消息正确关闭这些打开的会话并将它们从会话状态表中清除。
或者,您可以将规则阻止数据包添加到位置 #1 的端口 80。