Security

iptables conntrack 模組:SNAT(或 DNAT)狀態代替 ESTABLISHED/RELATED?

  • May 9, 2018

現在有一段時間(我相信在 1.3 版中引入),iptablesconntrack模組可以跟踪兩個虛擬狀態,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使用這些“新”SNATDNAT狀態的規則範例,但我還是嘗試ESTABLISHED,RELATEDSNATor替換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 外部的一些不需要的數據包到達內部)。

我認為我的問題可以這樣表述:一個數據包是否可以具有SNATorDNAT狀態而不具有ESTABLISHEDorRELATED狀態(顯然,第一個具有該NEW狀態的數據包除外)?

注意:我試圖記錄這樣的數據包,但據我所知這是不可能的,因為iptables只接受一個--ctstate選項,並且!不能在其中使用(換句話說,我不能說,或者至少找不到方法來比如說,“記錄有SNAT狀態但沒有ESTABLISHED狀態的數據包RELATED”)。如果有另一種我沒有想到的記錄它們的方法,這也將非常受歡迎。

編輯 1:經過反複試驗,我意識到我錯了(因此是描邊文本):一些數據包仍處於狀態INVALID,因此最終被丟棄。

編輯 2:如果使用SNAT/DNAT代替ESTABLISH,RELATED不安全,請提供一些具體範例,說明數據包可能處於前一種狀態而不處於後一種狀態。

感謝@AB 關於日誌記錄的建議,我可以做更多的測試,這裡是結果,以及我自己的問題的答案,希望這能幫助像我一樣在網路上找不到任何東西的其他人關於狀態SNATDNAT,和/或它們替換ESTABLISHED,RELATED匹配的能力。

因此,在一個中等繁忙的家庭網路上(幾台主機通過 SNAT 訪問 Internet,以及一些託管伺服器(HTTP/HTTPS、SMTP、IMAP 等)的虛擬機通過 DNAT 可公開訪問),在五天內,我沒有看到關於處於SNATor狀態的數據包的單行日誌DNAT,而不是ESTABLISHEDor RELATED

SNAT因此,“一個數據包是否可以具有orDNAT狀態而不具有ESTABLISHEDor狀態”這個問題的答案RELATED否定的。

由於我真正擔心的是匹配SNATDNAT代替ESTABLISHED,RELATED允許數據包進入我的 LAN 可能過於寬鬆,起初這似乎讓人放心,但我發現這不是一個好主意。

事實上,相反,這似乎不太寬容:在我使用這些規則進行的測試期間,我看到一小部分但不可忽略的處於RELATED丟棄狀態的數據包,主要是 ICMP 類型 3,程式碼 1 和 3(分別是destination host unreachabledestination port unreachable ),來自Internet,發往我區域網路內的主機。換句話說(如果我對網路的理解正確的話),我的主機嘗試與 Internet 建立一些連接,遠端路由器響應無法建立連接,而我自己的防火牆/路由器主機阻止了這些響應。這可不好。

因此,對於基本問題“ESTABLISHED,RELATEDSNATor替換是否是個好主意”的答案DNAT再次是

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