Conntrack 和動態 ipset/iptables 規則

Conntrack 和動態 ipset/iptables 規則

我不明白 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 工作。

答案1

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

這是不正確的。

所有資料包都將透過過濾規則進行處理,無論它們是否屬於追蹤的連接。

將類似的內容放在相關規則鏈的開頭附近(FORWARD在您的範例中)是 iptables 規則的一種非常常見的最佳化:

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。我認為某些內核版本甚至會在這方面對你嘮叨。)

如果屬於現有連接的資料包存在連接追蹤訊息,這將允許它們通過。但重點是,可以控制到底在哪裡你制定了這條規則,或者你是否使用了它。因此,您可以根據需要讓防火牆規則盡可能多或盡可能少地關心連線狀態。

相關內容