Web服务器无法访问同一个数据中心的一台特定机器

我是一名程序员,被推到服务器pipe理的职责,我有一个问题,让我感到困惑。 缺乏知识无疑是罪魁祸首,所以如果可以,请教育我。 🙂

问题概述:由相同的专用主机服务托pipe的两台物理服务器。 一台服务器上的Web服务器(运行在虚拟机上)不能被另一台服务器访问,但可以通过互联网上的任何人尝试访问。

build立:

我们有两台由ServerBeach托pipe的服务器。 两个运行Debian,一个运行VMWare Server 2和两个虚拟机 – 每个运行Debian。 每个虚拟机都运行Apache并提供一个网站。 为了清晰起见,一些 IP:

SERVER#1(eth0):10.0.1.1
SERVER#2(eth0):11.0.0.1
SERVER#2辅助IP(eth0:1) – 对于VM#1:10.0.2.1
SERVER#2辅助IP(eth0:2) – 对于VM#2:10.0.2.2

服务器#2上的虚拟机通过主机专用networking连接到主机:
SERVER#2(vmnet1):192.168.0.1
VM#1:192.168.0.2
VM#2:192.168.0.3

…而服务器#2上的iptables规则将互联网stream量绑定到这些辅助IP,并将目标IP更改到虚拟机,然后再返回从虚拟机到Internet的stream量:

-A PREROUTING -d 10.0.2.1 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.2:80 (...) -A POSTROUTING -s 192.168.0.2 -o eth0 -j SNAT --to-source 10.0.2.1 

这工作。 在互联网上的计算机可以将其浏览器指向http://10.0.2.1 ,并获得运行在虚拟机上的Web服务器。 这种设置(辅助IP是主机上的别名,而不是虚拟机本身)是ServerBeach坚持如何configuration这样的VMWare设置。 它做的工作。

唯一奇怪的是,当服务器#1尝试访问像在Internet上的任何其他客户端的Server#2虚拟机时,它就超时了。 (我通过SSHlogin到服务器#1,并使用链接尝试浏览到该站点,甚至在端口80上进行telnet)

如果我在VM#1上运行tshark,我看到SYN数据包从Server#1到Server#2到VM:

 4.607664 10.0.1.1 -> 192.168.0.2 TCP 44983 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=318986 TSER=0 WS=7 52.596287 10.0.1.1 -> 192.168.0.2 TCP 44983 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=330986 TSER=0 WS=7 (etc...) 

SYN数据包不断发送,但是VM永远不会发回SYN-ACK。

现在,如果我在任何其他计算机上跳转,并在浏览器中转到该URL,则会看到SYN,SYN-ACK和ACK,当然还有后面的stream量(我们将称之为其他系统170.0.0.1):

 8.456176 170.0.0.1 -> 192.168.0.2 TCP 16945 > http [SYN] Seq=0 Win=65535 Len=0 MSS=1460 WS=1 TSV=972883011 TSER=0 8.456243 192.168.0.2 -> 170.0.0.1 TCP http > 16945 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=718068724 TSER=972883011 WS=4 8.522374 170.0.0.1 -> 192.168.0.2 TCP 16945 > http [ACK] Seq=1 Ack=1 Win=66608 Len=0 TSV=972883012 TSER=718068724 (... let the GETs begin! ...) 

同样的事情发生在VM#2上。 服务器#1 外,每个人都可以联系到Web服务器并进行通信。

服务器#1当然可以通过互联网访问任何其他网站。

编辑:如果我从服务器#1运行nmap -sS 10.0.2.1,端口80(和服务器#2设置为传递给VM的任何其他端口)显示为已过滤。 但是,如果我从任何其他机器执行相同的nmap,则端口将显示为“打开”。

我知道这个问题可能很难遵循,我当然也不希望任何人不动手当场想出答案。 但是我想知道是否有人可以回答…什么可能是VM#1从服务器#1获取SYN数据包但不尝试发送SYN-ACK的原因? 我认为这个问题可能与主机有关,但是SYN很明显地做到了虚拟机,看起来只要他们到达虚拟机就忽略它们,但它立即响应来自其他客户机的SYN。

只是在这里寻找线索。

编辑#2:根据kubanskamac的build议,我可能已经find了问题。

在VM#1上,netstat -rn提供:

 Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 

所以,如果我正在阅读这个权利,虚拟机注定10.xxx的任何东西都不会去192.168.0.1(VMWare主机的适配器,唯一的pathVM#1已经到外面的世界)。

那么如何让VM#1至less通过192.168.0.1网关将数据包路由到10.0.1.x呢? 看一下Server#2的netstat -rn,在我看来,如果接收到数据包,它将正确地路由它。

编辑#3:解决!

编辑#2的线索是正确的。 我使用“route”命令回答了我自己的问题:

路由add -net 10.0.2.0 netmask 255.255.255.0 gw 1​​92.168.0.1

最后一个问题:我如何使上述命令成为永久性的?

Server1似乎与Server2的接口eth0:1在同一个子网上,但是你没有提供networking掩码,所以我不确定。

您的POSTROUTING规则只会在Server2决定通过eth0或eth0:1或eth0:2发送数据包之后触发。 要发送数据包,Server2需要找出哪个MAC地址是所需的目的地(它使用ARP来查找MAC)。 如果Server1在不同的子网上,那么应该将数据包发送到默认网关的MAC。 如果Server1位于同一个IP子网(如此显示),则不需要打扰默认网关,而Server2就会尝试将IPparsing为某些可用的MAC。 如果不成功,数据包将无法发送 – 无处可去。

  arp -a # (on Server2) print known MACs netstat -rn # (on Server2 and VM1) print table for IP routing decisions 

你的NAT正在阻碍你。 具体的,返回报文的源地址为dest,不经过NAT设备去NAT。

你知道只有10.xxx可以正常使用,而不是11.xxx? 其他可用的IP是172.16-32.xx和192.168.xx 170.xxx是不可用的。 你提到的IP是假的,所以这可能没有帮助。

服务器1的IP是否列在虚拟机或主机的/etc/hosts.deny文件中?

我认为你已经检查了虚拟机的防火墙规则,以确保它不被丢弃。