如果没有公网ip,还不想使用第三方的内网穿透服务那么可以自己搭建一个内网穿透服务。

成本: 一个有公网ip的主机。国内国外都可以,国内的相同价位带宽肯定会小。根据自己情况购买
方案: 内网穿透成熟的工具有很多比如Ngrok 、ZeroTier 、frp 等。本文采用frp。
环境: 本文frps服务 安装在了腾讯云轻应用服务器,操作系统版本Ubuntu22/04

Frp简单介绍

frp分为frps和frpc两个服务,可以理解成服务端和客户端。客户端可以把自己的端口映射到远程的服务端上。所以也就有了外网的访问能力。

安装服务端frps

根据上面的理解我们要把frps也就是服务端安装到有公网ip的云服务器上。
github下载地址 根据自己机器架构下载对应版本。
依次执行以下命令

sudo wget https://github.com/fatedier/frp/releases/download/v0.57.0/frp_0.57.0_linux_amd64.tar.gz   #下载对应版本
sudo tar -zxvf frp_0.57.0_linux_amd64.tar.gz   #解压到当前目录
cd frp_0.57.0_linux_amd64/   #进入frp目录
sudo cp frps /usr/bin/     #复制可执行文件
sudo chmod +x /usr/bin/frps   #赋予可执行权限
sudo mkdir /etc/frp    #创建配置文件夹
sudo cp frps.toml /etc/frp/   #复制配置文件到相应文件夹
sudo mkdir /var/log/frp   #创建日志文件存放目录

以上配置执行完我们就可以去配置frps服务了,使用vi编辑/etc/frp/frps.toml。具体配置信息可以参考官方文档。
文档地址。当然如果你如果不想看文档也可以参考我的如下配置
注意: 当前配置只是基础配置,临时用一下没问题。如果长时间使用建议阅读后面的文章。实现frps和frpc的双向认证。

bindAddr = "0.0.0.0"
bindPort = 57000   #服务监听端口,如果你用的是阿里云或者腾讯云等要保证这个端口是打开的,frp默认本身是7000.但是不推荐用默认的所以改成了57000

transport.maxPoolCount = 5

# frps 管理面板信息
webServer.addr = "0.0.0.0"
webServer.port = 7500     #管理面板访问端口,如果你用的是阿里云或者腾讯云等要保证这个端口是打开的
webServer.user = "admin"
webServer.password = "admin"

webServer.pprofEnable = false
enablePrometheus = true

# 日志目录
log.to = "/var/log/frp/frps.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false
detailedErrorsToClient = true
auth.method = "token"
#改成你自己的,一会nas上配置客户端的时候要用
auth.token = "Wb9ET%77ft^5JDy2233232UVnmM4UuH"  

配置完成之后我去吧frps安装成Ubuntu的系统服务,管理起来方便。
执行命令
sudo touch /etc/systemd/system/frps.service #创建frps服务文件
然后用vi编辑该文件写入以下内容

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.toml

[Install]
WantedBy=multi-user.target

编辑保存完成之后我们可以尝试启用服务,执行命令

sudo systemctl start frps
如果没有报错,在执行一下
sudo systemctl status frps

image.png

如果出现这个界面说明我们的frps服务已经正常启动。可以访问一下管理面板看一下。打开浏览器访问你的ip地址后面加7500端口号。例如http://192.168.166.130:7500
新的界面会要求你输入用户名和密码,就是我们上面配置的用户名密码都是admin。输入之后就会看见如下图所示
image8ba04d2d7a009e5b.png

其中Client Counts =0 是因为还没有frp的客户端链接它。代理也是0。到此位置frp的服务端已经搭建完成。

安装frpc

frpc就是frps的客户端,我们想把什么设备的端口映射到外网就安装到哪个设备里面。当前我们的目标是用外网访问我们家中的nas。所以这里以威联通的nas作为案例。
同样需要下载 https://github.com/fatedier/frp/releases/download/v0.57.0/frp_0.57.0_linux_amd64.tar.gz 如果你的是arm架构的请下载对应版本。
下载之后可以解压到nas上的任意位置。我这里推荐是放在nas的public目录下创建一个目录frp_0.57.0_linux_amd64。这样便于管理。这里的public目录指的是/share/Public
这里我和网上大多数文章不一样,他们都喜欢在虚拟机或者docker里面运行frpc。我不喜欢那样。我推荐直接在威联通的系统里直接运行。这样更稳定。

当前我们先要配置frpc,也就是修改我们解压出来的frpc.toml。这里你可以直接用你的Windows电脑或者mac电脑编辑然后覆盖回来。具体内容同样可以参考frp上的官方文档。也可以直接看我下面的

user = "pipiang"
# 改成你自己的frps的公网ip
serverAddr = "192.168.0.130" 
serverPort = 57000

loginFailExit = true

log.to = "/share/Public/frp_0.57.0_linux_amd64/frpc.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false

auth.method = "token"
auth.token = "Wb9ET%77ft^5JDy2233232UVnmM4UuH"

webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"

webServer.pprofEnable = false
transport.poolCount = 5

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 55022

[[proxies]]
name = "http"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000
remotePort = 55000

配置之后就可以启动frpc服务了。用ssh 等了威联通nas的系统
受限你要确认你的ssh开了没。
image76259ac2431434ea.png

如图配置才能登录
登录成功之后执行如下命令

export TERM=xterm

# 开启frpc
screen -dmS frp -U /share/Public/frp_0.57.0_linux_amd64/frpc -c /share/Public/frp_0.57.0_linux_amd64/frpc.toml

然后你就可以通过访问外网的ip加端口的方式访问到家中的nas了。
例如你frps公网ip是123.123.123.123你就可以访问http://123.123.123.123:5000 端口访问你家中的nas
也可以通过ssh nas用户名@123.123.123.123 -p 55022 来远程访问你的nas

目前为止已经实现了通过自建内网穿透服务实现远程访问家中nas的目标。但是这样nas重启之后nas上的frp服务不会自己启动。这就要用到了威联通的autorun.sh。
阅读后续文章就可以实现nas重启之后frpc自己启动了。