在一台服务器上用 docker 跑了三个服务,A 服务端口 500、B 服务端口 600、C 服务端口 700 ; 这台服务器有三张网卡,都有固定的公网 IP ; 现在需求是使用同一个端口去访问这三个公网 IP,实现 IP1 访问到 A:500,IP2 访问到 B:600,IP3 访问到 C:700 ; 我写了下面的 iptables 规则还是没法访问,各位老哥问题出在哪儿?
iptables -t nat -I PREROUTING -i eth1 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:500
iptables -t nat -I PREROUTING -i eth2 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:600
iptables -t nat -I PREROUTING -i eth3 -p udp --dport 80 -j DNAT --to-destination 127.0.0.1:700
iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 500 -j SNAT --to-source 1.1.1.1
iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 600 -j SNAT --to-source 2.2.2.2
iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 700 -j SNAT --to-source 3.3.3.3
linux 下 ip 命令有个叫 netns 可以单独命名空间,在命名空间里面跑独立的应用,还有可以由自己独立的路由,ip 地址等,以下是一个完整的实例。
#配置 valn
vconfig add eth0 900
ip link set up eth0.900
#配置 netns
ip netns add iot
ip link set dev eth0.900 netns iot
ip netns exec iot ip link set lo up
ip netns exec iot ip link set eth0.900 up
ip netns exec iot ip addr add 192.168.111.254/24 broadcast 192.168.111.255 dev eth0.900
ip netns exec iot ip r add default via 192.168.111.1
ip netns exec iot curl myip.ipip.net
#配置 veth 实现和真实主机互通
ip link add veth0 type veth peer name veth1
ip link set dev veth1 netns iot
## 主机虚拟网卡
ip addr add 172.16.1.1/24 dev veth0
ip link set veth0 up
## ns 虚拟网卡
ip netns exec iot ip addr add 172.16.1.2/24 dev veth1
ip netns exec iot ip link set veth1 up