如何使用 IPTables 关闭某些端口上所有现有的 TCP 连接?

如何使用 IPTables 关闭某些端口上所有现有的 TCP 连接?

假设我有一个快速的网络分区测试想要运行,例如断开 ReDiS 集群的两个部分之间的连接,并且我想使用 IPTables 暂时断开一组服务器与另一组服务器的连接。

这与 fedora 邮件列表中提出的问题非常相似:

https://www.redhat.com/archives/rhl-list/2006-January/msg03380.html

EXISTING,RELATED如果我在输出中没有看到iptables --list,我是否需要担心这一点?

EXISTING,RELATEDfedora 邮件列表中的以下答案似乎说是的,如果我在输出中没有看到,现有连接将关闭iptables --list

https://www.redhat.com/archives/rhl-list/2006-January/msg03396.html

给那些有反射行为的举报人一个提示:这个问题,更重要的是,它的答案,将讨论 IPTables 是否放弃现存的规则更新后的连接。

据我所知,本网站上有关此主题的其他问题并未解决现有连接和尝试连接之间的差异:

如何关闭除通过 IPTABLES 列出的网络之外的所有网络的某些 TCP/UDP 端口(传入)

我的大部分研究结果都是通过 Google 搜索得到,网址链接如下:

https://duckduckgo.com/?q=iptables+close+existing+connections

答案1

没有 iptables 规则会关闭现有的 TCP 连接,因为这需要主动传输带 FIN 位的消息。这是由应用程序完成的,而不是由数据包过滤器完成的。

另一方面,iptables 可以随时阻止您的应用程序通过任何现有连接接收或传输新数据包,并且还可以拒绝建立任何新连接。

无论您是否拥有状态防火墙。

这一切都取决于你插入新防火墙规则的具体位置。因为,请记住,防火墙规则是按照列出的顺序进行检查的并且处理将在第一次决定性匹配时停止。

即一个简单的状态防火墙:

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
                     #1  < INSERT NEW RULE HERE
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
                     #2  < INSERT NEW RULE HERE
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
                     #3  < INSERT NEW RULE HERE
-A INPUT -j REJECT --reject-with icmp-host-prohibited
                     #4  < iptables -A WILL APPEND NEW RULE HERE
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

现在如果你想要一条新规则:

INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

并将其插入位置#1,从该主机接收的所有数据包将被阻止。

将该规则插入位置#2,现有连接上的数据包仍将被允许,但不能建立新的连接。

在位置#3 插入该特定的新规则是无用的,因为其效果与根本没有针对 10.0.0.89 的特定策略相同,但这将是放置规则以授予其他端口对 10.0.0.89 的访问权限的正确位置。

iptables -A INPUT 使用追加新的规则添加到 INPUT 链是无用的,因为这会将规则置于位置#4,而该位置上的所有流量已被规则拒绝INPUT -j REJECT --reject-with icmp-host-prohibited

简而言之:使用规则编号选项iptables -I(而不是ipatbles -A)将新(临时)规则放置在能够产生预期效果的位置:

sudo iptables -I <rule number> INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable

如果在相同的状态防火墙配置下,您想要停止允许纯 HTTP,则可以删除允许流量到端口 80 的规则

sudo iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT

但这样做不会清空 iptables 使用的会话状态表,并且规则仍将允许到端口 80 的现有连接-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

您可以通过简单地停止/重新启动 Web 服务器来解决这个问题,它将通过发送 FIN 消息正确关闭那些打开的会话并将其从会话状态表中清除。

或者,您可以在位置#1处添加一条阻止数据包到端口 80 的规则。

相关内容