
我的 Ubuntu 伺服器在兩個不同的子網路上執行兩個網路卡以及它們之間的路由時遇到問題。我們正在運行 Nginx 伺服器作為具有公共子網路和私有子網路的反向代理。
我們正在運行 ubuntu 伺服器 15.04。
這是設定:
eth0 Link encap:Ethernet HWaddr 00:50:56:88:6e:91
inet addr:89.21.20.14 Bcast:89.21.20.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe88:6e91/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:89152 errors:0 dropped:0 overruns:0 frame:0
TX packets:1729 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5552124 (5.5 MB) TX bytes:286442 (286.4 KB)
eth1 Link encap:Ethernet HWaddr 00:50:56:88:16:0b
inet addr:10.150.200.50 Bcast:10.150.200.255 Mask:255.255.255.0
inet6 addr: fe80::250:56ff:fe88:160b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:549 errors:0 dropped:0 overruns:0 frame:0
TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:53395 (53.3 KB) TX bytes:1908 (1.9 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:160 errors:0 dropped:0 overruns:0 frame:0
TX packets:160 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:12960 (12.9 KB) TX bytes:12960 (12.9 KB)
我的網關位於 eth0 上。
當我嘗試從 10.150.200.xx 子網路上的伺服器 ping 89.21.20.14 時,它不起作用,我無法與其通訊。正如我所看到的,流量正在到達 eth0
sudo tcpdump -i eth0 proto \\icmp
我也嘗試從 89.21.20.xx 中的伺服器執行相同的操作並訪問/ping 10.150.200.50,但這也沒有成功。執行 tcpdump 時,我可以看到 ping 到達 eth1
問題是我們的網站在私人子網路 Web 伺服器上運行,它們引用的網域指向 89.21.20.xx 上的公共 IP,因此無法與網站/應用程式通訊。
我認為這是某種路由問題,但不太確定從哪裡開始?
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 89.21.24.1 0.0.0.0 UG 0 0 0 eth0
10.150.200.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
89.21.20.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 89.21.20.1 0.0.0.0 UG 0 0 0 eth0
10.150.200.0 * 255.255.255.0 U 0 0 0 eth1
localnet * 255.255.255.0 U 0 0 0 eth0
答案1
您在評論中聲明您不希望進行子網路遍歷。那麼,您已經得到了這個,並且無法到達eth0
,eth1
反之亦然,因此您的問題已經解決。
但是,如果您還有其他問題,則需要更具體地說明您的問題。 (反向代理是透明發生的,您將無法eth0
從反向代理伺服器進行訪問eth1
,反之亦然,除非經過nginx
反向代理伺服器)。
由於歷史原因保留以下內容。
我很好奇為什麼這個被標記nginx,因為這不是 NGINX 問題,而是您嘗試從內部(eth1
和內部子網路)到外部(eth0
和公共互聯網)而沒有路由器(或配置為路由器的系統)或沒有路由器的情況。充當從內到外的代理(這不是反向代理)。
NGINX 不是代理或路由器。反向代理會說“好的,所以將此請求發送到後端,abc。”然後,它會說“ABC:向我發送回應”,這會將外部發出的初始請求發送到內部伺服器。然後,您將獲得來自 nginx 伺服器後端“abc”的回應。這是由 nginx 回傳給請求客戶端的。
反向代理也只能在外部->內部工作。
反向路徑有效,但只是因為反向代理系統 (nginx) 正在等待來自後端的回應,然後將資料傳回 Web 瀏覽器或遠端用戶端,發出資訊請求並期望回傳回應。
然而,反向路徑不允許您透過遠端代理系統從eth1
反向代理轉到eth0
反向代理 - 這不是 IP 路由的工作方式,為了實現您想要實現的目標,您需要一個真實的路由器可以處理從內部 IP 到外部的網路遍歷,然後返回eth0
反向代理盒上的公共 IP 位址,因此它看起來像這樣:
那麼,這裡的資料遍歷將從內部盒子開始,透過它們所連接的路由器盒子,傳到互聯網,然後從互聯網回到你的eth0
盒子。 (當然是解釋這一點的最基本的方式)。
但是,您的反向代理盒確實不是兼作路由器,因此它不會按照您想像的方式工作。
另一個注意事項:
您無法從內部(轉到eth1
)eth0
直接 ping 到(位於完全不同的子網除非你通過實際的路由器並出去然後再回來。所以,這個「無法跨介面和子網路 ping 通」是預期行為。