异地组网实践:从公网IP到P2P直连的技术选型与实战
记录一次NAS远程访问方案的技术选型过程及实践经验
前言
作为一个NAS用户,远程访问一直是刚需。传统的公网IP方案配置复杂、安全风险高,而且在IPv4地址日益紧张的今天,获取公网IP也越来越困难。
本文记录了我从公网IP方案到异地组网方案的技术选型过程,以及实际部署和优化经验,希望对有类似需求的朋友有所帮助。
一、技术背景与需求分析
1.1 核心需求
- 在外网访问家里的NAS(群晖DS920+)
- 远程办公时访问工作室的开发机
- 和朋友异地联机玩游戏(MC、幻兽帕鲁等)
- 延迟要低,速度要快
1.2 传统方案的痛点
方案A:公网IP + DDNS + 端口转发
优点:
- 完全自主可控
- 速度理论上最快
缺点:
- 获取公网IP困难(运营商管控严格)
- 安全风险高(端口暴露在公网)
- 配置复杂(端口转发、防火墙、DDNS)
- 动态IP需要额外配置DDNS服务
方案B:内网穿透(FRP等)
优点:
- 不需要公网IP
- 可以对外提供服务
缺点:
- 需要有公网IP的中转服务器
- 所有流量经过中转,速度慢
- 服务器成本(云服务器月费)
- 配置较复杂
方案C:厂商云服务(QuickConnect等)
优点:
- 官方支持,简单易用
- 不需要任何配置
缺点:
- 速度一般(走厂商中转)
- 依赖厂商服务器稳定性
- 功能受限(只能访问NAS)
1.3 技术选型:异地组网
经过调研,决定尝试异地组网方案(SD-WAN):
技术原理:
通过中心服务器辅助打洞,建立设备间的P2P连接
构建虚拟局域网(Overlay Network)
利用UDP打洞技术穿透NAT
主流开源/商业方案对比:
| 方案 | 开源 | 免费设备数 | P2P | 国内速度 | 学习成本 |
|---|---|---|---|---|---|
| WireGuard | ✅ | 无限 | ✅ | 一般 | 高 |
| Tailscale | 部分 | 3 | ✅ | 一般 | 中 |
| ZeroTier | ✅ | 25 | ✅ | 一般 | 中 |
| 星空组网 | ❌ | 20 | ✅ | 好 | 低 |
最终选择了星空组网,原因:
- 免费额度充足(20设备)
- 国内部署,访问速度快
- 配置简单,降低学习成本
- 有正规VPN许可资质
注:本文不涉及商业推广,纯技术分享。如果追求完全开源,推荐Tailscale或ZeroTier。
二、技术架构与实现原理
2.1 异地组网基本原理
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ 设备A │ │ 中心服务器 │ │ 设备B │
│ (NAT后) │ │ (公网IP) │ │ (NAT后) │
│ │ │ │ │ │
│ 192.168.1.x │ │ 123.45.67.89 │ │ 192.168.2.x │
└──────┬──────┘ └───────┬──────┘ └──────┬──────┘
│ │ │
│ ①发起连接请求 │ │
│─────────────────────────> │
│ │ ②转发连接信息 │
│ │────────────────────────>
│ │ │
│ ③建立P2P连接 (UDP Hole Punching) │
│<───────────────────────────────────────────────>
│ │
│ ④后续数据直接传输(不经过服务器) │
│<═══════════════════════════════════════════════>
2.2 加密机制
传输加密: AES-256-GCM
密钥交换: ECDH(椭圆曲线Diffie-Hellman)
认证方式: 基于Token的身份认证
# 伪代码示例
def establish_connection(device_a, device_b):
# 1. 双方与中心服务器建立TLS连接
tls_session_a = establish_tls(server)
tls_session_b = establish_tls(server)
# 2. 交换公钥,协商密钥
shared_key = ecdh_key_exchange(device_a.pubkey, device_b.pubkey)
# 3. UDP打洞,建立P2P通道
p2p_socket = udp_hole_punching(device_a.nat_info, device_b.nat_info)
# 4. 使用AES-256加密所有P2P流量
encrypted_channel = aes256_encrypt(p2p_socket, shared_key)
return encrypted_channel
2.3 NAT穿透技术
NAT类型与P2P成功率:
NAT类型分类(RFC 3489):
- Full Cone (NAT1):完全锥形,P2P成功率 ~95%
- Restricted Cone (NAT2):受限锥形,P2P成功率 ~85%
- Port Restricted (NAT3):端口受限,P2P成功率 ~60%
- Symmetric (NAT4):对称型,P2P成功率 ~10%
不同NAT类型组合的P2P成功率矩阵:
NAT1 NAT2 NAT3 NAT4
NAT1 100% 98% 90% 15%
NAT2 98% 95% 80% 12%
NAT3 90% 80% 50% 8%
NAT4 15% 12% 8% 2%
优化策略:
- 光猫桥接模式(减少NAT层级)
- 路由器启用UPnP(自动端口映射)
- DMZ主机配置(开放所有端口)
三、实战部署
3.1 环境准备
测试环境:
- 设备A:群晖NAS (DSM 7.2),位于家庭网络(移动宽带200M)
- 设备B:Ubuntu Server (22.04),位于工作室(电信500M)
- 设备C:MacBook Pro,移动办公设备
- 设备D:Windows游戏主机
3.2 NAS部署(Docker方式)
# 1. 拉取Docker镜像
docker pull registry.cn-beijing.aliyuncs.com/ld_beijing/stars.client:latest
# 2. 运行容器
docker run -d \
--privileged \
--net=host \
--name stars-client \
--restart=unless-stopped \
registry.cn-beijing.aliyuncs.com/ld_beijing/stars.client:latest
# 3. 访问Web管理界面
# http://NAS_IP:7725
# 4. 使用子账号登录(在管理后台预先创建)
# 登录后会分配虚拟IP:192.168.188.x
3.3 Linux服务器部署
# 1. 下载客户端
wget https://download.example.com/stars-linux-amd64.tar.gz
# 2. 解压
tar -xzf stars-linux-amd64.tar.gz
# 3. 安装
sudo ./install.sh
# 4. 配置systemd服务
sudo systemctl enable stars-client
sudo systemctl start stars-client
# 5. 登录
stars-cli login -u subaccount -p password
# 6. 查看状态
stars-cli status
# Virtual IP: 192.168.188.2
# Connection: P2P (Direct)
# Latency: 18ms
3.4 网络优化配置
光猫桥接配置(以华为光猫为例):
# 1. 获取超级管理员密码(咨询运营商或网上查找算法)
# 2. 登录光猫管理界面:http://192.168.1.1
# 3. 进入"网络" -> "宽带设置"
# 4. 将连接模式从"路由"改为"桥接"
# 5. 在路由器中配置PPPoE拨号
路由器UPnP配置(以OpenWrt为例):
# 安装UPnP包
opkg update
opkg install miniupnpd luci-app-upnp
# 编辑配置
vi /etc/config/upnpd
config upnpd config
option enabled 1
option enable_natpmp 1
option enable_upnp 1
option external_iface 'wan'
option internal_iface 'lan'
# 重启服务
/etc/init.d/miniupnpd restart
四、性能测试与分析
4.1 测试环境
- 节点1(家庭):移动200M(上传50Mbps)
- 节点2(工作室):电信500M(上传100Mbps)
- 测试工具:iperf3、ping、curl
4.2 延迟测试
# P2P直连模式
$ ping 192.168.188.2
64 bytes from 192.168.188.2: icmp_seq=1 ttl=64 time=18.2 ms
64 bytes from 192.168.188.2: icmp_seq=2 ttl=64 time=17.8 ms
64 bytes from 192.168.188.2: icmp_seq=3 ttl=64 time=18.5 ms
# 中转模式(P2P失败时)
$ ping 192.168.188.2
64 bytes from 192.168.188.2: icmp_seq=1 ttl=64 time=45.3 ms
64 bytes from 192.168.188.2: icmp_seq=2 ttl=64 time=46.1 ms
结论: P2P模式延迟接近真实物理网络延迟,中转模式增加约25-30ms。
4.3 带宽测试
# iperf3带宽测试
$ iperf3 -c 192.168.188.2 -t 60
# P2P模式结果
[ 5] 0.00-60.00 sec 350 MBytes 48.9 Mbits/sec receiver
# 分析:接近上传带宽上限(50Mbps),说明P2P直连有效
# 中转模式结果
[ 5] 0.00-60.00 sec 75 MBytes 10.5 Mbits/sec receiver
# 分析:受限于免费版转发带宽(10Mbps)
4.4 实际应用测试
场景1:远程访问NAS
# SMB文件传输
$ smbclient //192.168.188.1/backup -U username
smb: \> get large_file.zip
getting file \large_file.zip of size 1073741824 bytes (1GB)
# P2P模式:传输速度 5.2 MB/s(约42Mbps)
# 中转模式:传输速度 1.1 MB/s(约9Mbps)
场景2:游戏联机(我的世界)
延迟:P2P模式 20-25ms,中转模式 50-60ms
体验:P2P流畅,中转模式略有延迟但可玩
场景3:远程桌面(RDP)
# 连接命令
$ rdesktop 192.168.188.2:3389
# P2P模式:画面流畅,操作无延迟感
# 中转模式:有轻微卡顿,但可接受
五、安全性分析
5.1 威胁模型
潜在威胁:
- 中间人攻击(MITM)
- 流量分析(Traffic Analysis)
- 服务端数据泄露
- 客户端漏洞利用
5.2 防护措施
传输安全:
- 端到端加密(AES-256)
- 完美前向保密(PFS)
- 证书固定(Certificate Pinning)
认证安全:
- 双因素认证(2FA)
- 子账号隔离
- 设备指纹识别
网络安全:
- 不开放公网端口
- 虚拟局域网隔离
- 访问控制列表(ACL)
5.3 与其他方案的安全对比
| 方案 | 端口暴露 | 加密 | 身份认证 | 审计日志 |
|---|---|---|---|---|
| 公网IP+端口转发 | ❌高风险 | ⚠️看服务 | ⚠️看服务 | ❌无 |
| FRP内网穿透 | ⚠️中等 | ✅有 | ✅有 | ⚠️简单 |
| 异地组网 | ✅低风险 | ✅强 | ✅强 | ✅完善 |
六、问题与解决方案
6.1 P2P连接失败
问题:两个设备都在NAT4网络下,无法建立P2P连接。
解决方案:
# 1. 检查NAT类型
$ stars-cli nat-detect
NAT Type: Symmetric (NAT4)
# 2. 优化网络配置
- 方案A:光猫改桥接(推荐)
- 方案B:路由器开启UPnP
- 方案C:配置DMZ主机
# 3. 如果无法优化,使用中转模式
- 免费版10Mbps够日常使用
- 或升级到专业版(20Mbps)
6.2 连接不稳定
问题:P2P连接经常断开重连。
排查步骤:
# 1. 检查网络质量
$ mtr -r 192.168.188.2
# 查看丢包率和延迟波动
# 2. 检查防火墙规则
$ sudo iptables -L -n
# 确保没有误拦截UDP流量
# 3. 查看客户端日志
$ stars-cli logs
# 分析断连原因
解决方案:
- UDP端口被ISP限速:换端口或换协议(如果支持)
- 路由器不稳定:更换固件(如OpenWrt)或设备
- NAT会话超时:调整keep-alive间隔
6.3 IPv6环境适配
问题:只有IPv6地址,如何配置?
配置方法:
# 1. 确认IPv6连通性
$ ping6 2400:3200::1
# 2. 客户端配置
# 异地组网通常支持IPv4/IPv6双栈
# IPv6环境下P2P成功率更高(较少NAT问题)
# 3. NAS配置
# 群晖控制面板 -> 网络 -> 网络接口
# 启用IPv6,选择"自动"配置
七、最佳实践总结
7.1 部署建议
网络优化优先级:
1. 光猫桥接(优先级最高,效果最明显)
2. 路由器UPnP(次优先,配置简单)
3. DMZ配置(最后选择,安全性略低)
设备配置建议:
- 服务器/NAS:固定虚拟IP
- 移动设备:动态IP即可
- 使用子账号隔离,不要共用主账号
- 定期检查在线设备列表
7.2 监控与维护
日常监控:
# 1. 检查连接状态
$ stars-cli status
# 2. 查看流量统计
$ stars-cli stats
# 3. 测试延迟
$ ping 192.168.188.x
# 4. 查看系统日志
$ journalctl -u stars-client -f
定期维护:
- 每月:检查客户端版本,及时更新
- 每季度:审计设备列表,删除不用的设备
- 每半年:更换子账号密码
- 每年:备份配置文件
7.3 成本分析
方案对比:
| 方案 | 初始成本 | 年度成本 | 学习成本 |
|---|---|---|---|
| 公网IP+DDNS | ¥0 | ¥60-600 | 高 |
| 云服务器中转 | ¥0 | ¥600+ | 中 |
| 异地组网(免费版) | ¥0 | ¥0 | 低 |
| 异地组网(专业版) | ¥0 | ¥120 | 低 |
ROI分析:
- 节省时间成本:不用折腾公网IP和复杂配置
- 降低安全风险:不暴露端口,减少攻击面
- 提升使用体验:P2P直连,速度快延迟低
八、参考资料
8.1 技术文档
- RFC 3489: STUN - Simple Traversal of UDP Through NATs
- RFC 5389: Session Traversal Utilities for NAT (STUN)
- RFC 5766: Traversal Using Relays around NAT (TURN)
- RFC 8445: Interactive Connectivity Establishment (ICE)
8.2 相关技术
- WireGuard: https://www.wireguard.com/
- Tailscale: https://tailscale.com/
- ZeroTier: https://www.zerotier.com/
- P2P NAT穿透原理:https://bford.info/pub/net/p2pnat/
九、总结
经过几个月的实践,异地组网方案完全满足了我的需求:
优点:
- ✅ 配置简单,10分钟上手
- ✅ P2P直连,速度接近本地网络
- ✅ 安全性高,不暴露端口
- ✅ 费用低廉,免费版够用
- ✅ 跨平台支持,生态完善
缺点:
- ⚠️ 依赖服务商,不能完全自主可控
- ⚠️ P2P成功率受NAT类型影响
- ⚠️ 免费版转发带宽有限
适用场景:
- 个人NAS远程访问
- 小团队内网互联
- 异地游戏联机
- 移动办公场景
- IoT设备远程管理
对于有类似需求的技术人员,推荐尝试异地组网方案。相比传统的公网IP+DDNS方案,在易用性、安全性、成本等方面都有明显优势。
关于开源方案:
如果你更倾向于完全自主可控的开源方案,推荐:
- Tailscale(基于WireGuard,客户端开源)
- ZeroTier(完全开源,可自建Planet)
- Nebula(Slack开源的SD-WAN方案)
本文首发于个人博客,转载请注明出处。
技术交流欢迎评论或私信。

浙公网安备 33010602011771号