ssh反向——利用公网服务器连接局域网主机 - Devinwon/article GitHub Wiki

[TOC]

SSH反向——利用公网服务器连接局域网主机

1,需求

程序员的办公电脑一般都是不关机的,以防下班后有突发的需要被老板紧急召回干活。如果是凌晨深夜,那就更惨了。但往往是通勤2小时,干活1分钟。显然,如果能在家里解决,何必劳力费时来到公司呢!那么现在的困惑就是,公司员工的电脑一般都是位于公司内网,没有固定的公网IP,无法从家里直接相连,见图1。

01-cant-conn-direct-2.jpg

​ 图1

如果能连上,就可以在家应急干活。问题是怎么才可以连上呢?

2,方案

无论是家庭个人主机,还是公司办公主机,谁都找不到谁。似乎没有解决的办法。如果能找到一个公共主机拥有固定IP,也就是个人主机和办公主机都认识,那么就可以通过公共主机的桥梁作用(ssh反向),让个人主机和办公主机之间间接相连,如示意图2。
cant-conn-direct-p2-small.jpg
图2

3,实现

  • 开放端口及映射关系
    |主机描述|端口|应用| |:---:|:--:|:--:| |private PC|--|--| |work PC|22|ssh| |public server|2022|映射work PC ssh port(22)| |public server|22|ssh|

  • 首先在work PC上执行操作,让work PC主动连接-->public server,见图3中步骤(1),
    cant-conn-direct-3-step.jpg

    ​ 图3
    命令如下:
    ssh -NfR 2022:work_PC:22 public_server_user_name@public_server -p 22

参数说明:

-f,后台执行  
-N,不实际连接而是做port forwarding
-R,反向ssh

2022<---->22
public server上的2022端口就被映射成了work PC的22端口

public_server_user_name@public_server -p 22
ssh 登录public server,端口是22
  • private PC---->public server,在private PC上通过ssh登录到public PC,图3中步骤(2)。 命令如下:

    ssh public_server_user_name@public_server -p 22 ,这样就远程登录到了public server,如图3中(2)所示。

  • public server上执行端口转发,图3中步骤(3),命令如下:

    ssh public_server_user_name@public_server -p 2022,

    这样端口就被转发到了work PC 的22端口,输入口令信息后就登入到了work PC中。从而通过public server就在private PC---->work PC建立了连接。

4,优化

上述方式中,通过ssh 在work PC主动连接-->public server,会存在掉线退出的情况,需要保持连接。一旦掉线,就再次发起连接,需要借助autoshh。 因此,图步骤1中的命令相应修改为:
autossh -M 9022 -NfR 2022:work_PC:22 public_server_user_name@public_server -p 22

参数说明:

-M 9022:work PC上的端口(9022),用于监听work PC--->public server的ssh连接,一旦断开,就再次连接。
  • 其他问题:
    • 怎么知道端口转发成功呢?图3步骤(1)执行完后,在public serverz中通过netstat -ntlp查看,端口2022被监听就说明成功了。
    • 如何免密码登录,密钥复制到work PC中即可。
    • 如何web映射呢?同样是端口哦

5,可能错误

  • 开启public server端口转发

6,参考

⚠️ **GitHub.com Fallback** ⚠️