# Docker 安装 ZeroTier

> 此处以 ZeroTier 1.14.0 版做演示，演示在 Linux 上以 Docker 容器的形式启动一台 ZeroTier 节点，并将这台节设置成可以访问整个宿主机私网网段。
>
> &#x20;&#x20;
>
> 若要理解 ZeroTier 架构，可参考视频：<https://www.bilibili.com/video/BV1oL411Y7pB>/
>
> 更多设置，可参考视频：<https://www.bilibili.com/video/BV1Vh411F7Mr/>

### 构建镜像

```bash
wget https://github.com/zerotier/ZeroTierOne/archive/refs/tags/1.14.0.tar.gz

tar xf ZeroTierOne-1.14.0.tar.gz

cd ZeroTierOne-1.14.0

docker build -f Dockerfile.release -t zerotier:1.14.0 --build-arg VERSION=1.14.0 .

docker images | grep zerotier
```

### 创建虚拟网络

登录官网 Create A Network

<https://www.zerotier.com/>

<figure><img src="https://2457808883-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRxJcEoJGnxpkBfWvFRPw%2Fuploads%2FxRUmZVB5iR7aZm9gntyx%2Fimage.png?alt=media&#x26;token=556fbc23-3bfd-455a-bfb4-bbd9e2192655" alt=""><figcaption></figcaption></figure>

### 启动 ZeroTier 并加入虚拟网络

```bash
docker run --name zerotier \
  --restart unless-stopped \
  --cap-add NET_ADMIN \
  --device /dev/net/tun \
  --network host \
  -d zerotier:1.14.0 8056c2e21cxxxxxx

# 命令结尾处的 ID 为 ZeroTier 官网创建的网络的 Network ID
```

### 配置宿主机网络策略

{% hint style="warning" %}
此案例为 Docker 容器所在机器为非主路由或旁路由的情况，这种情况才需要设置下方的 iptables 规则。若非此种情况，请勿添加下方的 iptables 规则。
{% endhint %}

#### 查看宿主机的物理网卡名称和容器 ZeroTier 的虚拟网卡名称

```
[root@jump ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:d2:8f:c0 brd ff:ff:ff:ff:ff:ff
    altname enp2s2
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:59:ca:20:a0 brd ff:ff:ff:ff:ff:ff
13: ztmjfn3wdb: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 7e:06:38:f7:8e:41 brd ff:ff:ff:ff:ff:ff

# 宿主机的物理网卡名称为：ens34
# ZeroTier 的虚拟网卡名称为：ztmjfn3wdb
```

#### 配置 iptables 策略

```bash
# 下方命令中的 ens34 为宿主机的物理网卡名称，ztmjfn3wdb 为ZeroTier 的虚拟网卡名称
# 执行下方命令时需将相应的网卡名称换成你自己获取到的网卡名称

iptables -I FORWARD -i ens34 -j ACCEPT
iptables -I FORWARD -o ens34 -j ACCEPT
iptables -t nat -I POSTROUTING -o ens34 -j MASQUERADE

iptables -I FORWARD -i ztmjfn3wdb -j ACCEPT
iptables -I FORWARD -o ztmjfn3wdb -j ACCEPT
iptables -t nat -I POSTROUTING -o ztmjfn3wdb -j MASQUERADE
```

### 对网络中的主机进行授权

#### 返回 ZeroTier 的官网，进入刚才创建的网络

<figure><img src="https://2457808883-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRxJcEoJGnxpkBfWvFRPw%2Fuploads%2FHl9iW0MATrqksJawPqIn%2Fimage.png?alt=media&#x26;token=dadcb5a6-ec37-4ce0-b224-cb47ee7dd773" alt=""><figcaption></figcaption></figure>

#### 勾选复选框进行授权，输入 Name 对主机进行命名，设置 IP 。

<figure><img src="https://2457808883-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRxJcEoJGnxpkBfWvFRPw%2Fuploads%2FH5dMqlqWwCC3RBBuLcAn%2Fimage.png?alt=media&#x26;token=a20a6992-af9c-4de6-b3ac-0c190e51ff1b" alt=""><figcaption></figcaption></figure>

#### 添加路由表规则

此处 192.168.1.0/24 为虚拟网络想访问的真实局域网 IP 段，192.168.192.11 为要路由的机器的虚拟 IP

<figure><img src="https://2457808883-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRxJcEoJGnxpkBfWvFRPw%2Fuploads%2FXRJt99iGt4g0PIWpHH4Y%2Fimage.png?alt=media&#x26;token=a5832c45-2b19-4f1b-9622-a31fb040850b" alt=""><figcaption></figcaption></figure>

当设置完这些步骤后，此时当有设备加入虚拟网络时，就可以直接访问 ZeroTier 容器的物理机所处的真实局域网网段了。

### 其它设备加入虚拟网络

下载客户端软件：<https://www.zerotier.com/download/>

<figure><img src="https://2457808883-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FRxJcEoJGnxpkBfWvFRPw%2Fuploads%2FMZxAOhYWBaMvjs0ZSBej%2Fimage.png?alt=media&#x26;token=f84e18b3-80ab-46a0-9e18-1b2a42211d2d" alt=""><figcaption></figcaption></figure>

下载后打开客户端软件，输入虚拟网络的 Network ID 即可加入

### 使用感受

手机可以直连家里的设备，观看家里 NAS 上的电影进行拖拽也丝毫不卡，从路由器的流量监控来看上行可以跑到 3MB 以上（我使用的电信宽带上行是 50Mb，折算后理论速度为 6MB，可能没有用到那么多，故没有跑满）。

总体使用感受是非常好的，设备既不直接暴露在公网上，同时直连也保证了速度。
