Iptables

從內部客戶端到同一網路的目標 NAT

  • April 6, 2012

我有一個充當 NAT(SNAT 和 DNAT)的 DSL 路由器。我已經在內部網路上設置了一個伺服器(埠 43201 上的 10.0.0.2)。DSL 路由器配置為“埠轉發”(或 DNAT)到 10.0.0.2:43201 的所有傳入連接。

我為 DSL 路由器上的埠轉發創建了一個虛擬伺服器。我還為埠轉發添加了以下 iptables 規則。

iptables -t nat -A PREROUTING -p tcp -i ppp_0_1_32_1 --dport 43201 -j DNAT --to-destination 10.0.0.2:43201
iptables -I FORWARD 1 -p tcp -m state --state NEW,ESTABLISHED,RELATED -d 10.0.0.2 --dport 43201 -j ACCEPT

# ppp_0_1_32_1 is routers external interface.
# routers internal IP address is 10.0.0.1 and server is setup at 10.0.0.2:43201

問題是來自外部 IP 地址的連接能夠使用外部 IP 地址訪問內部伺服器,但內部客戶端(在 NAT 下)無法使用外部 IP 地址訪問伺服器。

Example: http://<external_address>:43201 is working from external clients
But, internal clients are not able to access using http://<external_address>:43201

這似乎類似於http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-10.html(NAT HOW-TO Destination NAT On to the Same Network)中描述的問題。

首先,我無法理解為什麼這對內部客戶來說是個問題?其次,什麼 iptables 規則將允許內部客戶端使用外部 IP 地址訪問伺服器?請建議。

這是因為如果您的內部客戶端嘗試使用公共 IP 與伺服器(在同一子網內)通信,它必須通過網關(NAT 框)發送請求。然後網關將執行DNAT從公共 IP 到伺服器私有 IP 的操作,然後轉發它。

在正常情況下,Web 伺服器將請求來自內部客戶端 IP 地址(同一子網)。所以,它會直接發回回复而不通過網關。客戶端將拒絕處理回复,因為它正在發送到公共 IP 並接收來自另一個(私有)IP 的響應。這令人困惑。不是嗎?

一種解決方案是使用來自內部客戶端的私有 IP 與伺服器通信。這可以通過實施 DNS 拆分(內部和外部視圖)來隱藏。

另一種選擇是強制流量(來自/到伺服器)通過網關(NAT 框)。

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