对于家宽没有公网 IP 的情况,想要访问家里的 NAS 等设备就需要进行内网穿透。开源的 frp、nps 等工具可以方便地实现内网穿透,但目前这些工具的 P2P 穿透能力较差,强烈依赖于服务端的进出口带宽,而 ZeroTier 可以实现内网穿透,由官方提供通讯服务器,并且他对 P2P 穿透的支持性比较强。

关于 ZeroTier 的注册方法网上已经有很多教程,这里不再赘述。

安装 ZeroTier

ZeroTier 官网提供了多种平台的客户端下载,可自行下载安装。

路由器 (Padavan/OpenWRT)

官网暂时没有提供对应平台的版本,需要使用 opkg 从 Entware 源下载。
最新的软件包可能会有兼容性问题,如果启动时出现如下的警告信息:

WARNING: ioctl() failed setting up Linux tap device (set MAC)

建议使用 1.4.6 版本,安装脚本如下:

$ opkg install "http://bin.entware.net/mipselsf-k3.4/archive/zerotier_1.4.6-5_mipsel-3.4.ipk"

启动 ZeroTier

路由器 (Padavan/OpenWRT)

$ zerotier-one -d
$ zerotier-cli join <YOUER NETWORK ID>

配置 ZeroTier 路由

在 ZeroTier 创建的网络中添加一条路由记录:

ZeroTier 路由配置

即将所有对内网网段的访问全部代理到路由器的虚拟网卡上。

设置路由器支持桥接模式:

开启路由器桥接

配置路由器防火墙规则

配置防火墙让 ZeroTier 创建的虚拟网卡的流量进入内网,并设置转发规则,从而可以访问内网中的其他机器。
首先查看虚拟网卡的名称:

$ ifconfig

ztklhznki4 Link encap:Ethernet  HWaddr 66:BB:BD:04:7C:62
          inet addr:10.147.19.163  Bcast:10.147.19.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:2800  Metric:1
          RX packets:4659 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3150 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:601999 (587.8 KiB)  TX bytes:2428690 (2.3 MiB)

我的虚拟网卡名称为:ztklhznki4

配置防火墙规则:

$ iptables -A INPUT -i ztklhznki4 -j ACCEPT
$ iptables -A FORWARD -i ztklhznki4 -j ACCEPT
$ iptables -A FORWARD -o ztklhznki4 -j ACCEPT
$ iptables -t nat -A POSTROUTING -o ztklhznki4 -j MASQUERADE

Reference