我有一台带有一个网卡的 Ubuntu 14.04 服务器。该 NIC 上的 MAC 地址(由数据中心的网关)在一个子网 (XXX0/24) 中分配一个 IP (XXX100),网关位于同一子网 (XXX1) 中,并且从完全不同的子网中分配了一个附加 IP 范围子网 (YYY0/28)。
我已在同一接口 (eth0) 上设置了 XXX100 和 YYY1 的服务器,并且该服务器可以通过这两个 IP 地址与 Internet 的其余部分进行联系并被其他部分联系。
我有一些虚拟机使用第二个子网的 IP 地址。我假设他们必须使用主机的第二个 IP 地址 YYY1 作为网关地址(因为据我所知,由于数据中心的网关地址位于不同的子网中,他们将无法访问数据中心的网关地址)。我拥有的所有 IP 地址 XXX100 和 YYY0/28 都在数据中心的网关上静态路由,因此任何发往它们的请求都将到达我的服务器的 NIC。它还将仅接受来自该 NIC 上的 MAC 地址的请求,而不接受来自虚拟机的 MAC 地址的请求。
如何设置主机,以便所有发往或来自 YYY0/28 子网的请求都通过数据中心的网关 XXX1 路由?
据我所知,我不能简单地扩展网络掩码,因为这可能导致无法联系网络上的其他服务器。
这是服务器的/etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address X.X.X.100
netmask 255.255.255.0
gateway X.X.X.1
dns-nameservers 8.8.8.8 8.8.4.4
iface eth0 inet static
address Y.Y.Y.1
netmask 255.255.255.240
在/etc/sysctl.conf
我启用了这一行:
net.ipv4.ip_forward=1
VM 使用 YYYn(其中 n>1)作为 IP 地址,使用 YYY1 作为网关。
通过上述设置,虚拟机可以通过其两个 IP 地址联系主机,但不能联系其他主机。我认为虚拟机无法找到 ISP 网关 XXX1 的 MAC 地址:
$ arp -an
? (X.X.X.1) at c8:60:00:5e:bd:e0 [ether] on eth0
? (Y.Y.Y.1) at <incomplete> on eth0
然而奇怪的是,他们有时可以...
$ arp -an
? (X.X.X.1) at c8:60:00:5e:bd:e0 [ether] on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] on eth0
这两个例子仅相隔几分钟。我有一种 ping 虚拟机的感觉,特别是 ping从VM 加快了获取 MAC 地址的过程,尽管这可能纯粹是偶然的。
当它“拥有”MAC 地址 og XXX1 时,一切实际上都正常!我可以从虚拟机访问 Internet,并使用其 YYYn 地址从 Internet 访问它们。但它并不是一直有效 - 有时它会再次“忘记”YYY1 的 MAC 地址,并且变得无法访问。
实际上,我很惊讶它在 ARP 列表中列出了 YYY1 - 我认为这仅适用于同一子网中的设备。我的目标是让他们只使用主机作为网关地址(YYY1),并通过让主机进行 XXX0/24 上的所有通信来避免问题。
我的配置合理吗?
还有其他人使用这个配置吗?
奇怪的“健忘”可能是什么原因造成的?
更新:
我尝试强制虚拟机直接使用数据中心网关的 MAC 地址,而不是主机的 IP 地址作为网关 - YYY1 - 但问题仍然存在:
$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at c8:60:00:5e:bd:e0 [ether] PERM on eth0
raw@test-server:~$ sudo arp -s Y.Y.Y.1 cc:e1:7f:07:e0:af
raw@test-server:~$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
raw@test-server:~$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From Y.Y.Y.3 icmp_seq=1 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=2 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=3 Destination Host Unreachable
From Y.Y.Y.3 icmp_seq=4 Destination Host Unreachable
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3001ms
pipe 3
只有当存在 XXX1 的 ARP 条目时,它才能正常工作,但我无法使用 arp -s 手动添加它(错误消息:)SIOCSARP: Network is unreachable
,并且我不知道是什么导致它随机出现或消失:
$ arp -an
? (X.X.X.1) at cc:e1:7f:07:e0:af [ether] on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
raw@test-server:~$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=5.92 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=6.13 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=6.13 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=54 time=6.13 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3008ms
rtt min/avg/max/mdev = 5.929/6.083/6.138/0.118 ms
几分钟后,它又消失了:
$ arp -an
? (X.X.X.1) at <incomplete> on eth0
? (Y.Y.Y.1) at cc:e1:7f:07:e0:af [ether] PERM on eth0
答案1
由于您的数据中心操作员似乎不太了解路由的工作原理(您需要一个位于子网内部的网关才能正常工作),因此您需要添加一个静态虚拟条目,arp
其中包含网关的 MAC 地址和 IP 地址是在您的子网内(并且未使用!)。
使用未使用的 YYY0/28 地址之一,并假装它是网关(也许它是应该无论如何都是YYY1)。使用该 IP 地址作为路由表中的网关。现在,arp
使用该地址分配一个静态条目arp -s Y.Y.Y.x c8:60:00:5e:bd:e0
,以便您的虚拟机不会打扰 arp 请求(硬件地址已经在 ARP 表中)并将其发送到网关。
解释:
通常,当系统想要联系其子网上的另一台主机时,该系统将使用 ARP 来查找具有所请求 IP 地址的 MAC 地址。然后主机将响应 ARP 请求;如果没有,您最终会收到“主机无法访问”错误。
现在您有一个主机(网关路由器)由于某种原因不在您的子网中。由于您所要做的就是通过该路由器向子网外部的目的地发送 IP 数据包,因此您可以使用伪造的 IP 地址,并使用该伪造的 IP 地址为该路由器创建静态 ARP 表条目。现在,需要前往(或通过)该路由器的所有流量都将被发送到正确的 MAC 地址,而您的系统无需尝试通过 ARP 广播发现该 MAC 地址。
我已经成功地以这种方式配置打印机网关盒:输入其 MAC 地址和免费本地 IP 地址作为静态 ARP 条目,然后 telnet 到该地址并正确配置它。