假设我有一个快速的networking分区testing,我想运行它,比如断开一个ReDiS集群的两半 ,我想用IPTables来暂时断开一组服务器与其他组的连接。
这与fedora邮件列表上提出的问题非常相似:
https://www.redhat.com/archives/rhl-list/2006-January/msg03380.html
如果我没有看到一个已经存在的EXISTING,RELATED的iptables --list的输出,我是否必须担心这个?
在fedora邮件列表上的下面的答案似乎是说,是的,现有的连接将closures,如果我没有看到一个存在EXISTING,RELATED的输出从iptables --list 。
https://www.redhat.com/archives/rhl-list/2006-January/msg03396.html
对于那些自反的旗手来说,这个问题,更重要的是,它的答案将会讨论IPTable在更新规则时是否会放弃现有的联系。
就我所知,在这个网站上,关于这个主题的其他问题并没有解决现有的和尝试的连接之间的差异:
如何closures除IPTABLES列出的所有networking的某些TCP / UDP端口(传入)
我在以下URL链接的页面中find了Googlesearch的大部分研究结果:
https://duckduckgo.com/?q=iptables+close+existing+connections
任何iptables规则都不会closures现有的TCP连接,因为这涉及到使用FIN位主动发送消息 。 这是由应用程序而不是由数据包filter完成的。
另一方面,iptables可以随时阻止您的应用程序通过任何现有的连接接收或发送新的数据包,也可以拒绝任何build立的新连接。
不pipe你有没有状态防火墙,
这一切都取决于你在哪里插入新的防火墙规则。 因为, 请记住,您的防火墙规则是按照它们列出的顺序进行检查的,并且处理将在第一个决定性匹配处停止。
即一个简单的状态防火墙:
[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,并且现有连接上的数据包仍将被允许,但不能build立新的连接。
在#3位置插入特定的新规则是没有用的,因为效果与根本不具有10.0.0.89的特定策略相同,但是这是放置规则以允许访问10.0.0.89到额外端口。
并且使用iptables -A INPUT 将新规则添加到INPUT链中是没有用的,因为这将把规则放置在位置#4,其中所有通信已经被INPUT -j REJECT --reject-with icmp-host-prohibited rule 。
简而言之:在iptables -I (而不是ipatbles -A )中使用规则编号选项将新(临时)规则放置在具有所需效果的位置:
sudo iptables -I <rule number> INPUT -s 10.0.0.89/32 -j REJECT --reject-with icmp-port-unreachable
如果使用相同的有状态防火墙configuration,您希望停止允许纯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消息并从会话状态表中清除它们来正确closures这些打开的会话。
或者,您可以添加一个阻止数据包到位置#1的端口80的规则。