由于某些原因,需要将从外网访问到公司内网服务器,开始时尝试了n2n,连接没有成功,只好用老办法了:ssh S2C连接 和socat,我把它称作SSH远程端口映射。

必须要有一台外网可以访问的主机,现在的VPS很便宜,到搬瓦工上搞了个5.99刀的,访问速度还可以,就是内存小了点,装LNMP无压力,但不推荐使用Apache,内存吃紧。

闲话少说,切入正题,首先是准备工作:

内网主机:A
必要软件:autossh
可选:
取决于你想把什么服务映射出去,比如SSH,FTP,MySQL,HTTP等,可能需要额外安装一些软件
由于我想把http服务映射出去,所以装了nginx,端口也改成了8080,因为主机还有Apache。

外网VPS:B
必要软件:socat
新建一个帐户并设置密码,用于建立SSH连接,命令很简单:

#useradd user1
#passwd user1

1. 内网主机A的操作:
生成密钥对,并ssh-copy-id复制到B:

#ssh-keygen
...
#ssh-copy-id user1@B
#如果SSH端口非22,需要指定端口号
#ssh-copy-id "-p SSH端口 user1@B"

到这里已经可以直接使用密钥登录B了,接下来就是autossh登场了。

#autossh -M 22222 -gNfR 8079:localhost:8080 user1@B
-M 是本机的监控端口,如果检测到连接掉线,会重启保证连接稳定
-gNfR是SSH连接的参数
-g 端口全局可以,也就是说B的8079的端口可以供外网连接,当然防火墙首先要开放这个端口,实际发现并不生效。后面会说到
-f 后台运行
-R 开启远程端口转发
-N 表示只连接远程主机,不打开远程shell

2. 外网VPS B的操作
ssh映射的映射到B的端口是8079,在B上访问是没有问题的,开启防火墙8079,外网访问仍然无法访问,也就是说-g参数没有生效,查了一下资料,发现也有不少人遇到这样的问题,原因未知,暂时找到的解决方法是, 用socat把本地端口8079映射到8080,最后在iptables 里开放8080,这时B的8080端口就能正常访问了,一切OK。

#socat TCP4-LISTEN:8080,reuseaddr,fork TCP4:localhost:8079
#iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
#iptables-save

大部分命令都是凭记忆写的,部分可能有误,大概的思路和步骤是没问题的

ssh非标准端口时 autossh [autossh options] -p someport user@somewhere.com

- EOF -