<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; VPN</title>
	<atom:link href="https://zohead.com/archives/tag/vpn/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>使用OpenVPN连接Windscribe免费VPN</title>
		<link>https://zohead.com/archives/windscribe-openvpn/</link>
		<comments>https://zohead.com/archives/windscribe-openvpn/#comments</comments>
		<pubDate>Fri, 07 Jul 2017 16:59:16 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[网络]]></category>
		<category><![CDATA[OpenVPN]]></category>
		<category><![CDATA[VPN]]></category>
		<category><![CDATA[Windscribe]]></category>
		<category><![CDATA[广电]]></category>
		<category><![CDATA[翻墙]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1466</guid>
		<description><![CDATA[前言 最近换了住处之后，我还是没想到平时上网的宽带问题会成为一大痛点：现在住的地方基本上只能办理南京的广电宽带。广电宽带不但有着臭名昭著的速度慢游戏卡以及墙中墙问题，而且由于其 IP 地址资源有限，访问一些网站经常出现 IP 全国各地乱飞的情况，最要命的是其出国线路与我之前用的移动宽带完全没法比。 我观察到的南京广电宽带基本出国都是走联通线路，使用的是内蒙古包头之类的奇葩 IP 地址。之前在住处用于翻墙的 AlphaRacks VPS 和 Arukas 容器搭建的 Shadowsocks 服务器现在基本都处于不可用的状态，Google 搜索勉强能打开，Gmail 经常卡的不要不要的，YouTu [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="前言">前言</h2>
<p>最近换了住处之后，我还是没想到平时上网的宽带问题会成为一大痛点：现在住的地方基本上只能办理南京的广电宽带。广电宽带不但有着臭名昭著的速度慢游戏卡以及墙中墙问题，而且由于其 IP 地址资源有限，访问一些网站经常出现 IP 全国各地乱飞的情况，最要命的是其出国线路与我之前用的移动宽带完全没法比。</p>
<p>我观察到的南京广电宽带基本出国都是走联通线路，使用的是内蒙古包头之类的奇葩 IP 地址。之前在住处用于翻墙的 AlphaRacks VPS 和 Arukas 容器搭建的 Shadowsocks 服务器现在基本都处于不可用的状态，Google 搜索勉强能打开，Gmail 经常卡的不要不要的，YouTube 视频则基本不用想了。</p>
<p>更恶心的是广电宽带还直接屏蔽了 ICMP ping 外网的请求，只能 ping 广电内网的地址，至于普通的 <code>traceroute</code> 路由跟踪就更别想了。</p>
<p>下面贴出来的是我在 Linux 下使用专用的 TCP 路由跟踪 <code>tcptraceroute</code> 命令看到的惨不忍睹的结果，目的地址是移动宽带下用的无比顺畅的日本免费 Arukas 容器：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ tcptraceroute -n 153.125.238.173 31626
Selected device wlan0, address 192.168.1.243, port 50713 for outgoing packets
Tracing the path to 153.125.238.173 on TCP port 31626, 30 hops max
 1  192.168.1.1  1.321 ms  1.567 ms  3.853 ms
 2  10.58.71.1  9.688 ms  14.964 ms  11.497 ms
 3  192.168.104.57  8.138 ms  20.722 ms  9.597 ms
 4  111.208.1.141  10.785 ms  11.364 ms  8.861 ms
 5  111.208.1.190  9.602 ms  10.524 ms  11.136 ms
 6  192.168.3.225  8.822 ms  9.481 ms  8.833 ms
 7  * * *
 8  172.16.116.13  70.035 ms  71.014 ms  68.664 ms
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *
Destination not reached
</pre>
<p>由于我平常也使用 Chromebook 设备，特别依赖 Google 服务，Gmail 自不必说，经常要用 Google Drive 同步文件，另外也使用 Google Photos 备份照片，这样必须无法忍受需要找其它翻墙方案。</p>
<h2 id="关于-windscribe-vpn">关于 Windscribe VPN</h2>
<p><a href="https://windscribe.com/?friend=uxavdz64">Windscribe</a> 还是从我一个同事那里了解到的免费 VPN 服务，默认提供每个月 10GB 的流量，免费账户也有多国服务器可选，通过代金券可以增加到每月 50GB 或者 60GB。</p>
<p>需要的朋友可以通过下面的链接注册（没错，带了我的推荐小尾巴 ^_^），需要注意 Windscribe 网站必须翻墙才能打开：</p>
<p><a href="https://windscribe.com/?friend=uxavdz64" target="_blank">https://windscribe.com/?friend=uxavdz64</a></p>
<p>Windscribe 的付费账户则是无限流量每月 $7.50 美元起，最近他们在搞 Lobster Lover 优惠活动，现在付费账户限时 3 折促销每年 $29.99 美元，有需要的朋友可以注册之后用 <a href="https://windscribe.com/upgrade?promo=LOBSTER1&amp;pcpid=lobster_july_2017" target="_blank">Lobster Lover</a> 链接优惠升级哦。</p>
<p>账户注册完成之后登录，在 <code>My Account</code> 页面中点击 <code>Claim Voucher</code> 按钮输入代金券代码：</p>
<ul>
<li><code>SOS60GBS</code>，流量增加到每个月 60 GB，暂不确定什么时候过期；</li>
<li><code>50GBFREE</code>，流量增加到每个月 50 GB。</li>
</ul>
<p>Windscribe 提供了 Windows、Mac OS X、iPhone 下的客户端，而且还有官方的 Chrome、Firefox、Opera 浏览器下的 VPN 扩展程序，客户端下载链接在此：</p>
<p><a href="https://chn.windscribe.com/download" target="_blank">https://chn.windscribe.com/download</a></p>
<p>从下载页面可以看到 Linux、Android 客户端都只有收费账户才支持，而且 Windscribe 并没有直接提供 Linux 和 Android 下的官方客户端，而是通过 OpenVPN、IKEv2、SOCKS5 等配置文件的方式让用户使用其它工具来连接 Windscribe VPN 服务器。</p>
<h2 id="openvpn-连接-windscribe">OpenVPN 连接 Windscribe</h2>
<p>如此看来 Windscribe 是直接支持以 OpenVPN 方式来连接的，当然收费账户可以从下面的链接直接下载 OpenVPN 配置文件和证书：</p>
<p><a href="https://chn.windscribe.com/getconfig/openvpn" target="_blank">https://chn.windscribe.com/getconfig/openvpn</a></p>
<p>虽然免费账户无法下载 OpenVPN 配置，但我估计 Windows 等系统下的客户端很有可能还是以 OpenVPN 方式实现的，马上下载安装 Windows 客户端来确认。</p>
<p>客户端安装的时候会自动提示安装 OpenVPN 的 TAP 驱动，完成之后使用 Windscribe 账户登录，默认会选择离我们最近的香港服务器。连接成功之后就能在进程列表看到 Windscribe 的 <code>windscribeopenvpn.exe</code> 程序，而且在命令行参数中还能看到 OpenVPN 配置文件路径：</p>
<pre class="brush: plain; title: ; notranslate">
&quot;C:\Program Files (x86)\Windscribe\windscribeopenvpn.exe&quot; --config &quot;C:/Users/xxx/AppData/Local/Windscribe/Windscribe/config.ovpn&quot; --management 127.0.0.1 57593 --management-query-passwords --management-hold
</pre>
<p>首先从下面的路径把 OpenVPN 配置文件拷贝出来：</p>
<pre class="brush: plain; title: ; notranslate">
C:/Users/xxx/AppData/Local/Windscribe/Windscribe/config.ovpn
</pre>
<p>配置文件内容大概是这样的：</p>
<pre class="brush: plain; title: config.ovpn; notranslate">
client
dev tun

nobind
auth-user-pass
reneg-sec 432000
resolv-retry infinite

auth SHA512
cipher AES-256-CBC
keysize 256
comp-lzo
verb 2
mute-replay-warnings
ns-cert-type server
persist-key
persist-tun

key-direction 1
&lt;ca&gt;
-----BEGIN CERTIFICATE-----
xxxxxx
-----END CERTIFICATE-----
&lt;/ca&gt;
&lt;tls-auth&gt;
-----BEGIN OpenVPN Static key V1-----
xxxxxx
-----END OpenVPN Static key V1-----
&lt;/tls-auth&gt;
block-outside-dns

remote 103.10.197.3
port 443
proto udp
</pre>
<p>中间的 CA 证书和 TLS 认证 key 太长就没有全部贴出来了，<code>remote</code> 明显就是 Windscribe OpenVPN 服务器的地址，这里的 <code>103.10.197.3</code> 就是 Windscribe 的香港服务器。</p>
<p>现在剩下的问题就是 OpenVPN 的登录用户名和密码了，Windscribe 的 <a href="https://chn.windscribe.com/guides/ubuntu" target="_blank">Linux 客户端说明</a> 中明确提醒用户需要注意的就是 OpenVPN 用户名和密码并不是 Windscribe 账户名和密码。</p>
<p>Windscribe 的 Windows 客户端里并没有直接提供用户名和密码，而且 Windscribe 网站上也只有付费账户才能得到，但这并不妨碍我们从 Windscribe 客户端的日志文件中找出端倪。</p>
<p>打开 Windscribe 客户端的日志文件：</p>
<pre class="brush: plain; title: ; notranslate">
C:\Users\xxx\AppData\Local\Windscribe\Windscribe\log.txt
</pre>
<p>不出意外的话你应该能在其中找到类似下面的输出：</p>
<pre class="brush: plain; title: ; notranslate">
[0607 03:18     36.573] [basic]	 state = CONNECT_BUTTON_CONNECTING
[0607 03:18     36.574] [basic]	 radiusUsername:  &quot;nocwat_xxx&quot;
[0607 03:18     36.574] [basic]	 radiusPassword:  &quot;pppppp&quot;
[0607 03:18     36.574] [basic]	 Connecting to &quot;最佳位置&quot;
[0607 03:18     36.574] [connection]	 Use latest successfully connection protocol: &quot;UDP&quot;
[0607 03:18     36.574] [connection]	 Connection settings: automatic
[0607 03:18     36.574] [connection]	 Location nodes: &quot;node1 = {ip1 = 103.10.197.2, ip2 = 103.10.197.3, ip3 = 103.10.197.4}; &quot;
[0607 03:18     36.575] [connection]	 OVPN-config path: &quot;C:/Users/xxx/AppData/Local/Windscribe/Windscribe/config.ovpn&quot;
[0607 03:18     36.575] [connection]	 Connecting to IP: &quot;103.10.197.3&quot;  protocol: &quot;UDP&quot;  port: 443
</pre>
<p>上面日志里的 <code>radiusUsername</code> 和 <code>radiusPassword</code> 就是 Windscribe 的 OpenVPN 服务器登录用户名和密码了。</p>
<p>接着就是打开 OpenVPN 软件使用刚才拷贝出来的 <code>config.ovpn</code> 配置文件，然后用上面的 OpenVPN 用户名和密码登录了，我的免费账户使用这种绕过 Windscribe 官方客户端的方式登录在测试中并没有发现什么问题。</p>
<h2 id="windscribe-服务器列表">Windscribe 服务器列表</h2>
<p>到这里你应该能使用泛用型 OpenVPN 客户端来连接 Windscribe VPN 了，只是 Windscribe 多个地区的 VPN 服务器地址稍微麻烦点，毕竟使用过程中总会遇到某些地区的服务器比较慢需要切换的。</p>
<p>不过还好网上已经有人整理好了 Windscribe 的各地区 VPN 服务器地址了，大家直接从下面的地址下载 UDP 或者 TCP 协议的各地区 OpenVPN 配置文件：</p>
<p><a href="https://github.com/haugene/docker-transmission-openvpn/files/502948/Windscribe-OVPN-UDP.zip" target="_blank">Windscribe-OVPN-UDP.zip</a> <br />
<a href="https://github.com/haugene/docker-transmission-openvpn/files/502949/Windscribe-OVPN-TCP.zip" target="_blank">Windscribe-OVPN-TCP.zip</a></p>
<p>解压缩之后使用其中某个地区的 OpenVPN 配置文件即可，登录时仍然使用前面日志文件中找到的用户名和密码。</p>
<p>当然后面很可能会碰到配置文件中的服务器地址不正确或者 Windscribe 修改了证书之类的情况，不过大家还是可以从 Windscribe 客户端的服务日志中找到正确的服务器地址，例如：</p>
<pre class="brush: plain; title: ; notranslate">
[04-07 12:11:06]	Service started
[04-07 12:15:14]	AA_COMMAND_FIREWALL_CHANGE, AllowLocalTraffic=1, Ips=38.95.108.xxx;xxxxxx;104.18.56.xxx
[04-07 12:15:14]	AA_COMMAND_FIREWALL_IPV6_ENABLE
[04-07 12:15:14]	Error 13
[04-07 12:15:14]	AA_COMMAND_EXECUTE, blocking=0, cmd=&quot;C:\Program Files (x86)\Windscribe\windscribeopenvpn.exe&quot; --config &quot;C:/Users/xxx/AppData/Local/Windscribe/Windscribe/config.ovpn&quot; --management 127.0.0.1 57593 --management-query-passwords --management-hold
</pre>
<p>上面日志输出中的 <code>Ips</code>（并没有全部列出来） 就是客户端获取到的所有 Windscribe VPN 服务器的地址了。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/windscribe-openvpn/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>在Linux容器中使用ZeroTier P2P VPN</title>
		<link>https://zohead.com/archives/zerotier-container/</link>
		<comments>https://zohead.com/archives/zerotier-container/#comments</comments>
		<pubDate>Wed, 31 Aug 2016 16:57:17 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[网络技术]]></category>
		<category><![CDATA[Codeanywhere]]></category>
		<category><![CDATA[P2P]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[TAP]]></category>
		<category><![CDATA[TUN]]></category>
		<category><![CDATA[VPN]]></category>
		<category><![CDATA[ZeroTier]]></category>
		<category><![CDATA[容器]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1266</guid>
		<description><![CDATA[关于 ZeroTier P2P VPN P2P VPN 和我们平常使用的 PPTP、OpenVPN 等 VPN 的不同之处在于其只负责将两个或多个主机通过点对点的方式进行连接，不需要中心服务器支持，多个主机之间通过 STUN 打洞或者 TURN 中继等方式进行连接，比较适合不同网络间的多个主机进行直接连接，不像 PPTP 这种在国内用的最多的就是拿来爬墙的。 目前使用的比较多的包括 n2n、tinc 和本文要介绍的 ZeroTier 等几种免费开源的 P2P VPN 软件。 n2n 由于已经没人继续开发支持了所以不予考虑，我在对比了 tinc 和 ZeroTier 之后发现 ZeroTier  [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="关于-zerotier-p2p-vpn">关于 ZeroTier P2P VPN</h2>
<p>P2P VPN 和我们平常使用的 PPTP、OpenVPN 等 VPN 的不同之处在于其只负责将两个或多个主机通过点对点的方式进行连接，不需要中心服务器支持，多个主机之间通过 <a href="https://en.wikipedia.org/wiki/STUN">STUN</a> 打洞或者 <a href="https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT">TURN</a> 中继等方式进行连接，比较适合不同网络间的多个主机进行直接连接，不像 PPTP 这种在国内用的最多的就是拿来爬墙的。</p>
<p>目前使用的比较多的包括 n2n、tinc 和本文要介绍的 ZeroTier 等几种免费开源的 P2P VPN 软件。</p>
<p>n2n 由于已经没人继续开发支持了所以不予考虑，我在对比了 tinc 和 ZeroTier 之后发现 ZeroTier 虽然看起来性能比 tinc 略差一点，但其客户端配置步骤非常简单，不需要像 tinc 那样要在多个主机分别手工生成配置文件，而且 ZeroTier 自己也自带了几个不同国家区域的中继服务器方便普通用户使用，另外一点就是本文要介绍的 ZeroTier 支持在 Linux 容器中使用，因此平时我主要使用 ZeroTier，tinc 用作辅助。</p>
<p>ZeroTier 的虚拟网络可以包含多个处于相同或不同物理网络里的主机，每个虚拟网络都有一个唯一的网络 ID，多个运行 ZeroTier 服务的主机加入同一个 ZeroTier 网络 ID 就可以构成一个虚拟网络。虚拟网络都是由 ZeroTier Controller 控制器来管理的，默认可以使用 ZeroTier 提供的控制器来管理，用户也可以自行搭建控制器来实现完全自己管理 ZeroTier 网络。</p>
<p>另外 ZeroTier 有一个特殊的 <code>8056c2e21c000001</code> 网络 ID 表示全球公共 ZeroTier 网络，如果只是想测试连接网络的话也可以加入这个公共网络；但实际使用中为了安全性考虑建议最好在 ZeroTier 网站上注册一个账户并新建你自己的 P2P VPN 网络用于管理。</p>
<p>有关 ZeroTier P2P VPN 的详细介绍可以参考其官网：</p>
<p><a href="https://www.zerotier.com/">https://www.zerotier.com/</a></p>
<h2 id="容器中使用-zerotier-的问题">容器中使用 ZeroTier 的问题</h2>
<p>简单了解 ZeroTier P2P VPN 主机端的工作机制之后我就发现一个问题，其依赖的 TUN/TAP 驱动（n2n 和 tinc VPN 也同样依赖）在很多 Linux 容器系统中是无法使用的。</p>
<p>我使用的 OpenVZ VPS 容器还好还可以在控制面板里开启 TUN/TAP 支持，而对于现在非常流行的 Docker 容器（例如之前我用到的 IBM Bluemix 容器）就比较麻烦了，Docker 容器在运行时必须包含 <code>SYS_NET_ADMIN</code> 特权才能正常执行 TUN/TAP 虚拟网卡设备的创建操作（Docker 容器中同样也不能使用 OpenVPN、OpenConnect 等依赖 TUN/TAP 驱动的程序），但目前的容器服务厂商基本上不会以特权方式运行容器。</p>
<p>ZeroTier 为此提出的解决方案就是 Network Containers 模式，通过实现一个轻量级的应用层 TCP/IP API 来 hook 现有应用程序的 Socket API，这样可以使现有的程序也能使用 ZeroTier 技术连接其它主机。</p>
<blockquote>
<p>最近 ZeroTier 已经将 Network Containers 模式更名为 ZeroTier SDK 并使用了单独的版本库，开发者也可以选择将 ZeroTier SDK 直接编译进自己的应用程序以方便直接使用。有关容器模式的详细介绍可以参考官方介绍文章：<a href="https://www.zerotier.com/product-netcon.shtml">ZeroTier Network Containers</a>。</p>
</blockquote>
<h2 id="关于-codeanywhere-容器">关于 Codeanywhere 容器</h2>
<p>这里我使用 <a href="https://codeanywhere.com/">Codeanywhere</a> 虚拟机来测试 ZeroTier Network Containers，Codeanywhere 作为一个云端 IDE 平台还是比较好用的，其提供的免费版本的容器支持：</p>
<ul>
<li>2GB 磁盘空间；</li>
<li>256MB RAM (+ 512 MB 交换空间)；</li>
<li>sudo 支持；</li>
<li>支持 SSH 登录（免费版本的容器每次启动时 SSH 端口不固定）；</li>
<li>支持访问所有 HTTP 和 Websocket 端口（默认 1024 - 9999）。</li>
</ul>
<p>问题是 Codeanywhere 免费版本的虚拟机不支持固定 IP 地址，也不支持域名绑定或者固定子域名，每次虚拟机启动之后分配到的都是一个超长的子域名，例如你看到的子域名可能就是下面的形式：</p>
<pre><code>preview.7reszf59tfv18aor9x7odheaio340a4ih8tcn8fvndzvkj4i.box.codeanywhere.com
</code></pre>
<p>这样实际开发测试起来还是有点不太方便。</p>
<p>当然 Codeanywhere 也是不提供 TUN/TAP 支持的，这样如果 ZeroTier 的容器模式可以在 Codeanywhere 虚拟机内正常使用，我就可以直接在自己的电脑上直接使用虚拟的 P2P VPN 节点 IP 地址来访问 Codeanywhere 虚拟机了，可以省掉那一长串恶心的子域名了。</p>
<h2 id="使用-zerotier-network-containers">使用 ZeroTier Network Containers</h2>
<h3 id="编译安装-zerotier-network-containers">编译安装 ZeroTier Network Containers</h3>
<p>首先创建一个新的 Codeanywhere 虚拟机，建议使用 <code>C/C++ Development Stack</code> 类型方便后续编译安装 ZeroTier 程序，另外操作系统最好选择 Centos 6.5 64 位，如果使用 Ubuntu 系统可能存在连接不上 P2P VPN 网络的问题。</p>
<p>在 Codeanywhere 虚拟机中使用 git 命令检出 ZeroTier 官方版本库，检出之后运行 <code>make netcon</code> 命令就可以编译出 ZeroTier Network Containers 模式需要的文件了：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere ZeroTierOne]$ ls                                           
AUTHORS.md   examples                 netcon        ui
LICENSE.txt  ext                      node          version.h
Makefile     include                  objects.mk    windows
README.md    java                     one.cpp       world
artwork      libzerotierintercept.so  osdep         zerotier-cli
attic        make-freebsd.mk          selftest.cpp  zerotier-idtool
cluster-geo  make-linux.mk            service       zerotier-netcon-service
controller   make-mac.mk              tcp-proxy
</pre>
<p>其中最重要的就是 <code>zerotier-netcon-service</code> 服务和 <code>libzerotierintercept.so</code> 以及 netcon 目录中的 <code>liblwip.so</code> 应用层 Socket API 库文件了，接着可以先将 ZeroTier Network Container 模式程序和有关库文件安装到 <code>/var/lib/zerotier-one</code> 目录中：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere ZeroTierOne]$ mkdir -m /var/lib/zerotier-one
[cabox@box-codeanywhere ZeroTierOne]$ cp -ra zerotier-* /var/lib/zerotier-one
[cabox@box-codeanywhere ZeroTierOne]$ cp libzerotierintercept.so netcon/liblwip.so /var/lib/zerotier-one
</pre>
<h3 id="将容器主机加入-zerotier-虚拟网络">将容器主机加入 ZeroTier 虚拟网络</h3>
<p>下面就可以在 Codeanywhere 虚拟机中进行测试了，首先启动 Network Container 模式下的 ZeroTier 主服务程序：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere workspace]$ /var/lib/zerotier-one/zerotier-netcon-service -d
</pre>
<p>服务启动成功之后稍等片刻，运行 <code>zerotier-cli</code> 命令加入现有的 ZeroTier 虚拟网络，下面命令行中的 <code>565799d8f61077e9</code> 就是我在 ZeroTier 网站上新创建的虚拟网络 ID：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere workspace]$ /var/lib/zerotier-one/zerotier-cli join 565799d8f61077e9
</pre>
<blockquote>
<p><strong>提示</strong></p>
<p>如果你加入的是 <code>8056c2e21c000001</code> 这个全球公共 ZeroTier 虚拟网络那就可以省掉下面这一段落的配置步骤了。</p>
</blockquote>
<p>join 操作完成之后需要在 ZeroTier 网站后台虚拟网络管理界面中先允许新的主机加入此网络，接着可以为此主机配置虚拟网络上的 IP 地址、子网掩码之类的，具体配置操作步骤还算比较简单基本都可以在 <a href="https://my.zerotier.com/network">ZeroTier Central</a> 网站后台中完成。</p>
<p>配置完成之后就可以在容器中继续运行 <code>zerotier-cli</code> 命令查询该主机上 ZeroTier 虚拟网络状态：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere workspace]$ /var/lib/zerotier-one/zerotier-cli listnetworks
200 listnetworks &lt;nwid&gt; &lt;name&gt; &lt;mac&gt; &lt;status&gt; &lt;type&gt; &lt;dev&gt; &lt;ZT assigned ips&gt;
200 listnetworks 565799d8f61077e9 zohead-network fa:d9:cf:a8:b2:40 OK PRIVATE /var/lib/zerotier-one/nc_565799d8f61077e9 10.10.8.4/24
</pre>
<p>可以看到该容器中已经正确连接到我建立的私有 ZeroTier 虚拟网络了，而且分配到了一个 <code>10.10.8.4</code> 的 IP 地址，子网掩码为 255.255.255.0（对应 24）。</p>
<h3 id="通过虚拟网络访问容器主机">通过虚拟网络访问容器主机</h3>
<p>此时需要特别注意的是容器中运行的程序还不能直接使用 ZeroTier 虚拟网络与其它主机进行连接，必须通过预加载 Network Container 库文件的方式运行程序才可以在容器系统中正确访问 ZeroTier 虚拟网络，这里我们以 SSH 服务器为例，首先可以新运行一个 <code>sshd</code> 服务程序：</p>
<pre class="brush: bash; title: ; notranslate">
[cabox@box-codeanywhere workspace]$ sudo ZT_NC_NETWORK=/var/lib/zerotier-one/nc_565799d8f61077e9 LD_PRELOAD=/var/lib/zerotier-one/libzerotierintercept.so /usr/sbin/sshd -p 27001
</pre>
<p>这样可以新运行一个 <code>sshd</code> 服务程序，并绑定新的端口（例如上面例子中的 27001 端口）防止和系统默认的 22 端口冲突，<code>ZT_NC_NETWORK</code> 变量指定需要使用的 ZeroTier 虚拟网络路径（默认为：<code>/var/lib/zerotier-one/nc_网络ID</code>），<code>LD_PRELOAD</code> 是必须指定的，否则新运行的 <code>sshd</code> 程序将无法访问 ZeroTier 虚拟网络。</p>
<p>新的 <code>sshd</code> 服务启动成功之后，我们就可以在测试的 Windows、Linux 等主机上运行 ZeroTier 客户端，加入同样的虚拟网络并配置虚拟网络 IP 地址（例如我的 Windows 机器 ZeroTier 网络 IP 地址是 <code>10.10.8.3</code>）及子网掩码。</p>
<p>最后我们可以在 Windows 主机上 ping 测试 Codeanywhere 容器的虚拟网络 IP 地址了，如果通讯正常的话就可以通过 ssh 客户端工具直接连接登录 Codeanywhere 容器系统了，这样就顺利绕过了 Codeanywhere 的随机子域名限制。</p>
<h2 id="后记">后记</h2>
<p>如果需要在 Codeanywhere 容器系统启动时自动连接 ZeroTier 虚拟网络并开启独立的 <code>sshd</code> 服务程序，那可以将类似下面的两句命令加到 <code>/etc/rc.local</code> 文件末尾：</p>
<pre class="brush: bash; title: ; notranslate">
/var/lib/zerotier-one/zerotier-netcon-service -d
echo &quot;ZT_NC_NETWORK=/var/lib/zerotier-one/nc_565799d8f61077e9 LD_PRELOAD=/var/lib/zerotier-one/libzerotierintercept.so /usr/sbin/sshd -p 27001&quot; | at now + 2 minutes
</pre>
<p>第二句命令表示在 ZeroTier Network Container 服务程序启动两分钟之后再启动单独的 <code>sshd</code> 服务程序，以使 ZeroTier 服务程序在等待的时间内能正确连接虚拟网络。</p>
<p>本文主要介绍 ZeroTier 程序里不太常见的 Network Container 容器模式，这对于越来越多的 Docker 容器系统而言能绕过 TUN/TAP 限制还是有点用处的，如果读者发现了有关 ZeroTier P2P VPN 的更多好玩法，欢迎提出交流哦，祝大家玩的开心～～～。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/zerotier-container/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
