Linux 网络路由到来自不同子网的虚拟 IP 地址

Saa*_*lik 6 linux routing tcp router

linux 网络新手,有一个关于从不同子网路由到虚拟 IP 地址的问题。

我有三台服务器(它们都可以互相ping通):

A 10.10.51.182(连接路由器Y)
B 10.10.51.183(连接路由器Y)
C 10.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  
Run Code Online (Sandbox Code Playgroud)

每个虚拟接口都模拟一个摄像头设备,带有摄像头模拟软件。

在服务器B 上,我添加了以下路由:

# route add -net 192.168.0.0 netmask 255.255.0.0 eth0
Run Code Online (Sandbox Code Playgroud)

瞧,B可以访问/ping 机器A的虚拟接口。

位于不同子网 (10.10.60.0) 上的服务器C添加了此路由,但即使我对它的工作也抱有极低的希望:

# route add -net 192.168.0.0 netmask 255.255.0.0 eth0
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,我无法访问服务器A的虚拟接口,因此我删除了路由并使用路由器Y 的网关 ip 添加了以下路由:

# route add -net 192.168.0.0 netmask 255.255.0.0 gw 10.10.51.1 eth0
SIOCADDRT: Network is unreachable
Run Code Online (Sandbox Code Playgroud)

网关 10.10.51.1 可由服务器C ping 通,但是我认为错误消息暗示gw不直接位于同一子网 (10.10.60) 上。

可以在服务器A和/或C上配置哪些配置/路由,以便C ping/访问服务器A的虚拟接口。我无权更改路由器的配置。

但是,如果仅使用更改服务器的配置绝对不可能,请有人用网络术语解释为什么B可以访问A 的虚拟接口,而C无法访问它们。路由器Y是否看到来自C 的绑定到“192.168.0.0”的数据包并自动丢弃它们,而当来自同一子网 ( B ) 的数据包被允许时?

Ulr*_*gel 5

简单的解决方案在两个服务器之间创建一个隧道,例如:

在服务器 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
Run Code Online (Sandbox Code Playgroud)

最后一个命令是将数据包从新创建的隧道设备转发到虚拟以太网设备。

在服务器 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
Run Code Online (Sandbox Code Playgroud)

根据服务器之间的防火墙,您可能需要调整一些规则。

解释: 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
Run Code Online (Sandbox Code Playgroud)