图片仅作示意用途
在很多现场部署环境里,网络管理是相对严格的,设备所在的子网如果需要和办公网所在的服务器通讯,需要通过专门的中间节点,一般还有严格的防火墙配置。此时,研发环境里,服务器与设备子网各节点间的点对点连接,需要通过跨内网和办公网的中间节点中转。中间节点处因为跨越两个物理网络,一般会编制端口映射(另一种实现是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)
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
iptables -t nat -A OUTPUT -d 192.168.1.3 -p tcp --dport 8200 -j DNAT --to-destination 10.1.3.173:10014
iptables -t nat -A OUTPUT -d 192.168.1.4 -p tcp --dport 8200 -j DNAT --to-destination 10.1.3.173:10015
iptables -t nat -A OUTPUT -d 192.168.1.3 -p tcp --dport 8300 -j DNAT --to-destination 10.1.3.173:10016
iptables -t nat -A OUTPUT -d 192.168.1.4 -p tcp --dport 8300 -j DNAT --to-destination 10.1.3.173:10017
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,以此类推。