众所周知,现在很多家庭宽带都不再提供公网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
2
3
4
# 说明(当映射成功后,访问公网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为例

1
2
3
4
5
6
7
8
# 安装npm
apt install npm -y
# 设置淘宝源,加速安装模块
npm config set registry https://registry.npm.taobao.org
# 安装pm2
npm install -g pm2
# 设置开机启动
pm2 startup

配置pm2

1
2
3
4
# 刚才测试的ssh穿透命令
pm2 start 'ssh -R 0.0.0.0:222:192.168.1.100:22 root@1.1.1.1'
# 保存当前应用列表
pm2 save

收尾测试

执行 reboot 命令,当系统重启好了之后,访问映射的端口。看是否达到了预期的效果