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 工作。
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
匹配更受歡迎。我認為一些核心版本甚至會嘮叨你。)如果存在連接跟踪資訊,這將允許屬於現有連接的數據包通過。但關鍵是,您可以控制該規則的確切放置位置,或者是否使用它。因此,您可以讓防火牆規則盡可能多地或盡可能少地關心連接狀態。