Networking
如何使用定義的本地 IP 而不是外部 IP
我有一個 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 在對我的問題的評論之一中提到的那樣,我的
iptables
NAT 規則遇到了問題。
- 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文件將其永久化。