Skip to content

内网穿透

前段时间买的 NAS 有内网穿透的需求,主要想在公网上直接访问到我搭建的 immich 相册服务

内网穿透的方案有很多,下面是我研究了解过的一些方案

QuickConnect

我的 NAS 的厂商是群晖,自带 Synology QuickConnect 的功能,可以通过 直接从公网访问到家里的 NAS 机器

但是很多人都反馈这种连接方式很慢,毕竟是免费,所以只能算是能用,还达不到好用的程度

公网服务器转发

说到底,要想公网访问局域网的机器,都逃不过公网服务的转发,如果自己手里已经有公网的服务器在跑,有公网 IP,可以用 fatedier/frp 进行转发

原本我计划租一台公网服务器,比如阿里云或者腾讯云这些厂商,但无奈太贵了,即是 1C2G 的配置,一年也要六七百块钱

我也不是服务器的重度使用用户,算下来是很不值得了

Cloudflare Tunnel

转发还可以使用我们的老好人 Cloudflare 的服务,如果我们已经在 CF 家买过域名那就最好了,可以直接免费使用这个服务进行隧道代理

隧道代理的原理如下:

我们进入 https://www.cloudflare.com/zh-cn/products/tunnel/

选择要创建的 tunnel 的类型之后,建立连接的过程很简单,提供了丰富的安装流程,这里我们选择 docker:

实际上在 NAS 上,我们可以直接去下载 cloudflare/cloudflare 的镜像

启动容器的时候,填入对应的命令 tunnel --no-autoupdate run --token <复制的token>,token 从 Cloudflare Tunnel 获取:

容器启动成功后,我们回到 Cloudflare Tunnel 的控制台,为我们的域名添加二级域名,转发到 NAS 对应端口的服务上,这里我已经配置了三个服务

VPS

经过了解,还有一种和公网服务器转发类似的方式,就是 VPS

VPS 指的是虚拟专用服务器(Virtual Private Server),是一种将物理机分割成多个虚拟服务器的服务

相比于独立的服务器更加经济实惠,是个不二之选择

我之前是使用的 CF 的 Tunnel 的,但由于 CF 服务器是在国外的,这么转发一层,在加上免费的 Tunnel 有速度的限制,我对它是速度还是不太满意

我选择了 https://www.yecaoyun.com/ 家的服务:

这个配置还是很香的,而且最主要的是满足我的需求,有足够的流量(本来我的目的就是访问 NAS 内的资源),也不是很贵

接下来就是用 fatedier/frp 来打洞了,步骤不是很复杂:

  • 服务端:SSH 连接到 VPS,启动 frps 的服务
  • 客户端:NAS 启动 chenhw2/frp 容器的客户端 frpc

一些坑

  • 和 VPS 建立 SSH 连接会一段时间无操作会自动断开,需要自己设置 SSH 不失活
  • VPS 上和 NAS 上安装的 frp 版本最好是相同的,不然很可能连不上

客户端和服务端的配置示例:

[common]
bind_port=7000
kcp_bind_port=7000
token=123456 # 已脱敏,自己随便取一个,和 frpc.ini 上的相同即可
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500 # 配置这个可以用面板看到 frp 的运行情况
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true

# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
[common] 
server_addr = xx.xx.xx.xx # 已脱敏,换成自己 VPS 的地址
server_port =7000 
token = 123456 # 已脱敏,自己随便取一个,和 frps.ini 上的相同即可

[DSM] 
type = tcp 
local_ip =127.0.0.1 
local_port =5000 # 转发我 NAS 上的 5000 端口的服务
remote_port = 5000

[IMMICH]
type = tcp
local_ip = 127.0.0.1
local_port = 2283 # 转发我 NAS 上的 2283 端口的服务
remote_port = 2283
$ wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz
$ tar -zxvf frp_0.59.0_linux_amd64.tar.gz
$ cd frp_0.59.0_linux_amd64
$ ./frps -c frps.toml

启动成功后,我们只修要修改 frpc.ini 的配置,可以指定开放任意多个服务了

经过测试,速度要比 CF 的 Tunnel 速度快上不少,毕竟是付费 😃


我们还可以后台运行 frps,每次机器重启后,自动启动。做法是写入 systemd 文件

执行 vim /etc/systemd/system/frps.service

[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
# 换成自己的路径
ExecStart=/home/frp_0.59.0_linux_amd64/frps -c /home/frp_0.59.0_linux_amd64/frps.toml
Restart= always
RestartSec=1min
# ExecStop=/usr/bin/killall frps
ExecStop=/usr/bin/pkill frps


[Install]
WantedBy=multi-user.target

Cloudflare Origin Rules

在 CF 上买的域名好处挺多了,例如上面说的直接使用 Tunnel 服务,或者是 Origin Rules

我们知道 DNS 的 A 记录,只能把域名转发到具体的 IP 上,而不能指定到某一端口,这就会导致域名带一个后缀端口很难看

Origin Rules 这个功能配合 DNS 使用,我们直接在左侧找到规则下面的 Origin Rules,然后点击创建规则

请求匹配选择「自定义筛选表达式」,我们添加一个主机名和值,值就是我们在 DNS 配置上建的对应的二级域名,然后在下面写重写到具体的某一个端口:

这样就会使得我们使用起来很简洁,一个二级域名对应服务端的某个端口的服务,且 URL 上没有 IP 后缀

Origin Rules 可以建 10 个,还算是够用的

Released under the MIT License.