avatar

蜗牛札记

记录技术、生活与一点点折腾

  • 首页
  • PetBoxX
  • 工具软件
  • NAS 折腾
  • Linux 运维
  • VPS & 网络
  • 关于
主页 用 Hysteria2 和 Shadowrocket 实现随时随地高速访问 NAS
文章

用 Hysteria2 和 Shadowrocket 实现随时随地高速访问 NAS

发表于 最近 更新于 最近
作者 Snailszzy
60~77 分钟 阅读

文章定位

这篇文章记录一套实际可用的 NAS 远程访问方案。目标不是把所有流量都丢进 VPN,而是只把访问 NAS 的私网流量精准送进 Hysteria2 隧道,让手机、平板、电脑和 Apple TV 在家里、公司、蜂窝网络、酒店 Wi-Fi 下都能用同一个入口访问 NAS。

这套方案适合后续做成 PPT 或视频教程,用来讲解:

  • 如何用 Hysteria2 搭建高带宽低延迟的 NAS 访问隧道
  • 为什么公网入口和 NAS 服务入口要分开
  • 为什么不要直接暴露 WebDAV、DSM、SMB 到公网
  • 如何用 nas-media.lan 做统一访问入口
  • 如何用 Cloudflare DDNS 解决公司公网 IP 变化的问题

一、最终目标

NAS 位于公司内网:

NAS 内网 IP:10.10.6.78
WebDAV 端口:5005
DSM / Web 管理端口:5050
Hysteria2 Server 端口:8443/UDP
Cloudflare DDNS:nas.example.com
内部统一访问名:nas-media.lan

最终希望所有设备都只记一个 NAS 入口:

nas-media.lan

不同服务用不同端口:

WebDAV / Infuse:nas-media.lan:5005
DSM / 管理页面:nas-media.lan:5050

而公网域名 nas.example.com 只作为 Hysteria2 隧道入口,不直接给 Infuse 当 WebDAV 地址。

二、核心设计思想

这套方案里有两个名字,它们职责不同:

nas.example.com = 公网隧道入口
nas-media.lan    = 隧道内 NAS 服务入口

可以这样理解:

nas.example.com 是进隧道的大门
nas-media.lan 是隧道里面的 NAS 房间

Infuse、Safari、Apple TV 需要访问的是 NAS 服务,所以它们使用:

nas-media.lan:5005
nas-media.lan:5050

Shadowrocket / Hysteria2 节点需要连接的是公网隧道入口,所以它使用:

nas.example.com:8443

三、为什么不直接用 nas.example.com 做 Infuse 地址

nas.example.com 解析到公司公网 IP:

nas.example.com -> 公司公网 IP -> 公司路由器

它后面只开放 Hysteria2 端口:

公网 UDP 8443 -> NAS 10.10.6.78:8443

如果在 Infuse 里填:

WebDAV 地址:nas.example.com
端口:5005

实际访问路径会变成:

Infuse -> nas.example.com:5005 -> 公司公网 IP:5005

除非公司路由器额外开放:

公网 5005 -> NAS 10.10.6.78:5005

否则不会通。

更重要的是,不建议这样做。直接暴露 WebDAV、DSM、SMB 到公网,风险远高于只暴露隧道端口。

推荐做法:

公网只暴露 Hysteria2
WebDAV / DSM / SMB 只在隧道内部访问

四、端口暴露的风险差异

公网暴露的端口分两类。

第一类是隧道入口:

8443/UDP = Hysteria2
51820/UDP = WireGuard

这类端口有协议握手、认证、加密和密钥保护。外部扫描到端口,也不能直接看到 NAS 文件服务。

第二类是 NAS 业务服务:

5005 = WebDAV
5050 = DSM / Web 管理
445  = SMB
22   = SSH

这类服务一旦暴露公网,攻击者可以直接访问登录页面或协议入口,容易被扫描、爆破或利用漏洞。

所以原则是:

可以接受只暴露隧道端口
尽量不要暴露 NAS 业务服务端口

本方案最终只需要:

公网 UDP 8443 -> NAS 10.10.6.78:8443

如果 WireGuard 已经不用,建议关闭公网 51820 转发。

五、为什么使用 nas-media.lan

nas-media.lan 不是必须的名字,只是一个清晰的内部别名。

它的含义是:

nas-media = 媒体 NAS
.lan      = 局域网 / 内部访问

它不依赖公网 DNS,也不会暴露到 Cloudflare。我们只在 Shadowrocket 或本地 Hosts 中手动映射:

外出:nas-media.lan -> 10.10.6.78
家里:nas-media.lan -> 10.10.8.1
公司:nas-media.lan -> 10.10.6.78

不建议用 .local,因为 Apple 设备上 .local 常被 mDNS / Bonjour 接管,可能引起解析异常。

也不建议用 nas.example.com 作为内部服务名,因为它已经承担公网隧道入口职责。

六、整体架构

flowchart LR
    Device["Mac / iPhone / iPad / Apple TV"] --> App["Infuse / Safari"]
    App --> Alias["nas-media.lan"]
    Alias --> Policy["场景规则或 Host 映射"]
    Policy --> Tunnel["Hysteria2 隧道"]
    Tunnel --> Public["nas.example.com:8443/UDP"]
    Public --> Router["公司路由器端口转发"]
    Router --> Server["NAS Hysteria2 Server"]
    Server --> WebDAV["NAS WebDAV 10.10.6.78:5005"]
    Server --> DSM["NAS DSM 10.10.6.78:5050"]

七、NAS 端 Hysteria2 Server

NAS 上运行 Hysteria2 Server,监听 UDP 8443。外部设备并不是直接访问 WebDAV 或 DSM,而是先连接这个 Hysteria2 Server,再由隧道内部访问 NAS 的私网服务。

下面以常见 Linux / Synology NAS 的 SSH 环境为例。不同 NAS 型号 CPU 架构不同,下载二进制时要选择对应版本:

x86_64 / amd64:选择 linux-amd64
ARM64 / aarch64:选择 linux-arm64

1. 登录 NAS

先通过 SSH 登录 NAS,并切换到 root:

ssh <nas-user>@<nas-lan-ip>
sudo -i

示例中的 <nas-lan-ip> 可以理解为 NAS 的内网地址,例如:

10.10.6.78

2. 创建目录

mkdir -p /usr/local/bin
mkdir -p /usr/local/etc/hysteria2
mkdir -p /usr/local/var/log/hysteria2

3. 下载 Hysteria2

到 Hysteria2 的 Release 页面下载对应架构的二进制文件:

https://github.com/apernet/hysteria/releases

如果 NAS 是 x86_64 / amd64,可以类似这样部署:

cd /tmp
wget -O hysteria2 https://github.com/apernet/hysteria/releases/download/app%2Fv2.x.x/hysteria-linux-amd64
install -m 755 hysteria2 /usr/local/bin/hysteria2
/usr/local/bin/hysteria2 version

如果 NAS 是 ARM64,则把下载文件换成:

hysteria-linux-arm64

建议部署时去 GitHub Release 页面复制最新版本链接,不要长期使用旧版本链接。

4. 生成认证密码和混淆密码

Hysteria2 至少需要一个认证密码。为了降低被主动探测的概率,建议同时开启 salamander 混淆。

生成两个随机密码:

AUTH_PASSWORD="$(openssl rand -hex 24)"
OBFS_PASSWORD="$(openssl rand -hex 16)"

echo "AUTH_PASSWORD=${AUTH_PASSWORD}"
echo "OBFS_PASSWORD=${OBFS_PASSWORD}"

保存好这两个值,客户端配置时会用到:

auth password = AUTH_PASSWORD
obfs password = OBFS_PASSWORD

5. 生成 TLS 证书

为了简单部署,可以先使用自签证书。示例使用 nas.example.com 作为证书域名:

openssl req -x509 -newkey rsa:2048 -nodes \
  -keyout /usr/local/etc/hysteria2/server.key \
  -out /usr/local/etc/hysteria2/server.crt \
  -days 3650 \
  -subj "/CN=nas.example.com"

chmod 600 /usr/local/etc/hysteria2/server.key
chmod 644 /usr/local/etc/hysteria2/server.crt

如果使用自签证书,客户端需要开启:

跳过证书验证 / allow insecure

更正式的做法是后续使用 Let's Encrypt 证书,让客户端不再需要跳过证书验证。

6. 写入 server.yaml

把下面配置写入:

/usr/local/etc/hysteria2/server.yaml

示例配置:

listen: :8443

tls:
  cert: /usr/local/etc/hysteria2/server.crt
  key: /usr/local/etc/hysteria2/server.key

auth:
  type: password
  password: <你的认证密码>

obfs:
  type: salamander
  salamander:
    password: <你的混淆密码>

congestion:
  type: bbr

如果用命令生成,可以执行:

cat > /usr/local/etc/hysteria2/server.yaml <<EOF
listen: :8443

tls:
  cert: /usr/local/etc/hysteria2/server.crt
  key: /usr/local/etc/hysteria2/server.key

auth:
  type: password
  password: ${AUTH_PASSWORD}

obfs:
  type: salamander
  salamander:
    password: ${OBFS_PASSWORD}

congestion:
  type: bbr
EOF

chmod 600 /usr/local/etc/hysteria2/server.yaml

7. 前台测试启动

先前台运行一次,确认配置没有语法错误:

/usr/local/bin/hysteria2 server \
  -c /usr/local/etc/hysteria2/server.yaml \
  --log-level info

看到服务正常监听后,按 Ctrl+C 停止,再配置后台服务。

8. 创建 systemd 服务

如果 NAS 支持 systemd,可以创建:

/etc/systemd/system/hysteria2.service

内容如下:

[Unit]
Description=Hysteria2 Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/hysteria2 server -c /usr/local/etc/hysteria2/server.yaml --log-level info
Restart=always
RestartSec=5
StandardOutput=append:/usr/local/var/log/hysteria2/server.log
StandardError=append:/usr/local/var/log/hysteria2/server.log

[Install]
WantedBy=multi-user.target

启用服务:

systemctl daemon-reload
systemctl enable --now hysteria2
systemctl status hysteria2

查看日志:

tail -f /usr/local/var/log/hysteria2/server.log

如果 NAS 不支持 systemd,也可以用 NAS 自带的任务计划或启动脚本,在开机时执行:

/usr/local/bin/hysteria2 server -c /usr/local/etc/hysteria2/server.yaml --log-level info >> /usr/local/var/log/hysteria2/server.log 2>&1 &

9. 确认端口监听

在 NAS 上检查 UDP 8443 是否监听:

netstat -ulnp | grep 8443

或:

ss -ulnp | grep 8443

看到 hysteria2 监听 :8443 即可。

公司路由器只需要转发:

公网 UDP 8443 -> NAS 10.10.6.78 UDP 8443

WebDAV、DSM、SMB 不需要暴露到公网。

10. 客户端对应参数

部署完成后,客户端 Hysteria2 节点需要填写:

服务器地址:nas.example.com
端口:8443
SNI:nas.example.com
跳过证书验证:开启,自签证书时需要
认证密码:server.yaml 中的 auth.password
混淆类型:salamander
混淆密码:server.yaml 中的 obfs.salamander.password

如果证书暂时还是旧域名签发,例如 old-ddns.example.net,则 SNI 暂时填旧证书域名:

服务器地址:nas.example.com
SNI:old-ddns.example.net

后续把证书换成 nas.example.com 后,再统一为:

服务器地址:nas.example.com
SNI:nas.example.com

八、Cloudflare DDNS

公司公网 IP 会变化,所以用 Cloudflare DNS 维护:

nas.example.com -> 当前公司公网 IP

NAS 上定时运行 DDNS 脚本:

/bin/sh /usr/local/bin/cloudflare-ddns.sh

DSM 任务计划建议:

用户:root
日期:每天
首次运行时间:00:00
运行频率:每 5 分钟
最后运行时间:23:55

DNS 记录保持:

类型:A
名称:nas
内容:由脚本自动更新
代理状态:仅 DNS
TTL:120 或自动

注意 Cloudflare 这里必须是“仅 DNS”,不要开启橙色云代理。Hysteria2 是 UDP 隧道服务,不能通过普通 Cloudflare Web 代理转发。

九、三种场景的访问路径

1. 家里

家里路由器运行 Hysteria2 Client,并在路由器上做本地端口转发。

例如:

10.10.8.1:5005  -> Hysteria2 -> NAS 10.10.6.78:5005
10.10.8.1:15050 -> Hysteria2 -> NAS 10.10.6.78:5050

家里配置中:

nas-media.lan -> 10.10.8.1

访问路径:

Infuse / Safari
  -> nas-media.lan:5005
  -> 10.10.8.1:5005
  -> 家里路由器 Hysteria2 Client
  -> nas.example.com:8443
  -> NAS Hysteria2 Server
  -> NAS 10.10.6.78:5005

DSM 管理页面:

Safari
  -> nas-media.lan:15050 或 10.10.8.1:15050
  -> 家里路由器 Hysteria2 Client
  -> NAS 10.10.6.78:5050

如果希望家里也统一使用 nas-media.lan:5050,可以在家里路由器额外把本地 5050 转发到 NAS 5050。否则家里 DSM 使用 15050 也可以。

2. 公司

公司网络下,设备和 NAS 在同一个内网,最佳路径是直连,不需要绕 Hysteria2。

公司配置中:

nas-media.lan -> 10.10.6.78

访问路径:

Infuse
  -> nas-media.lan:5005
  -> NAS 10.10.6.78:5005

DSM 管理:

Safari
  -> nas-media.lan:5050
  -> NAS 10.10.6.78:5050

3. 外部网络 / 蜂窝网络

外部网络下,手机、iPad、Mac 不在公司内网,无法直接访问 10.10.6.78。这时由 Shadowrocket 把 nas-media.lan 的流量送进 Hysteria2 节点。

外出配置中:

nas-media.lan -> 10.10.6.78

Shadowrocket 规则:

DOMAIN,nas-media.lan,OUTSIDENAS

Host 映射:

nas-media.lan = 10.10.6.78

建议保留:

use-local-host-item-for-proxy = true

访问路径:

Infuse / Safari
  -> nas-media.lan:5005 或 nas-media.lan:5050
  -> Shadowrocket Host 映射为 10.10.6.78
  -> DOMAIN,nas-media.lan 命中 OUTSIDENAS
  -> Hysteria2 Client
  -> nas.example.com:8443
  -> 公司路由器 UDP 8443 转发
  -> NAS Hysteria2 Server
  -> NAS 10.10.6.78:5005 或 5050

十、为什么外出时不建议用裸 IP

理论上可以加:

IP-CIDR,10.10.6.78/32,OUTSIDENAS,no-resolve

但在实际测试中,http://nas-media.lan:5050/ 可以访问,而 http://10.10.6.78:5050/ 不一定稳定。这通常和 Shadowrocket 对裸 IP、TUN 路由、私网地址绕过规则有关。

为了让裸 IP 强制进隧道,可能需要移除:

skip-proxy = 192.168.0.0/16
tun-excluded-routes = 192.168.0.0/16
IP-CIDR,192.168.0.0/16,DIRECT

但不建议为了裸 IP 把这些全拆掉,因为它可能影响你访问真实局域网设备。

更推荐的做法是:

把 10.10.6.78 当作底层实现
把 nas-media.lan 当作日常入口

日常只访问:

http://nas-media.lan:5050/
WebDAV: nas-media.lan:5005

十一、为什么不能全局走 NAS 节点

OUTSIDENAS 是“回公司内网访问 NAS”的专用节点,不适合作为普通外网代理。

如果把 Shadowrocket 切到全局 OUTSIDENAS,Google、YouTube、ChatGPT 等流量都会从 NAS 所在的公司网络出去。公司网络可能无法访问这些服务,于是会出现超时。

推荐策略:

OUTSIDENAS:只访问 NAS / 公司内网
PROXY:访问 Google / YouTube / ChatGPT
DIRECT:国内网站或本地网络

规则示例:

DOMAIN,nas-media.lan,OUTSIDENAS
DOMAIN-SUFFIX,google.com,PROXY
DOMAIN-SUFFIX,youtube.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

不要把模式切成全局 OUTSIDENAS。

十二、Infuse 推荐配置

WebDAV 配置:

协议:WebDAV
地址:nas-media.lan
端口:5005
路径:video
用户名:NAS 用户名
密码:NAS 密码
HTTPS/SSL:关闭

这样在不同场景下,Infuse 都只需要记住:

nas-media.lan:5005

底层如何到 NAS,由 Shadowrocket 场景配置或本地路由转发决定。

十三、Shadowrocket 外出配置重点

Hysteria2 节点:

类型:Hysteria2
地址:nas.example.com
端口:8443
SNI:old-ddns.example.net
跳过证书验证:开启
混淆:salamander
认证密码:Hysteria2 server.yaml 中的 auth password
混淆密码:Hysteria2 server.yaml 中的 salamander password

后续如果 Hysteria2 证书换成 nas.example.com,则可以统一为:

地址:nas.example.com
SNI:nas.example.com

规则:

DOMAIN,nas-media.lan,OUTSIDENAS

Host:

nas-media.lan = 10.10.6.78

不要把 nas-media.lan 写成 DOMAIN-SUFFIX,推荐使用完整主机名匹配:

DOMAIN,nas-media.lan,OUTSIDENAS

十四、常见排查方法

1. DDNS 是否正确

dig +short nas.example.com @1.1.1.1

应该返回公司当前公网 IP。

2. NAS 服务是否正常

在 NAS 上测试:

curl -I http://127.0.0.1:5050/
curl -I http://10.10.6.78:5050/
curl -I http://127.0.0.1:5005/

5050 返回 200 OK 代表 DSM / Web 管理服务正常。5005 根路径返回 404 不一定是错误,WebDAV 根路径经常这样。

3. 手机流量是否进入 Hysteria2

在 NAS 上看日志:

tail -f /usr/local/var/log/hysteria2/server.log

如果看到:

client connected
reqAddr: 10.10.6.78:5005
reqAddr: 10.10.6.78:5050

说明手机请求已经进入 Hysteria2。

如果只看到 client connected,没有 reqAddr,说明节点连上了,但应用请求没有按预期进入隧道。

4. Safari 测试要写完整 URL

排查时不要只输入:

10.10.6.78
nas-media.lan

要写完整:

http://nas-media.lan:5050/
http://nas-media.lan:5005/

Safari 有时会自动补 HTTPS 或忽略端口,完整 URL 更可靠。

十五、最终推荐入口

用户日常只记:

nas-media.lan

不同用途:

Infuse / WebDAV:nas-media.lan:5005
DSM 管理页面:nas-media.lan:5050

公网域名只给隧道使用:

Hysteria2 节点:nas.example.com:8443

三种场景:

外出:nas-media.lan -> OUTSIDENAS -> Hysteria2 -> NAS
家里:nas-media.lan -> 10.10.8.1 本地转发 -> Hysteria2 -> NAS
公司:nas-media.lan -> 10.10.6.78 直连

十六、一句话总结

这套方案的关键不是“全局 VPN”,而是“精准隧道”:

只让 NAS 私网服务走 Hysteria2
普通外网继续走原来的代理或直连
公网只暴露隧道端口
NAS 服务端口始终藏在隧道内部

这样既能获得高带宽、低延迟的远程 NAS 体验,也能减少 WebDAV、DSM、SMB 直接暴露公网带来的安全风险。

VPS & 网络
许可协议:  CC BY 4.0
分享

相关文章

7月 10, 2026

用 Hysteria2 和 Shadowrocket 实现随时随地高速访问 NAS

文章定位 这篇文章记录一套实际可用的 NAS 远程访问方案。目标不是把所有流量都丢进 VPN,而是只把访问 NAS 的私网流量精准送进 Hysteria2 隧道,让手机、平板、电脑和 Apple TV 在家里、公司、蜂窝网络、酒店 Wi-Fi 下都能用同一个入口访问 NAS。 这套方案适合后续做成

7月 6, 2026

清理 Ubuntu 系统垃圾:释放磁盘空间的常用方法

在长期使用 Ubuntu 服务器的过程中,系统日志、apt 缓存、旧内核、用户目录缓存等都会逐渐占用大量磁盘空间。尤其是云服务器系统盘较小的情况下,很容易出现根分区 / 空间不足的问题。 本文整理一套常用、安全的 Ubuntu 系统清理方法,适合用于服务器日常维护。 1. 先查看根目录占用情况 在清

7月 2, 2026

在 3x-ui / Xray 服务端配置广告拦截,并兼顾 Netflix 等流媒体解锁

最近我把代理节点统一放在 3x-ui 上管理,同时希望广告拦截尽量放在 VPS 服务端处理,而不是每个客户端单独配置规则。这样无论是 v2rayN、小火箭、OpenClash,还是其他客户端,只要走这个节点,就能共享同一套基础广告过滤规则。 这篇记录一下我在 3x-ui 里配置 Xray 服务端广告

下一篇

上一篇

清理 Ubuntu 系统垃圾:释放磁盘空间的常用方法

最近更新

  • 用 Hysteria2 和 Shadowrocket 实现随时随地高速访问 NAS
  • 清理 Ubuntu 系统垃圾:释放磁盘空间的常用方法
  • 在 3x-ui / Xray 服务端配置广告拦截,并兼顾 Netflix 等流媒体解锁
  • 将 Python Web 小工具部署到 VPS:以 TCC5110 LVDS 寄存器生成器为例
  • 智能爬宠箱报警系统说明

热门标签

Halo PetBox PetBoxX

目录

©2026 蜗牛札记. 保留部分权利。

使用 Halo 主题 Chirpy