Iptables

FedoraCore升級後的困惑:NAT/埠轉發麻煩,POSTROUTING MASQUERADE對轉發埠有意想不到的影響

  • September 20, 2013

在網關/防火牆系統出現硬體故障後,在新硬體上安裝了較新版本的 Fedora Core (17),並使用了 /etc/sysconfig 中的舊 ‘iptables’ 和 system-config-firewall 文件(僅此而已)。FC 的舊版本未知,但可能是 14 或 15,舊磁碟不再可讀。(我把以前的 iptables 文件內容放在下面。)

該系統的工作專門用於:

  1. 接受來自任何網路源的埠 22 (ssh) 以進行本地傳送 (sshd)。
  2. 將埠 222 轉發到內部系統上的埠 22 (ssh),保留原始 IP 地址。
  3. 將埠 25(電子郵件)轉發到內部系統,保留原始 IP 地址。
  4. 將來自內部網路的所有(非埠 22)入站流量轉發到外部網路,沿途應用 NAT/偽裝,並酌情允許相關的外部生成的返回數據包通過。

上面列出的步驟是這個盒子的唯一工作,它以前工作正常。

我開始的地方:

當返回服務時,到埠 22 (sshd) 的所有連接都可以正常工作,並且到所有其他埠的外部連接轉發通過或酌情丟棄,但內部系統看到的 IP 地址是網關的地址,而不是保留其源 IP地址。

當我將系統連接到網路上時,所有關於電子郵件的事情都崩潰了。網關後面的郵件伺服器系統正在根據 IP 地址/系統名稱不匹配拒絕郵件,並且取消檢查會使垃圾郵件過濾系統發瘋。

是偽裝錯誤的界面但是…

敏銳的伺服器故障參與者 DavidSchwartz 指出,內部介面的偽裝已打開(通過 -A POSTROUTING -o eth0 -j MASQUERADE),解釋了內部系統看到網關 IP 地址,但是當更改為反映外部介面時(例如:- POSTROUTING -o eth1 -j MASQUERADE),然後所有轉發停止!是的,我的意思是埠轉發,從外部到內部(內部系統上的埠 222 到埠 22)。

我真的不明白這一點。

為清楚起見,似乎為 INTERNAL 介面打開偽裝,雖然不是預期的,但確實具有允許埠轉發實際從外部到內部發生的積極屬性。切換為偽裝(正確的)EXTERNAL 介面以某種方式禁用埠轉發,因為沒有其他更改。

SNAT 與偽裝

由於有兩個面向外部的“伺服器系統”也有內部介面,這些介面被配置為替代的出站路徑,我查看了它們,發現它們具有非常不同的偽裝技術;沒有像上面引用兩段那樣的行,而是這樣:

-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source <external.v4.ip.addr>  

太好了 - 我明白,有道理,我試試!我註釋掉了 MASQUERADE 行並包括(在同一位置)一個 SNAT 行,如此處所述,耶!它做了兩件事:

  1. 我可以根據需要進行出站網路地址轉換,並且;
  2. 它現在將來自外部到埠 222 的入站連接請求埠轉發到內部系統上的埠 22,並根據需要保留原始 IP 地址。

剩下的問題

不起作用是其他相同轉發的埠 25(將在內部系統上保留埠 25)。

目前這是我必須解決的問題!(而且越早越好!)為什麼一個埠向前而不是另一個?它不是’tcp’類型的埠嗎?如果不是,應該用什麼代替它?(我不認為它是 UDP ……)

不太重要; 很高興知道為什麼舊配置有效,但現在不行!Fedora Core 的區別?更新 IP 表?我依賴錯誤嗎?-微笑-

以下是 iptables 中的兩條埠轉發行:

-A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.64:25
-A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to-destination 192.168.0.64:22

我試過在上面有和沒有尾隨的“:25”。同樣,外部埠 222 轉發到內部系統埠 22 就好了,埠 25 根本不轉發。

請注意,從可以直接看到郵件伺服器系統(而不是通過網關/防火牆)的系統對埠 25 的 telnet 訪問效果很好。另外,我嘗試將埠 24 轉發到埠 25 作為測試並得到相同的結果(無響應)。

這是 iptables 文件:

# eth0 is internal
# eth1 is external

*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

# NO packets get through without this next line:
-A POSTROUTING -o eth0 -j MASQUERADE
# the above line was commented out and replaced with:
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source <external.v4.ip.addr>

-A PREROUTING -i eth1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.64:25

-A PREROUTING -i eth1 -p tcp --dport 222 -j DNAT --to-destination 192.168.0.64:2
2

COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 222 -j ACCEPT

-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -i eth1 -m state --state NEW -m tcp -p tcp -d 192.168.0.64 --dport 25
-j ACCEPT
-A FORWARD -i eth1 -m state --state NEW -m tcp -p tcp -d 192.168.0.64 --dport 22
-j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

我終於解決了這個問題。

好吧,實際上我放棄了它,並在解決另一個問題時找到了答案。

答案是:**內部接收系統必須使用相同的返迴路由——相同的網關/防火牆系統——埠轉發才能正常工作!至少這對於 SMTP 是正確的。**對於 ssh 之類的某些服務似乎並非如此,但通過行為確認,如果預設路由不是轉發連接的系統,則 SMTP(在我的情況下為 Postfix)將無法正常工作。

這對我們這些想要冗餘的人有影響——我希望郵件伺服器能夠從多個網關/防火牆接收轉發的埠。我還沒有弄清楚如何為這種多網關/防火牆策略創建特殊路由,但我知道 iptables 可以做到。

祝你好運!

-A POSTROUTING -o eth0 -j MASQUERADE

您要求它偽裝從內部介面流出的流量,這就是它正在做的事情。偽裝意味著冒充連接的來源。刪除此行,如果出現問題,請添加正確的規則。

引用自:https://serverfault.com/questions/474005