Linux 网络新手,有一个关于从不同子网路由到虚拟 IP 地址的问题。
我有三台服务器(它们都可以互相 ping 通):
A10.10.51.182(连接到路由器Y)
乙10.10.51.183(连接到路由器Y)
C10.10.60.10(连接到路由器Z)
在服务器上A,我创建了1000个虚拟接口:
# ifconfig eth0:0 192.168.1.1 netmask 255.255.0.0
# ifconfig eth0:1 192.168.1.2 netmask 255.255.0.0
....
# ifconfig eth0:999 192.168.5.200 netmask 255.255.0.0
每个虚拟接口都用相机模拟软件模拟一个相机设备。
在服务器上乙,我添加了以下路线:
# route add -net 192.168.0.0 netmask 255.255.0.0 eth0
瞧,乙可以访问/ping 机器的虚拟接口A。
服务器C在不同的子网(10.10.60.0)上,添加了这条路由,但即使我对它的工作抱有非常低的希望:
# route add -net 192.168.0.0 netmask 255.255.0.0 eth0
正如预期的那样,我无法访问服务器的虚拟接口A,所以我删除了路由并使用路由器的网关ip添加了以下路由是:
# route add -net 192.168.0.0 netmask 255.255.0.0 gw 10.10.51.1 eth0
SIOCADDRT: Network is unreachable
服务器可 ping 通网关 10.10.51.1C,但是我认为错误消息意味着GW不直接位于同一子网 (10.10.60)。
服务器上可以配置什么配置/路由A和/或C为了Cping/访问服务器的虚拟接口A。我无权更改路由器的配置。
不过,如果仅更改服务器的配置绝对不可能,有人可以用网络术语解释一下原因吗乙可以访问虚拟接口A, 但C无法访问它们。有路由器吗是查看绑定到“192.168.0.0”的数据包C并自动丢弃它们,而当数据包源自同一子网时(乙)获得允许?
答案1
简单的解决方案在两个服务器之间创建隧道,例如:
在服务器A上:
ip tunnel add tunnel mode ipip remote 10.10.60.10
ip addr add 10.1.1.1/24 dev tunnel
sysctl -w net.ipv4.ip_forward=1
最后一个命令是将数据包从新创建的隧道设备转发到虚拟以太网设备。
在服务器C上
ip tunnel add tunnel mode ipip remote 10.10.51.182
ip addr add 10.1.1.2/24 dev tunnel
ip route add 192.168.0.0/16 via 10.1.1.1
根据服务器之间的防火墙,您可能需要调整一些规则。
说明:
Server A
和Server B
处于共享网段,例如,它们可以互相发送数据包,而不需要将数据包发送到各自的网关。这意味着只是尝试直接通过以下方式Server B
解析地址192.168.1.1
ARP并Server A
回复他们。
Server A
并且Server C
位于不同的网段上,例如,如果Server C
只是询问192.168.1.1
(这将是您的路由命令Server C
),它将不会收到任何答复。为了解决这个问题,您通常可以指定如何通过路由表到达特定系统,但只能指定下一跳。似乎router Z
不知道192.168.0.0/24
你必须在两个系统之间创建一条隧道。
一个额外的小提示,您不需要创建虚拟以太网设备,您可以向一个网络设备添加任意数量的 IP 地址,例如:
for first in {1..4} ; do
for second in {1..255} ; do
ip addr add 192.168.$first.$second/16 dev eth0
done
done
答案2
您有几个选择:
- 计算机 C 需要连接到 A 和 B 所在的同一物理网络。
- 路由器 Y 需要具有 192.168.0.0/16 中的地址,路由器 Z 需要通过路由器 Y 到达 192.168.0.0/16 的路由。
- 在计算机C和计算机A之间创建ip-ip(或VPN)隧道;通过隧道接口路由 192.168.0.0/16 的流量。
创建隧道可能是修改的最佳选择仅有的计算机 A 和 C。参见IP-IP 指南的步骤。