家里有台NAS想在外网访问?公司内网资源出差时要用?传统内网穿透方案要么贵要么慢,而OpenWRT+Zerotier这对组合就像给你的网络装了"任意门"。Zerotier这个虚拟组网工具,配合OpenWRT路由器的强大功能,能让你在不同网络环境下像在局域网一样互访设备。我实测用手机4G访问家里NAS,传输速度能到5MB/s,比市面上大多数付费方案都快。
这个方案特别适合三类人:一是折腾智能家居的极客,远程控制家里设备不再需要复杂配置;二是小微企业主,用极低成本搭建跨地区办公网络;三是经常出差的白领,随时随地安全访问公司内网文件。最关键的是——完全免费!Zerotier的免费版就支持100个设备组网,对个人和小团队绰绰有余。
别看Zerotier官方说支持各种设备,但实测发现不同OpenWRT设备的性能差异巨大。我用过MT7621芯片的路由器(比如Newifi D2),带机量超过20台时CPU占用会飙升。后来换了x86软路由(J4125处理器),50台设备同时在线都稳如泰山。建议根据设备数量选择硬件:
在OpenWRT的LuCI界面安装Zerotier其实有坑。官方软件源里的版本可能较旧,推荐用SSH连上路由器手动安装最新版:
bash复制opkg update
opkg install zerotier
安装完成后别急着启动,先修改配置文件/etc/config/zerotier,加入以下内容:
config复制config zerotier 'sample_config'
option enabled '1'
option secret 'generate'
option port '9993'
这里有个细节:端口9993是Zerotier默认端口,但有些公共网络会封禁非常用端口。我在酒店网络就遇到过连接问题,后来把端口改成443(HTTPS默认端口)就畅通无阻了。
登录Zerotier官网创建新网络时,建议勾选"Private Network"选项。我有次忘记勾选,结果网络里莫名其妙出现了陌生设备,吓得赶紧重建网络。创建完成后记下16位的Network ID,这个相当于你的虚拟网络身份证。
在OpenWRT的SSH终端执行:
bash复制zerotier-cli join [你的Network ID]
执行后会输出200 join OK,但这时设备还没真正连上。需要回到Zerotier官网,在Members列表里找到你的路由器设备,勾选前面的认证框。我遇到过设备显示为"offline"的情况,通常是防火墙没放行端口,可以用zerotier-cli listnetworks命令查看连接状态。
Zerotier默认会为设备分配192.168.196.x的IP,但这个网段可能和你现有网络冲突。我建议在Zerotier控制台的IPv4 Auto-Assign里改成10.147.17.x这类冷门网段。更专业的做法是手动指定IP,比如把路由器的Zerotier IP固定为10.147.17.1,方便后续管理。
在OpenWRT里配置DHCP时要注意:一定要关闭"Use DNS servers advertised by peer"选项。有次我开着这个选项,结果所有设备DNS都被改成Zerotier的服务器,导致国内网站访问异常。
官方文档给的防火墙规则其实不够全面,我补充几个实战经验:
bash复制# 基础规则(必须配置)
iptables -I FORWARD -i zt+ -j ACCEPT
iptables -I FORWARD -o zt+ -j ACCEPT
iptables -t nat -I POSTROUTING -o zt+ -j MASQUERADE
# 增强规则(提升稳定性)
iptables -I INPUT -i zt+ -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
zt+这个通配符比直接写接口名更可靠,因为Zerotier接口名每次重启都可能变化。MASQUERADE这个规则特别关键,它相当于给数据包"易容",让返回的数据能正确找到路径。有次我忘记加这条规则,结果设备能ping通但所有端口都无法访问。
在Zerotier控制台配置Managed Routes时,很多人填错Via地址。这个地址要填OpenWRT路由器在Zerotier网络中的IP,不是路由器的局域网IP!比如:
我建议开启"Allow Ethernet Bridging"选项,这样跨网段访问时延迟能降低30%。但要注意,开启后需要在OpenWRT里额外配置:
bash复制brctl addif br-lan ztxxxxxx
Zerotier默认会尝试P2P直连,但在复杂网络环境下经常回落到中转服务器。用这个命令可以查看连接模式:
bash复制zerotier-cli listpeers
如果看到"RELAY"字样说明走了中转。我总结出几个提速技巧:
ifconfig ztxxxxxx mtu 1400遇到"node is unknown"错误时,Windows设备可以重启Zerotier服务,而OpenWRT上更彻底的方法是:
bash复制/etc/init.d/zerotier restart
rm -rf /var/lib/zerotier-one/network.d/*
如果设备突然离线,先用ping测试基础连通性,再用tcpdump -i ztxxxxxx抓包分析。有次我发现是ISP封杀了UDP流量,换成TCP模式就解决了:
bash复制zerotier-cli set [NetworkID] allowTCP=1
Zerotier控制台的"Capabilities"功能很多人忽略,其实超好用。比如我想让某台设备只能访问NAS的5000端口,就给它添加规则:
json复制{
"capabilities": [
{
"type": "staticRoute",
"routes": [
{"target": "192.168.1.100/32", "via": null}
]
}
],
"rules": [
{
"type": "MATCH_ETHERTYPE",
"etherType": 2048,
"not": false
},
{
"type": "MATCH_IP_DEST",
"ipRange": "192.168.1.100/32",
"not": false
},
{
"type": "MATCH_IP_PROTO",
"ipProtocol": 6,
"not": false
},
{
"type": "MATCH_IP_DEST_PORT_RANGE",
"start": 5000,
"end": 5000
},
{
"type": "ACTION_ACCEPT"
},
{
"type": "ACTION_DROP"
}
]
}
Zerotier的设备认证依赖证书,长期不更换有安全隐患。我每个月会用这个命令强制更新证书:
bash复制rm /var/lib/zerotier-one/identity.*
/etc/init.d/zerotier restart
执行后需要重新在控制台认证设备。建议配合crontab设置定时任务,但要注意提前在控制台取消"Require Authentication"选项,否则设备会断联。
把家里的智能网关接入Zerotier后,我在公司就能控制所有设备。关键是要在OpenWRT配置端口转发:
bash复制iptables -t nat -A PREROUTING -i zt+ -p tcp --dport 8123 -j DNAT --to 192.168.1.50:8123
这样外网访问10.147.17.1:8123时,流量会自动转到家庭助理的192.168.1.50:8123。实测延迟只有50ms,操作灯具开关几乎无感。
用Zerotier把公司文件服务器和家里NAS组网后,我写了个自动同步脚本:
bash复制#!/bin/sh
rsync -avz --progress --delete -e 'ssh -p 2222' \
user@10.147.17.2:/mnt/data/ /home/backup/
这个方案比某度网盘快10倍,而且传输加密更安全。建议配合inotify-tools工具实现实时同步,文件修改后立即触发传输。