我不同意人们声称这是不可能的,我不知道在思科设备上是否可能,但总的来说肯定是可能的。
有几个问题我们需要处理。
- 路由器需要知道每个目的地在哪个接口上。当您为每个接口分配一个 IP 和子网时,它会隐式创建一个路由,但您现在有两条针对同一目的地的路由,最终只有其中一个会被实际使用。
- 客户端需要将流量发送到路由器。通常客户端会根据子网掩码选择将流量发送到路由器,但这在这里不起作用。
- 显然一些路由平台禁止这样的配置。
第 1 点可以通过添加显式路由来告诉路由器每个终端系统在哪个接口上来解决。
第2点可以通过使用代理arp来解决。
第 3 点只是选择没有这种人为限制的路由平台的问题。例如 Linux。
这是 Linux 上此类设置的一个工作示例,我将使用三个网络命名空间来表示路由器和两个客户端。
#create virtual Ethernet interfaces
ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth3
#create network namespaces
ip netns add clienta
ip netns add clientb
ip netns add router
#put interfaces into network namespaces
ip link set veth0 netns clienta
ip link set veth1 netns router
ip link set veth2 netns router
ip link set veth3 netns clientb
#clienta configuration
ip netns exec clienta ifconfig lo up
ip netns exec clienta ifconfig veth0 192.168.0.2/24 up
ip netns exec clienta ip route add default via 192.168.0.1
#clientb configuration
ip netns exec clientb ifconfig lo up
ip netns exec clientb ifconfig veth3 192.168.0.3/24 up
ip netns exec clientb ip route add default via 192.168.0.1
#router interfaces
ip netns exec router ifconfig lo up
ip netns exec router ifconfig veth1 192.168.0.1/24 up
ip netns exec router ifconfig veth2 192.168.0.1/24 up
#tell the router where each client is
ip netns exec router ip route add 192.168.0.2 dev veth1
ip netns exec router ip route add 192.168.0.3 dev veth2
#now the router can ping the clients (but they can't ping each other yet)
ip netns exec router ping 192.168.0.2
ip netns exec router ping 192.168.0.3
#enable routing on the router
echo 1 | ip netns exec router sponge /proc/sys/net/ipv4/conf/all/forwarding
#for the clients to ping each other we also need the proxy arp
#we could enable generic proxy arp but that is a very dangerous option, better to
#only proxy the things we actually need to proxy
ip netns exec router ip neigh add proxy 192.168.0.3 dev veth1
ip netns exec router ip neigh add proxy 192.168.0.2 dev veth2
#now the clients can ping each other
ip netns exec clienta ping 192.168.0.3
ip netns exec clientb ping 192.168.0.2
#traceroute shows we are actually routing
ip netns exec clienta traceroute -n 192.168.0.3
ip netns exec clientb traceroute -n 192.168.0.2