通过VLAN的Linux NAT

我有一个VLAN设置通过交换机作为一个中继。 发送标记的VLAN数据包到其各自的端口作为untagged。 在这些是各种设备都需要相同的IP在同一个子网 – 192.168.1.1/24。 在Linux主机上,我已经设置了所有的VLAN接口,并且在同一个子网中为每一个IP分配一个IP,一次只能访问一个192.168.1.1。 所以我知道在这一点上的连接工作。

我现在需要做的就是在不改变设备的IPscheme的情况下,同时在不同的VLAN上与这些设备进行通信。 最理想的是将类似192.168.110.1的stream量通过VLAN 110传送到192.168.1.1,通过VLAN 120传送到192.168.120.1到192.168.1.1等等。 我将如何去创build这个场景,或者甚至可能在两点之间没有临时的三层设备?

我最初的想法是,我需要一个虚拟接口来充当“LAN”客户端,让VLAN接口充当“网关”,然后在那之后转发端口。 看来它应该不那么复杂。

(注意:这将是一个封闭的私人networking,无需任何外部访问,安全性不需要存在,path只需要工作。)

不幸的是,它似乎是一个虚拟机是唯一的,这是可以的。 我决定使用X转发,基本上运行一个小型的虚拟机,以隔离networking与主机。 工程奇迹,而且Linux KVM甚至Virtual Box没有太多的性能损失。 美好时光。

如果我理解正确的话,你需要将具有完全相同IP的多个设备(例如:192.168.1.1/24)插入到不同的VLAN中,以便pipe理它们而不必更改IP地址。 我也想假定你想用Linux主机来pipe理networking技巧,并将使用一个单独的pipe理主机作为连接到192.168.1.1机器的源。

这是一个棘手的设置,因为相同的IP位于多个广播域。 但是我认为应该可以使用iproute2和策略路由。 每个VLAN都需要自己的路由表(在/ etc / iproute2 / rt_tables中定义)。 你所描述的使用覆盖是一个好主意。 对于每个覆盖子网(例如192.168.110.1),使用mangle表中的iptables PREROUTING条目用fwmark标记数据包。

您可能还需要使用arptables进行一些ARP过滤,以确保没有ARP数据包出错。

看看LARTC的一些例子。 下面的命令基于我们已经完成的大致类似的项目,但是我没有真正尝试过。 你需要尝试一下。 这假定你想连接到另一台机器上的192.168.1.1,而不是Linux上的“一根棍子上的路由器”盒子本身。

# give a useful name to the table number # max table number is 255. echo "110 vlan110" >> /etc/iproute2/rt_tables # disable route path filtering for i in /proc/sys/net/ipv4/*/rt_tables; do echo 0 > $i; done fi iptables -t mangle -A PREROUTING -d 192.168.110.0/24 -j MARK --set-mark 1 # set mark ip rule add fwmark 1 table vlan110 # match on existing mark ip route add 192.168.1.0/24 dev eth0.110 # force connected network to this interface iptables -t nat -A PREROUTING -d 192.168.110.0/24 -j DNAT --to 192.168.1.1 # NAT overlay