利用AutoSSH建立SSH隧道,实现内网穿透


当我们使用公司或家中电脑搭建了 Web 服务时,一般不能直接从外网访问,为了实现从外网直接访问到内网的服务,一般会需要用到 内网穿透 技术。常用的内网穿透工具有 NAT 转发、DMZ 主机、AutoSSH、ngrok、frp、花生壳等。下面将会介绍如何通过 SSH 端口转发,使内网主机 A 的服务转发至公网主机 B 上。

需要条件

​ 一台内网主机 A,一台 Linux 公网主机 B。下文以 CentOS7 系统为例。

第一步:公网服务器配置

​ 修改公网主机 B 的 SSH 配置文件/etc/ssh/sshd_config

GatewayPorts yes

​ 这样可以把监听的端口绑定到任意 IP 0.0.0.0 上,否则只有本机 127.0.0.1 可以访问。

​ 重启 sshd 服务

sudo service sshd restart

第二步:安装 AutoSSH 服务

在内网主机 A 上,执行以下命令安装 AutoSSH

yum install autossh

第三步:断线免密登录自动重连

​ ssh 反向链接会因为超时而关闭,如果关闭了那从外网连通内网的通道就无法维持,为此我们需要结合免密码登录及 AutoSSH 来提供稳定的 ssh 反向代理隧道。

​ 1、在内网主机 A 上产生公钥和私钥

ssh-keygen

然后按三次回车执行默认选项生成公钥和私钥。会生成密钥文件和私钥文件 id_rsa,id_rsa.pub 或 id_dsa,id_dsa.pub

​ 2、拷贝秘钥
   在内网主机 A 上继续执行如下命令,将内网主机 A 上的秘钥文件 copy 到公网主机 B 中。

ssh-copy-id  username@ip

其中“username”是公网主机 B 的用户名,ip 为公网主机 B 的 ip,然后按照提示输入公网主机 B 的密码就完成了。

第四步:利用 AutoSSH 实现端口转发

在内网主机 A 上,利用 AutoSSH 建立一条 SSH 隧道

 autossh -M 4010 -NR 80:localhost:4000 username@xxx.xxx.xxx.xxx (-p xxxx)

参数解释:

  • “-M 4010”意思是使用内网主机 A 的 4010 端口监视 SSH 连接状态,连接出问题了会自动重连
  • “ -N”意思是不执行远程命令
  • “-R”意思是将远程主机(公网主机 B)的某个端口转发到本地指定机器的指定端口

代码解释:

  • “80:localhost:4000”意思是将内网主机 A 的 4000 号端口转发至公网主机 B 的 80 号端口上

  • “username@xxx.xxx.xxx.xxx”意思是公网主机 B 的用户名和 IP

  • “-p xxxx”意思是公网主机 B 的 SSH 端口,如果是默认的 22 号端口,则可以不输入.

第五步:监听端口检查

​ 分别检查本地主机 A 及公网主机 B 的端口监听情况,出现如下进程则为正常。

​ 本地主机 A:

[root@localhost ~]# lsof -i:4010
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ssh      6710 lixl    5u  IPv6 0x15699cecfe8a4995      0t0  TCP localhost:altserviceboot (LISTEN)
autossh 46984 lixl    3u  IPv4 0x15699cece41d5e95      0t0  TCP localhost:altserviceboot (LISTEN)

​ 远程主机 B:

[root@localhost ~]# lsof -i:8080
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    9762 root   10u  IPv4 473994      0t0  TCP *:webcache (LISTEN)
sshd    9762 root   11u  IPv6 473995      0t0  TCP *:webcache (LISTEN)

第六步:开启自启动

​ 配置 AutoSSH 开机自启动,输入:

vi /etc/rc.d/rc.local

​ 添加内容:

autossh -M 4010 -fCNR 80:localhost:4000 username@xxx.xxx.xxx.xxx (-p xxxx)
chmod +x /etc/rc.d/rc.local

​ centos7 之后,修改/etc/rc.d/rc.local 启动脚本需要重新赋予可执行权限。

​ 至此完成了端口转发,在相应的应用(如浏览器)中输入公网服务器 B 的 IP+端口即相当于直接访问内网主机 A 的相应服务,大功告成!

常见问题

  • 配置完通过外网 IP 加端口无法访问: 请检查公网服务器防火墙是否开放响应端口。
  • 本地服务重启后,通过外部端口无法访问:这种情况是由于没有检测到通道之前已经断开,AutoSSH 应该有类似的机制,还没有仔细研究。

参考文章


文章作者: 李小龙
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议,转载请注明来源 悟尘记 - 李小龙的博客网站 !
评论
 上一篇
Node.js 必知必会(安装配置、应用实例及同步控制) Node.js 必知必会(安装配置、应用实例及同步控制)
一、Node.js简介Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。于2009年由Google Brai...
2020-01-12
下一篇 
DDD领域驱动设计 DDD领域驱动设计
微服务概念的火热带动了DDD的概念被业界重新认知。在微服务架构设计中,DDD被认为是微服务架构设计的指导思想,贯穿整个软件开发的生命周期。
2019-12-20
  目录