Networking

Conntrack 和動態 ipset/iptables 規則

  • June 3, 2019

我不了解 conntrack 模組的一些基本概念。

首先,我確定它已在我的系統(Ubuntu 18.04)中啟用,modinfo顯示有關 nf_conntrack 的資訊,並且/proc/modules文件告訴 nf_conntrack 是“實時的”。

其次,我有以下測試設置:

機器 A (192.168.1.2) <—–> 路由器機器 (192.168.1.1 & 192.168.2.1) <—-> 機器 B (192.168.2.2)

在路由器機器上,我有以下 iptables 規則:

iptables -t filter -A FORWARD -m set --match-set BlackListPort dst -j DROP

BlackListPort 是一個 ipset 表。

現在我建立了從機器 A (1.2) 到機器 B (2.2) 的 SSH 連接。在我確認它有效後,我將埠 22(SSH 預設)添加到 BlackListPort 表。

SSH 連接凍結/掛起,直到我從該 ipset 表中刪除埠 22。

現在的問題是:由於我的系統中存在 conntrack,為什麼 SSH 阻止成功?SSH 連接是在埠 22 添加到 ipset 之前建立的,因此 conntrack 應該跳過所有數據包,允許 SSH 工作。

SSH 連接是在埠 22 添加到 ipset 之前建立的,因此 conntrack 應該跳過所有數據包,允許 SSH 工作。

這是不正確的。

所有數據包都將通過過濾規則進行處理,無論它們是否屬於被跟踪的連接。

這是 iptables 規則的一個非常常見的優化,將這樣的內容放在相關規則鏈的開頭附近(FORWARD在您的範例中):

iptables -t filter -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

在較舊的發行版上,您可能會看到此版本:

iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

(我知道conntrack匹配現在比state匹配更受歡迎。我認為一些核心版本甚至會嘮叨你。)

如果存在連接跟踪資訊,這將允許屬於現有連接的數據包通過。但關鍵是,可以控制該規則的確切放置位置,或者是否使用它。因此,您可以讓防火牆規則盡可能多地或盡可能少地關心連接狀態。

引用自:https://unix.stackexchange.com/questions/522568