如何为同一子网做inter vlan

网络工程 思科 路由 转变 子网 网络
2022-02-06 20:58:19

我将两个相同的子网网络(ip:192.168.0.2 & ip:192.168.0.3)配置到 VLAN 中......所以它们不会相互通信......但现在我希望它们相互通信......

为此,我将交换机连接到路由器,但使用了一个相同的子网(ip:192.168.0.1)。对于这两个系统,我都将默认网关设置为(ip:192.168.0.1),并将来自路由器的网关中继到切换但他们仍然没有相互通信..对于不同的子网掩码,这个策略有效......但对于同一个子网它没有发生..我只是想知道为什么它没有发生或者我做错了什么?

3个回答

如果您想消除 VLAN 之间的“障碍”,只需重新配置端口以使用相同的 VLAN ID。

正如 Ron 所指出的,需要一个路由器来启用两个 VLAN(=不同的 L2 段)之间的通信。在您的情况下,这是不可能的,因为两个 VLAN 都使用相同的 IP 子网 - 您需要重新编号其中一个子网(或使用非常尴尬的源和目标 NAT)。

路由不适用于相同(或重叠)的子网,因为发送节点会查询其本地路由表,发现目的地位于本地子网上并尝试 ARP 目标 IP 地址。否则(因为目的地在另一个广播域中),传输将完全失败。静态 ARP 条目也无济于事,因为不同的 VLAN 不直接通信,即。在 L2 上。

路由器在网络之间路由数据包,而不是从一个网络返回到同一个网络。您不能将相同或重叠的网络分配给两个不同的路由器接口。路由器需要为每个 VLAN 提供一个接口,但由于 VLAN 具有相同的网络,因此您不能将两个路由器接口配置为具有相同的网络。路由必须是确定性的,但如果路由器有两个与同一网络连接的接口,它将不知道将数据包发送到哪里。

我不同意人们声称这是不可能的,我不知道在思科设备上是否可能,但总的来说肯定是可能的。

有几个问题我们需要处理。

  1. 路由器需要知道每个目的地在哪个接口上。当您为每个接口分配一个 IP 和子网时,它会隐式创建一个路由,但您现在有两条针对同一目的地的路由,最终只有其中一个会被实际使用。
  2. 客户端需要将流量发送到路由器。通常客户端会根据子网掩码选择将流量发送到路由器,但这在这里不起作用。
  3. 显然一些路由平台禁止这样的配置。

第 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