iptables conntrack 模組:SNAT(或 DNAT)狀態代替 ESTABLISHED/RELATED?
現在有一段時間(我相信在 1.3 版中引入),
iptables
’ conntrack模組可以跟踪兩個虛擬狀態,SNAT 和 DNAT:SNAT 一種虛擬狀態,如果原始源地址與回复目標不同,則匹配。DNAT 一個虛擬狀態,如果原始目的地與回复源不同,則匹配。
在我的路由器/防火牆主機上,我有一些 SNAT 規則,如下所示:
# SNAT iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP # DNAT iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
經過一番Google搜尋後,我找不到任何
iptables
使用這些“新”SNAT
或DNAT
狀態的規則範例,但我還是嘗試ESTABLISHED,RELATED
用SNAT
or替換DNAT
,如下所示:# SNAT iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -s $FROM_IP -d $TO_IP -m conntrack --ctstate NEW,SNAT -j ACCEPT iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -d $FROM_IP -m conntrack --ctstate SNAT -j ACCEPT iptables -t nat -A POSTROUTING -o $TO_IFACE -s $FROM_IP -d $TO_IP -j SNAT --to-source $SNAT_IP # DNAT iptables -t nat -A PREROUTING -i $FROM_IFACE -d $FROM_IP -p $PROTO --dport $PORT -j DNAT --to-destination $TO_IP iptables -t filter -A FORWARD -i $FROM_IFACE -o $TO_IFACE -d $TO_IP -p $PROTO --dport $PORT -j ACCEPT iptables -t filter -A FORWARD -i $TO_IFACE -o $FROM_IFACE -s $TO_IP -m conntrack --ctstate DNAT -j ACCEPT
它似乎有效~~,而且這種方法至少有一個我注意到的好處:我的防火牆曾經丟棄從我的內部主機到 Internet 的 RST 數據包(因為它們處於
INVALID
狀態),但是使用這種新方法,它們被允許通過~~。不幸的是,雖然方便,但我不確定這種方法是否真的合適,因為我對網路的理論知識不足以理解它是否過於寬鬆(即允許來自我的 LAN 外部的一些不需要的數據包到達內部)。
我認為我的問題可以這樣表述:一個數據包是否可以具有
SNAT
orDNAT
狀態而不具有ESTABLISHED
orRELATED
狀態(顯然,第一個具有該NEW
狀態的數據包除外)?注意:我試圖記錄這樣的數據包,但據我所知這是不可能的,因為
iptables
只接受一個--ctstate
選項,並且!
不能在其中使用(換句話說,我不能說,或者至少找不到方法來比如說,“記錄有SNAT
狀態但沒有ESTABLISHED
狀態的數據包RELATED
”)。如果有另一種我沒有想到的記錄它們的方法,這也將非常受歡迎。編輯 1:經過反複試驗,我意識到我錯了(因此是描邊文本):一些數據包仍處於狀態
INVALID
,因此最終被丟棄。編輯 2:如果使用
SNAT
/DNAT
代替ESTABLISH,RELATED
不安全,請提供一些具體範例,說明數據包可能處於前一種狀態而不處於後一種狀態。
感謝@AB 關於日誌記錄的建議,我可以做更多的測試,這裡是結果,以及我自己的問題的答案,希望這能幫助像我一樣在網路上找不到任何東西的其他人關於狀態
SNAT
和DNAT
,和/或它們替換ESTABLISHED,RELATED
匹配的能力。因此,在一個中等繁忙的家庭網路上(幾台主機通過 SNAT 訪問 Internet,以及一些託管伺服器(HTTP/HTTPS、SMTP、IMAP 等)的虛擬機通過 DNAT 可公開訪問),在五天內,我沒有看到關於處於
SNAT
or狀態的數據包的單行日誌DNAT
,而不是ESTABLISHED
orRELATED
。
SNAT
因此,“一個數據包是否可以具有orDNAT
狀態而不具有ESTABLISHED
or狀態”這個問題的答案RELATED
是否定的。由於我真正擔心的是匹配
SNAT
或DNAT
代替ESTABLISHED,RELATED
允許數據包進入我的 LAN 可能過於寬鬆,起初這似乎讓人放心,但我發現這不是一個好主意。事實上,相反,這似乎不太寬容:在我使用這些規則進行的測試期間,我看到一小部分但不可忽略的處於
RELATED
丟棄狀態的數據包,主要是 ICMP 類型 3,程式碼 1 和 3(分別是destination host unreachable和destination port unreachable ),來自Internet,發往我區域網路內的主機。換句話說(如果我對網路的理解正確的話),我的主機嘗試與 Internet 建立一些連接,遠端路由器響應無法建立連接,而我自己的防火牆/路由器主機阻止了這些響應。這可不好。因此,對於基本問題“
ESTABLISHED,RELATED
用SNAT
or替換是否是個好主意”的答案DNAT
再次是不。