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