Networking

如何使用定義的本地 IP 而不是外部 IP

  • August 27, 2014

我有一個 Gentoo Linux 伺服器。伺服器連接到兩個網路:內部和外部。

Internal network ip: 192.168.1.200
External network ip: 192.168.0.2

如果我試圖從伺服器向自身發出請求,它使用外部網路 IP。使用 Wget 連接到 nginx 會給我這個日誌記錄:

server ~ # tail -n 1 /var/log/nginx/error_log
192.168.0.2 - - [27/Aug/2014:19:04:42 +0300] "GET / HTTP/1.1" 200 5 "-" "Wget/1.14 (linux-gnu)"

儘管我直接連接到 192.168.1.200:

server ~ # wget http://192.168.1.200/

路由表(外部網路上的指標更高,但似乎被忽略了): ip route show

server ~ # ip route
192.168.0.0/30 dev wan  scope link  metric 20 
192.168.1.0/24 dev lan  scope link  metric 10 

ip 路由獲取

server ~ # ip route get 192.168.1.200
local 192.168.1.200 dev lo  src 192.168.1.200 
   cache <local> 

如何讓這台機器使用 192.168.1.200 連接到自身,而不是 192.168.0.2?

正如@Patrick 在對我的問題的評論之一中提到的那樣,我的iptablesNAT 規則遇到了問題。

  • eth0:內部網路,192.168.1.200
  • eth1:外部網路,192.168.0.2

我的 NAT 規則是:

$ iptables -t nat -A POSTROUTING ! -o eth0 -j MASQUERADE

這意味著,其輸出目標設備不是介面eth0的所有流量都將被偽裝。本地流量也會發生同樣的事情,因為它來自lo介面。

iptables將NAT 規則修復為:

$ iptables -t nat -A POSTROUTING ! -d 192.168.1.0/24 -j MASQUERADE

我的問題解決了!

如果您執行的每個程序都有這個問題,您應該檢查您的伺服器防火牆規則。確保它僅NAT用於外部目的地。如果你有一個廣泛的NAT規則,你的路由表就沒有意義。

修復防火牆規則後,對於wget,您可以使用--bind-address選項來選擇要使用的介面:

wget --bind-address=192.168.1.200 http://192.168.1.200/

wget 文件

‘–綁定地址=地址’

建立客戶端 TCP/IP 連接時,綁定到本地電腦上的 ADDRESS。ADDRESS 可以指定為主機名或 IP 地址。如果您的電腦綁定到多個 IP,此選項可能很有用。

您可以使用.wgetrc文件將其永久化。

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