Iptables

如何使用 IPTables 關閉某些埠上的所有 existing TCP 連接?

  • November 6, 2018

假設我有一個想要執行的快速網路分區測試,例如斷開 ReDiS 集群的兩半,並且我想使用 IPTables 暫時斷開一組伺服器與另一組的連接。

這與 Fedora 郵件列表中提出的問題非常相似:

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

EXISTING,RELATED如果我在 的輸出中沒有看到iptables --list,我是否需要擔心這個?

fedora 郵件列表上的以下答案似乎說是的,如果我EXISTING,RELATEDiptables --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 可以隨時阻止您的應用程序通過任何現有連接接收或傳輸新數據包,它還可以拒絕建立任何新連接。

這與您是否有狀態防火牆無關。

這完全取決於您插入新防火牆規則的確切位置。因為,**請記住,您的防火牆規則會按照它們列出的順序進行檢查,**並且處理將在第一個決定性匹配時停止。

即一個簡單的狀態防火牆:

[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

您可以通過簡單地停止/重新啟動網路伺服器來解決這個問題,這將通過發送 FIN 消息正確關閉這些打開的會話並將它們從會話狀態表中清除。

或者,您可以將規則阻止數據包添加到位置 #1 的埠 80。

引用自:https://serverfault.com/questions/785691