![通过 VLAN 进行 Linux NAT](https://linux22.com/image/565946/%E9%80%9A%E8%BF%87%20VLAN%20%E8%BF%9B%E8%A1%8C%20Linux%20NAT.png)
我通过交换机设置了一个 VLAN,用作中继。将标记的 VLAN 数据包以未标记的形式发送到其各自的端口。这些设备上有各种设备,它们都需要同一子网上的相同 IP - 192.168.1.1/24。在 Linux 主机上,我设置了所有 VLAN 接口,并为每个接口分配同一子网中的 IP,这样每次都可以访问 192.168.1.1。所以我知道此时的连接是有效的。
我现在需要做的是找到一种方法,同时与不同 VLAN 上的这些设备进行通信,而无需更改设备的 IP 方案。理想的情况是让 192.168.110.1 流量通过 VLAN 110 流向 192.168.1.1,192.168.120.1 流量通过 VLAN 120 流向 192.168.1.1,依此类推。我该如何创建这种场景,或者说,如果两点之间没有中间的第 3 层设备,是否可能实现?
我最初的想法是,我需要一个虚拟接口作为“LAN”客户端,让 VLAN 接口作为“网关”,然后只需转发该点之后的端口即可。看起来应该没有那么复杂。
(注意:这将是一个封闭的私人网络,没有任何外部访问权限。不需要存在安全性,路径只需正常工作。)
答案1
不幸的是,似乎只能使用虚拟机,不过这也没什么。我决定使用 X 转发,基本上运行一个小型虚拟机,只是为了将网络与主机隔离开来。效果很好,而且使用 Linux KVM 甚至 Virtual Box 时性能损失不大。真是好时光。
答案2
如果我理解正确的话,您需要将具有完全相同 IP(例如:192.168.1.1/24)的多个设备插入不同的 VLAN,以便您无需更改 IP 地址即可管理它们。我还假设您想使用 Linux 主机来管理网络技巧,并使用单独的管理主机作为连接到 192.168.1.1 机器的源。
这是一个棘手的设置,因为相同的 IP 位于多个广播域中。但是我认为使用 iproute2 和策略路由应该可以实现。每个 VLAN 都需要自己的路由表(在 /etc/iproute2/rt_tables 中定义)。使用您描述的覆盖是一个好主意。对于每个覆盖子网(例如 192.168.110.1),使用 mangle 表中的 iptables PREROUTING 条目为数据包添加 fwmark 标记。
您可能还需要使用 arptables 进行一些 ARP 过滤,以确保没有 ARP 数据包走错路。
看看拉拉训练中心举几个例子。以下命令基于我们做过的大致类似的项目,但我还没有真正尝试过。您需要进行一些实验。这假设您想从另一台机器连接到 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