我必须处理这种情况:一个软件获得了硬编码的 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 错误)