前几天遇到一个需求:发版本每次都得经过有外网的跳板机中转一次,然后从跳板机调脚本发版本到内网机器上,开发那边不想让代码在跳板机再存一次, 问有什么方案?

我的想法两个方案:

1. 用iptables nat端口转发从外网转内网22端口

2. vpn

虽然最后都没用这些,但是我自己用iptables在虚拟机试了下还是可以的,记录下自己的笔记

环境

win10 VMware

一个centos7虚拟机 ip:192.168.174.131 ssh监听22端口虚拟机采用nat方式上网

第一个简单的测试

我想要在win10连接 192.168.131.74 60001端口转到22 实现ssh连接

如果要做nat不管是忘外网转发还是内网还是本机 首先开启内核允许转发

echo "1" > /proc/sys/net/ipv4/ip_forward  #临时生效 很容易忘掉 搞了好几次 规则没错 就是这个原因引起转不通的
iptables -t nat -A PREROUTING -p tcp -d 192.168.174.131 --dport 60001 -j DNAT --to-destination 192.168.174.131:22 

到本机192.168.174.131:60001的数据包 修改目的地址为192.168.174.131:22,然后在win10 用xshell连接 ssh root@192.168.174.131 60001 可以连接ssh

第二个测试

                        

我想要在win10连接 192.168.131.74 60002端口转到192.168.241.221 22 这个ip是用win10拨了vpn后可以连到的机房内网ip,实现ssh连接

iptables -t nat -A PREROUTING -p tcp -d 192.168.174.131 --dport 60002 -j DNAT --to-destination 192.168.241.221:22 

到本机192.168.174.131:60002的数据包 修改目的地址为192.168.241.221:22。

完了发现到外部连接不上,仔细想了下 虽然修改了目的地址 但是包的传输要有来有回,发送给192.168.241.221:22的包的源地址win10的ip,是192.168.241.221到不了的,大概就是这个意思 其实中间还有vpn拨号 虚拟机nat有点复杂。 然后再加一条规则

iptables -t nat -A POSTROUTING  -p tcp -d 192.168.241.221 --dport 22 -j SNAT --to-source 192.168.174.131

这条规则就是修改目的地址的为192.168.241.221:22的包的源地址为192.168.174.131 让到达192.168.241.221:22的包可以回来 再用win10 xshell 连接 ssh root@192.168.174.131 60002 发现可以连接

其实第一次弄会遇到很多问题,最后把问题都解决掉就进步了

----------

开始有个疑问 为什么没有监听60001,60002外部都可以连接?

最后想了下为什么要监听,外部发送数据到网卡 内核是第一道墙,nginx tomcat 处理的80 8080 都是内核传给进程的,可以用netstat -ntalp 看下没有tcp连接, 因为是内核直接处理的此处虚拟机充当路由器作用可以用tcpdump 抓到60001,60002包的进出


一个双网卡场景

主机A双网卡

10.201.3.13  

10.201.5.13

主机B单网卡

10.201.3.62

需求 客户端只能连接5段的A机器,现在要连接主机B的3306 mysql

思路 主机A设置端口转发 将路由前10.201.5.13:60006端口 转发到10.201.3.62:3306

iptables -t nat -A PREROUTING -p tcp -d 10.201.5.13 --dport 60006 -j DNAT --to-destination 10.201.3.62:3306 

 然后数据包过路由

ip r l

10.201.5.0/24 dev br1  proto kernel  scope link  src 10.201.5.13 

10.201.3.0/24 dev br0  proto kernel  scope link  src 10.201.3.13 

192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1 

169.254.0.0/16 dev br0  scope link  metric 1010 

169.254.0.0/16 dev br1  scope link  metric 1011 

169.254.0.0/16 dev br2  scope link  metric 1047 

default via 10.201.3.1 dev br0 



找到10.201.3.0/24 dev br0 proto kernel scope link src 10.201.3.11 这条路由

这个时候修改数据包的原地址为这条路径的src 让到10.201.3.62:3306 的数据包可以回来

iptables -t nat -A POSTROUTING  -p tcp -d 10.201.3.62 --dport 3306 -j SNAT --to-source 10.201.3.13 



客户端Navicat连接10.201.5.13:60006 就连到 10.201.3.62:3306了 大功告成。。。