我在一台 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
问题是我们在私有子网网络服务器上运行网站,它们引用指向 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 到 ,因为它位于完全不同的子网除非你通过一个真正的路由器,从外面再回来。除非你把装有 nginx 的服务器设置为路由器,但从你的评论来看,情况似乎并非如此。所以,这个“无法跨接口和子网 ping 通”是预期行为。