内网穿透之SSH端口转发

1.场景需求:

有些公司喜欢把svn或者git,或者是内部测试服务器放在公司,一般来说,由于NAT的原因,这种访问是单向的,举个例子,我们可以访问百度的服务器,但是百度服务器是没法访问我们电脑的。

由于只能通过公司内网访问,员工回家之后就无法访问了,安全是安全了,但是万一有个需求需要从公司外部访问呢?

对路由器比较熟悉的童鞋会说:“在路由器上作端口映射转发即可”。这个方案确实可以,但是有2个问题,首先,你得能控制路由器并且可以在上面做设置。其次,一般公司的宽带都没有固定ip,这意味着这个公网ip每隔10-20小时就会变动…

2.场景假设:

  1. 公司内部有一台服务器1,ip地址为: 192.168.1.125,只有公司内部同一网段的设备才能访问

  2. 公司外面有一台公网ip的服务器2,ip地址为: 45.32.127.32,所有人都可以访问

假如我们需要公司外部的人也能访问服务器1需要怎么做呢?解决方案就是采用SSH端口转发,命令如下:

1
ssh -fNR 8000:localhost:80 root@45.32.127.32

还有一点非常重要,你需要在45.32.127.32这台服务器开启ssh一个配置(linux系统里面一般是在/etc/ssh/sshd_config文件):

1
GatewayPorts yes

这段命令的意思是把对服务器2的8000端口请求转发到服务器1的80端口,这样我们访问 http://45.32.127.32:8000 就相当于访问 http://192.168.1.125:80

当然你还可以转发其他端口,比如常见的3306, 22, 21等端口。

3.总结:

上面所说的这种方式又被称为SSH端口远程转发,具体的命令细节这里不作过多解读,与之对应的还有一种方式称为本地转发,其命令如下:

1
ssh -fNL 8000:45.32.127.32:80 root@192.168.1.125

这段命令的意思是把对本地8000端口的请求转发到45.32.127.32的80端口上面去,这时候访问 http://127.0.0.1:8000 就相当于访问 http://45.32.127.32:80

举个例子,你们公司有2台服务器,它们之间可以互联,其中有一台服务器可以上网,但是另一台呢被防火墙挡着了,这时候通过这个命令就可以“翻墙”了。

还有一种方式叫作动态转发,命令如下:

1
ssh -D 50000 root@45.32.127.32。

这种方式其实就是相当于socks代理,他会把本地的所有请求都转发到远程服务器上面,很实用哦,假如说你的那台服务器是在国外的话,你懂的!

最后,有一点需要说明的是,所有的流量都会走中间服务器过,这种端口转发其实就是一种代理,类似于VPN。

其实利用SSH转发我们可以把放在家里的服务器开放给朋友,不过家庭宽带上传速度有限,不拿来商用还是可以滴,商用还是买个正规云服务器靠谱!
还有,这种方式一般都是临时用一下,如果想长期使用,可以尝试一下frp等类似的软件!