从外网 SSH 进局域网,反向代理+正向代理

因为工作需要,需要回家后,能够访问公司局域网的服务器。因此就搞了一个SSH的代理。

机器 IP 访问
公司内网服务器 A 192.168.1.1 可以访问外网
公网服务器 B xxx.xxx.com A可访问到
任意可以访问B的主机 C --- ---

实施步骤

  • 在A上面实现反向代理
ssh -fCNR <port1>:localhost:22 usr_b@xxx.xxx.com

<port1> 为 B 上端口,用来与 A 机器上的22端口绑定。

  • 在B上实现正向代理
ssh -fCNL *:<port2>:localhost:<port1> localhost

<port2> 为本地转发端口,用以和外网通信,并将数据转发到 <port1>。其中的*表示接受来自任意机器的访问。

  • 从C上访问A
ssh -p <port2> user_a@xxx.xxx.com

为了让连接能够稳定可靠,可以使用autossh在网络连接断开时,自动重连,在A上执行下面的语句:

autossh -N -f -i /home/user_a/.ssh/id_rsa -y -o BatchMode=yes -R <port2>:localhost:22 usr_b@xxx.xxx.com

为了更加保险,在远端电脑重启时,自动启动autossh,可以在/etc/rc.local里面添加如下内容:

su - user_a -c "autossh -N -f -i /home/user_a/.ssh/id_rsa -y -o BatchMode=yes -R <port2>:localhost:22 usr_b@xxx.xxx.com"

其中,user_a是A上的用户,且要求B上,已经有了A主机上用户user_a的公钥,这里不在详细描述。

附:SSH 参数解释

-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理

推荐阅读更多精彩内容