桥接虚拟接口和真实局域网

桥接虚拟接口和真实局域网

我必须处理这种情况:一个软件获得了硬编码的 IP 地址(假设它是 196.10.10.100:20000),它将一个套接字绑定到该 IP 地址并将 TCP 和 UDP 流量发送到 196.10.10.9:20000(也是硬编码的)。问题是,要使系统正常工作,应该在不同的主机上安装该软件的多个实例。没有机会修改该软件。

原始设置涉及某种非 RFC 兼容的网络硬件,该硬件将第一个 LAN 中的 MAC 映射到第二个 LAN 中的 MAC。现在需要在没有任何额外网络硬件的情况下对其进行模拟 - 只需每个客户端实例一个热点和一个服务器主机。有(新)服务器软件期望接受数据包并做出响应,每个实例使用单独的 NIC,允许 IP 地址位于任意子网中。

我没有发现服务器部分存在任何问题,但是现在没有办法将具有相同 IP 的主机连接到服务器。我认为使用系统软件来解决这个问题没有问题,但我不知道如何在客户端主机上模拟具有所需 IP 的接口并将流量重定向到服务器,以将流量从服务器发送到客户端软件(该软件认为流量来自不存在的 196.10.10.9)。我认为 softawe 应该在命名空间容器内运行。有人告诉我可以使用 iptables 来桥接它,但我所知道的关于 iptables 的所有内容都是数据包过滤器\NAT 软件。

我有部分解决方案,没有 DMZ 和将流量重定向到正确的 IP

ip netns add vn
ip link add v-eth0 type veth peer name v-local
ip link set v-local netns vn

ip addr add 196.10.10.1/24 dev v-eth0
ip netns exec vn ip addr add 196.10.10.100/24 dev v-local
ip link set v-eth0 up
ip netns exec vn ip link set v-local up

ip netns exec vn ip route add default via 196.10.10.1
echo 1 > /sys/net/ipv4/ip_forward
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 196.10.10.0/255.255.255.0 -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o v-eth0 -j ACCEPT
iptables -A FORWARD -o eth0 -i v-eth0 -j ACCEPT

此设置允许命名空间容器中的进程访问真实网络,但不允许我需要的重定向。假设 eth0 的 IP 为 196.10.20.100,服务器的 IP 为 196.10.20.9。我应该如何修改上述脚本才能

1)将来自 196.10.10.100 并发往 196.10.10.9 的数据包重定向到 196.10.20.9,然后

2)将 196.10.20.100 接收的数据包重定向至 10.10.10.100?

我将v-eth0的地址改为196.10.10.9/24:

ip addr add 196.10.10.9/24 dev v-eth0

并添加了预路由和后路由规则来替换每个方向的源和目标,而不是标准伪装:

iptables -t nat -A PREROUTING  -i v-eth0 -p udp -m udp --dport 20000 -j DNAT --to-dest 196.10.20.9 
iptables -t nat -A POSTROUTING -o eth0 -p udp -m udp --dport 20000 -j SNAT --to-source 196.10.20.100 

iptables -t nat -A PREROUTING  -i eth0 -p udp -m udp --dport 20000 -j DNAT --to-dest 196.10.10.100
iptables -t nat -A POSTROUTING -o v-eth0 -p udp -m udp --dport 20000 -j SNAT --to-source 196.10.10.9 

是这样吗?这样就够了吗?使用 Wireshark,我看到数据包从容器内的软件通过路由器,但由于某种原因,它发现自己无法发送数据包(尽管 Wireshark 日志中没有 ICMP 错误)

相关内容