环境描述:
1.设备A IP:192.168.0.2 位置: 上海
2.设备B IP:1.1.1.1 位置: 北京
设备A为甲方提供的实验室中的设备,设备B为乙方公网设备。
应甲方要求,需要在指定的设备A上部署环境、服务,但是进行功能测试时,要通过公网通信。
设备A只有内网IP,可以访问公网,但是公网无法主动访问设备A,所以现在需要把设备A上的服务映射到设备B上。
映射过程:
1.通过SSH端口转发,将设备A的服务映射到设备B上(因为设备B无法主动连接设备A,所以要在设备A上进行SSH远程端口映射)
在设备A上执行:ssh -o ServerAliveInterval=60 -f -N -R 8080:192.168.0.2:8443 test@1.1.1.1
此命令的作用为:将本机上的服务端口8443,映射到设备B(1.1.1.1)的8080端口,当用户访问设备B的8080端口时,请求会转发到本机的8443端口上,具体是如何实现SSH隧道转发,这里不再描述,有兴趣可以自己搜索资料。
Tips:这里有一个参数 -o ServerAliveInterval=60 必须要加上,不加此参数在长时间无操作的情况下ssh会超时,导致映射断开,此参数为每隔60s向ssh server端发送keep-alive包,保持ssh连接,防止超时
2.经过步骤1的操作,此时已经可以在设备B上看到监听的8080端口了,但是你会发现监听的IP为127.0.0.1这个回环地址(ssh远程映射只能映射远程设备的127上,没有任何办法可以改变),127是无法被外界直接访问的,所以这里我们还需要通过防火墙做一个DNAT,改变原始请求的目的地址(端口)
在设备B上执行:iptables -t nat -A PREROUTING -p tcp --dport 8443 -j DNAT --to-destination 127.0.0.1:8080
此命令的作用为:将访问本机8443端口的TCP报文转发至本机的127.0.0.1的8080端口上
Tips:iptables添加以上规则时,Linux系统出于安全考虑,是不允许将请求转发至127.0.0.1这个回环地址上的,所以我们需要修改内核参数。
sysctl -w net.ipv4.conf.eth0.route_localnet=1
此时就可以将报文DNAT到127地址了。
经过以上两步操作,现在访问1.1.1.1:8443端口即访问192.168.0.2的8443端口