基于ssh的内网穿透
众所周知,现在很多家庭宽带都不再提供公网IP了。这样很多家庭设备(自己搭建的NAS)想通过外网自由访问,就变得比较困难。
其实很多问题都有其解决办法的。古语有云:有山就有路,有河就能渡。
解决方案
解决方案有很多种,各种内网穿透服务让人眼花缭乱
- Ngrok
(开源,可以自建) - Ssh、autossh
(可以自建) - Natapp
(基于Ngork的第三方服务) - Frp
(开源,可以自建) - 花生壳
(类似花生壳之类的DDNS也有很多的)
方案对比
名称 | 是否需要自建公网服务器 | 费用 | 缺点 |
---|---|---|---|
Ngrok | 是 | 免费 | 需要学习配置,虽然稍微简单 |
SSH | 是 | 免费 | 步骤繁琐 |
Natapp | 否 | 免费 | 不定期强制更新域名/端口 |
Frp | 是 | 免费 | 需要学习配置,虽然很简单 |
花生壳 | 否 | 免费 | 个人版现在限制比较多,而且必须实名认证了 |
** 这里为什么选择了SSH,这种吃力不讨好的方案呢,其实SSH这种设置过一次之后,后面还是很方便的。
设置公网服务器免密登陆
这个步骤是为后面其他操作打下基础
生成RSA密钥对
在内网机器上执行如下命令,生成用于登陆的密钥对
1 | ssh-keygen -t rsa |
然后一路回车,密钥对生成后位于当前用户下的 .ssh
文件夹中
我这里用的是 root
用户,所以密钥对的路径是 /root/.ssh/
查看公钥
1 | cat /root/.ssh/id_rsa.pub |
公网服务器配置
登陆公网服务器,编辑修改 /root/.ssh/authorized_keys
在这个文件中加入刚才生成的 公钥
编辑 /etc/ssh/sshd_config
,修改 GatewayPorts
为yes。(如果有注释,请取消注释)
重启SSH服务
1 | service sshd restart |
测试穿透
1 | 说明(当映射成功后,访问公网IP:端口A,其实就是访问的内网服务器IP:内网端口) |
注意,这里不能取消,因为我映射的是ssh端口,所以新开一个ssh客户端测试
后台保活
因为这个穿透需要一直开着,如果退出了穿透就失效了。我们这里用pm2保活
为什么用pm2呢,因为公司内部一直用的这个工具,方便好用
安装pm2
这里以ubuntu为例
1 | # 安装npm |
配置pm2
1 | # 刚才测试的ssh穿透命令 |
收尾测试
执行 reboot
命令,当系统重启好了之后,访问映射的端口。看是否达到了预期的效果