图片仅作示意用途
在很多现场部署环境里,网络管理是相对严格的,设备所在的子网如果需要和办公网所在的服务器通讯,需要通过专门的中间节点,一般还有严格的防火墙配置。此时,研发环境里,服务器与设备子网各节点间的点对点连接,需要通过跨内网和办公网的中间节点中转。中间节点处因为跨越两个物理网络,一般会编制端口映射(另一种实现是VPN)。
但是这样做仍然有问题:有些三方设备的端口是写死的。怎么处理呢?看下面的脚本代码:
#!/bin/bash
echo "start update nat mapping"
container_id=$(docker ps --filter "name=my_app_docker" --quiet)
pidofdocker=$(docker inspect --format '{{.State.Pid}}' $container_id)
# all modified is processing in a different zone
nsenter -t $pidofdocker -n -i /bin/bash <<EOF
iptables -t nat -A OUTPUT -d 192.168.1.3 -p tcp --dport 8000 -j DNAT --to-destination 10.1.3.173:10010
iptables -t nat -A OUTPUT -d 192.168.1.4 -p tcp --dport 8000 -j DNAT --to-destination 10.1.3.173:10011
iptables -t nat -A OUTPUT -d 192.168.1.3 -p tcp --dport 8100 -j DNAT --to-destination 10.1.3.173:10012
iptables -t nat -A OUTPUT -d 192.168.1.4 -p tcp --dport 8100 -j DNAT --to-destination 10.1.3.173:10013
# omit some duplicated setting...
# below is reverse port mapping.
iptables -t nat -A PREROUTING -p tcp --dport 10010 -j DNAT --to-destination :8000
iptables -t nat -A PREROUTING -p tcp --dport 10011 -j DNAT --to-destination :8000
iptables -t nat -A PREROUTING -p tcp --dport 10012 -j DNAT --to-destination :8100
iptables -t nat -A PREROUTING -p tcp --dport 10013 -j DNAT --to-destination :8100
EOF
echo "nat mapping updated yet. docker pid=$pidofdocker docker id=$container_id"
注释一下:
1.如果你的程序直接运行在linux环境,那么直接配置iptables的那个映射关系即可。
2.如果程序在docker里面,需要执行额外的进入相应的网络配置空间的指令。
3.注意nsenter后进入的是一个独立的应用线程。
4.上面的指令,把应用程序发起的一个指向一个private network endpoint: 192.168.1.3:8000的tcp连接,直接转向广域网地址:10.1.3.173:10010,以此类推。
5.注意,出站规则是ip:port => ip2:port2. 入站规则只对端口进行转换:port2 =>port.