用 Hysteria2 和 Shadowrocket 实现随时随地高速访问 NAS
文章定位
这篇文章记录一套实际可用的 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 直接暴露公网带来的安全风险。