<?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; 翻墙</title>
	<atom:link href="https://zohead.com/archives/tag/censorship-circumvention/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>小内存OpenVZ VPS使用UML开启BBR</title>
		<link>https://zohead.com/archives/openvz-uml-bbr/</link>
		<comments>https://zohead.com/archives/openvz-uml-bbr/#comments</comments>
		<pubDate>Mon, 06 Mar 2017 18:39:55 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[User-mode Linux]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[BBR]]></category>
		<category><![CDATA[busybox]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[OpenVZ]]></category>
		<category><![CDATA[Shadowsocks]]></category>
		<category><![CDATA[ShadowsocksR]]></category>
		<category><![CDATA[TAP]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[翻墙]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1365</guid>
		<description><![CDATA[前言 Bottleneck Bandwidth and RTT（BBR）是 Google 最近提交到 Linux 4.9 版本内核的新 TCP 拥塞控制算法，BBR 相对于 Linux 中已经用了好多年的默认 CUBIC 算法的主要改进是在有一定丢包率的网络链路上充分利用带宽，另外也能有效降低延迟。这对于很多使用美帝 VPS + Shadowsocks 爬墙方案的人来说应该还是比较有用的，目前从一些更新了内核开启 BBR 的 KVM VPS 用户的反馈来看效果也还是不错的。 我目前使用的爬墙服务器是 AlphaRacks 的低配 OpenVZ VPS，内存只有 96 MB，到国内的线路质量倒还 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="preface">前言</h2>
<p><a href="https://github.com/google/bbr">Bottleneck Bandwidth and RTT（BBR）</a>是 Google 最近提交到 Linux 4.9 版本内核的新 TCP 拥塞控制算法，BBR 相对于 Linux 中已经用了好多年的默认 CUBIC 算法的主要改进是在有一定丢包率的网络链路上充分利用带宽，另外也能有效降低延迟。这对于很多使用美帝 VPS + Shadowsocks 爬墙方案的人来说应该还是比较有用的，目前从一些更新了内核开启 BBR 的 KVM VPS 用户的反馈来看效果也还是不错的。</p>
<p>我目前使用的爬墙服务器是 AlphaRacks 的低配 OpenVZ VPS，内存只有 96 MB，到国内的线路质量倒还凑合，OpenVZ 虽然没办法直接升级 kernel ，但看到 AlphaRacks 控制面板里能开启 TUN/TAP，那可以考虑捣鼓使用 User-mode Linux（UML）来开启 BBR 了。</p>
<p>User-mode Linux 和 QEMU 这种虚拟机稍微有点类似，但 UML 是直接将 Linux 内核编译成可执行的 ELF 应用层程序，这样可以直接在普通 Linux 环境中运行及调试其它版本 Linux 内核的功能，有关 UML 的详细信息请参考其<a href="http://user-mode-linux.sourceforge.net/">官方网站</a>。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>不想自己编译 UML 内核和构建 UML rootfs 的朋友可以直接拉到「<a href="#use-uml-ss-system">使用 UML Shadowsocks 系统</a>」这部分哦。</p>
</blockquote>
<h2 id="compile-uml-kernel">编译 User-mode Linux 内核</h2>
<h3 id="compile-prepare">准备编译环境</h3>
<p>我是直接在 Windows 10 RS2 64 位系统上编译 UML 内核的，使用 Win10 自带的 Bash on Ubuntu 14.04 环境编译还是非常方便的，而且编译速度相比使用虚拟机也是快了很多。</p>
<p>首先安装编译需要的软件包：</p>
<blockquote>
<p><strong>备注</strong></p>
<p>由于我使用的 OpenVZ VPS 系统是 32 位的，所以这里安装 <code>libc-dev</code> 和 <code>libvdeplug-dev</code> 开发包时都指定了使用 32 位版本；如果你需要编译 64 位版本的 UML 内核，那把下面的 <code>-i386</code> 去掉即可。</p>
</blockquote>
<pre class="brush: bash; title: ; notranslate">
zzm@ZZM-P238:~$ sudo apt-get install build-essential libncurses5-dev libc6-dev-i386 libvdeplug-dev-i386
</pre>
<p>这里安装 <code>libvdeplug-dev</code> 开发包是为了支持 UML 的 <a href="http://wiki.virtualsquare.org/wiki/index.php/VDE_Basic_Networking#Step_3:_run_a_User-Mode_Linux">Virtual Distributed Ethernet（VDE）</a>模式网卡设备，VDE 主要是为了让 UML 的网络功能在类似 Docker 这种连 TUN/TAP 都不支持的系统上也能工作起来。</p>
<p>接着可以下载最新 Linux 4.10.1 版本内核源代码，并解压缩准备配置内核选项，4.10.1 版本源代码解压之后不到 800 MB。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>如果像我一样直接在 Win10 Bash 环境中编译，那么最好将内核源代码解压到 Win10 Bash 的 VolFs 文件系统中（也就是 Ubuntu rootfs 目录，一般直接 cd 到 <code>HOME</code> 主目录即可）。</p>
</blockquote>
<h3 id="uml-kernel-config">UML 内核配置</h3>
<p>如果使用默认的 UML 内核配置是比较简单的，直接下面两步即可，第二步内核配置界面里可以手工开启 BBR 功能：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@ZZM-P238:~/linux-4.10.1$ cp arch/um/configs/i386_defconfig .config
zzm@ZZM-P238:~/linux-4.10.1$ make menuconfig ARCH=um
</pre>
<p>不过为了能编译出体积最小又能满足 BBR 爬墙需要的 kernel，我还是使用自己修改的最小配置，首先将下面的内容保存为 <code>mini.config</code> 文件（如果需要编译 64 位 kernel，那直接把开头的 <code>CONFIG_64BIT=n</code> 这一行去掉即可）：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@ZZM-P238:~/linux-4.10.1$ cat mini.config
CONFIG_64BIT=n
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_SCRIPT=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=n
CONFIG_HOSTFS=y
CONFIG_MCONSOLE=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_KERNEL_STACK_ORDER=1
CONFIG_SWAP=n
CONFIG_SYSVIPC=y
CONFIG_EXPERT=n
CONFIG_EMBEDDED=n
CONFIG_SLUB_DEBUG=n
CONFIG_BLOCK=y
CONFIG_LBDAF=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_BLK_DEV_BSG=n
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_UBD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=n
CONFIG_DEFAULT_IOSCHED=&quot;deadline&quot;
CONFIG_NETDEVICES=n
CONFIG_STDERR_CONSOLE=y
CONFIG_SSL=y
CONFIG_NULL_CHAN=y
CONFIG_PORT_CHAN=y
CONFIG_PTY_CHAN=y
CONFIG_TTY_CHAN=y
CONFIG_XTERM_CHAN=y
CONFIG_UNIX98_PTYS=y
CONFIG_EXT2_FS=y
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_TMPFS=y
CONFIG_SYSFS=y
CONFIG_SCHED_DEBUG=n
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_BBR=y
CONFIG_DEFAULT_BBR=y
CONFIG_DEFAULT_TCP_CONG=&quot;bbr&quot;
CONFIG_IPV6=n
CONFIG_SYN_COOKIES=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_QFQ=y
CONFIG_NET_SCH_CODEL=y
CONFIG_NET_SCH_FQ_CODEL=y
CONFIG_NET_SCH_FQ=y
CONFIG_NET_SCH_FIFO=y
CONFIG_UML_NET=y
CONFIG_UML_NET_TUNTAP=y
CONFIG_UML_NET_VDE=y
CONFIG_DEBUG_KERNEL=n
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1
</pre>
<p>简单说明一下上面的内核配置选项：</p>
<ul>
<li>启用了 UML 的 hostfs 及 mconsole 等很实用的功能；</li>
<li>支持 UML 的 ubd 块设备，也开启了 loop 设备支持，去掉了 ramdisk 等没什么用的其它设备支持；</li>
<li>支持 proc、sysfs、tmpfs 等虚拟文件系统，真实的文件系统只保留了 ext2 支持，需要 ext3 或者 ext4 支持的朋友请自行修改；</li>
<li>开启 BBR 并设置为默认拥塞控制算法，另外需要为 BBR 启用 Fair Queue 包调度器；</li>
<li>去掉了 IPv6 支持，去掉了所有的网卡设备驱动；</li>
<li>去掉了几乎所有的内核调试信息。</li>
</ul>
<p>然后使用 <code>mini.config</code> 生成新的内核配置文件：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@ZZM-P238:~/linux-4.10.1$ make ARCH=um allnoconfig KCONFIG_ALLCONFIG=mini.config
</pre>
<h3 id="compile-kernel">编译内核</h3>
<p>内核选项配置完毕之后，编译就非常简单了：</p>
<pre class="brush: bash; title: ; notranslate">
zzm@ZZM-P238:~/linux-4.10.1$ make ARCH=um vmlinux -j4
</pre>
<p>这里我开启了 4 个并发编译（make 的 <code>-j4</code> 参数）支持，UML 的 vmlinux 可执行程序在我的笔记本上不到 4 分钟就编译完成了，最终编译出来的 vmlinux 文件大小大概为 3 - 4 MB。</p>
<p>你可以试着运行编译出来的 vmlinux 可执行程序查看编译时使用的内核配置：</p>
<pre class="brush: bash; title: ; notranslate">
[root@localhost ~]# ./vmlinux --showconfig
</pre>
<h2 id="prepare-uml-rootfs">准备 UML rootfs</h2>
<h3 id="prepare-rootfs-ss-libev">准备 rootfs 和 shadowsocks-libev</h3>
<p>既然 UML 内核我都是按最小化编译的，那运行的 rootfs 自然不能用像 Ubuntu、CentOS 那种「庞大」的系统了，这里我直接使用最小化的 busybox rootfs + Shadowsocks 服务端程序和运行库的方式，除了 busybox 基础环境和 Shadowsocks 服务端程序基本没有添加任何其它东西。</p>
<p>最终我将 UML vmlinux 内核文件和 rootfs 目录一起压缩打包起来大小也不过才 3 MB，这样能非常方便地上传到 VPS 上和分享给其他人。当然缺点就是如果需要安装其它的软件那只能手工拷贝到 rootfs 目录中了。</p>
<p>具体 busybox rootfs 的制作方法这里我就不做详细说明了，感兴趣的朋友可以参考相关的文档了解一下，我分别制作了 32 位和 64 位的 busybox rootfs 目录。</p>
<p>另外为了减少 UML 系统的程序依赖和内存占用，Shadowsocks 服务端我选择的是 <a href="https://github.com/shadowsocks/shadowsocks-libev">shadowsocks-libev</a>，这里我也分别编译了最新 3.0.3 版本 32 位和 64 位的服务端程序。</p>
<p>32 位 shadowsocks-libev 我是在 32 位 Ubuntu 14.04 系统下编译的，依赖的动态库也是使用的 Ubuntu 14.04 自带的库文件；64 位 shadowsocks-libev 则是在 64 位 CentOS 6 系统下编译的，所以 64 位运行库版本和 32 位的不同。你问我为什么不用同一个系统？因为我刚好有这两个系统的 VPS 能用来编译，实在是懒的换了 ^_^。</p>
<h3 id="test-uml-rootfs">测试 UML rootfs</h3>
<p>由于 OpenVZ 系统内核不支持 loop 设备，不能挂载文件系统映像进行修改，这里我直接使用 UML 的 hostfs 将 OpenVZ 主机系统的一个目录设为 UML 系统的 rootfs。</p>
<p>现在 UML hostfs 并没有某些网友说的存在只读的限制，而且相比使用 loop 设备或者 ubd 文件系统这种方式，hostfs 并不需要预先产生一个很大的文件，主机也能直接修改 UML rootfs 目录内容，UML 内核也根本不需要支持 ext3、ext4 这种真实的文件系统，综合比较下来实在是没有什么理由不用 hostfs。</p>
<p>首先安装 UML 工具 <code>uml-utilities</code> 软件包，后面的 <code>tunctl</code> 和 <code>uml_mconsole</code> 等命令会用到：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# apt-get install uml-utilities
</pre>
<p>接着可以配置 OpenVZ 系统上的 TUN/TAP 虚拟网卡和开启端口转发：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# tunctl -u root
Set 'tap0' persistent and owned by uid 0
root@zohead:~# ifconfig tap0 192.168.0.3 up
root@zohead:~# echo 1 &gt; /proc/sys/net/ipv4/ip_forward
root@zohead:~# iptables -t nat -I POSTROUTING -o venet0 -j MASQUERADE
root@zohead:~# iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 9443 -j DNAT --to-destination 192.168.0.4
root@zohead:~# iptables -t nat -A PREROUTING -i venet0 -p udp --dport 9443 -j DNAT --to-destination 192.168.0.4
</pre>
<blockquote>
<p><strong>备注</strong></p>
<p>上面的命令中假设 TUN/TAP 虚拟网卡 IP 地址为 <code>192.168.0.3</code>（可以自行修改），UML 系统网卡 IP 地址为 <code>192.168.0.4</code>（需要和 TUN/TAP 虚拟网卡地址在同一网段），只将 OpenVZ 主机系统上 <code>9443</code> 端口的 TCP 和 UDP 数据转发到 UML 系统网卡上。</p>
</blockquote>
<p>最后是启动 UML 系统的例子：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# ./vmlinux-i686 umid=shadowsocks root=/dev/root rootfstype=hostfs rootflags=/root/umlfs-i686 rw mem=48M init=/sbin/init eth0=tuntap,tap0
</pre>
<p>简单说明一下 UML vmlinux 程序的参数：</p>
<ul>
<li><code>umid</code> 参数指定 UML 系统 ID，建议每个 UML 系统都使用的固定的 ID，不然每次运行都会在 <code>~/.uml</code> 目录下产生新的临时目录；</li>
<li><code>rootflags</code> 参数指定 UML rootfs 路径，这里 <strong>必须</strong> 使用绝对路径；</li>
<li><code>mem</code> 参数指定 UML 系统的内存大小，经过我的测试，只运行 shadowsocks-libev 服务端的话就算分配 32 MB 内存看起来也没什么压力；</li>
<li><code>init</code> 参数指定 UML 系统的 init 进程，不建议修改；</li>
<li><code>eth0=tuntap,tap0</code> 则是指定 UML 的 tuntap 模式网卡，使用 OpenVZ 主机系统的 <code>tap0</code> 虚拟网卡设备。</li>
</ul>
<h2 id="use-uml-ss-system">使用 UML Shadowsocks 系统</h2>
<h3 id="uml-linux-sh">uml-linux.sh 脚本</h3>
<p>为了使用起来方便，我把启动 UML 系统和设置端口转发的操作写成了一个 <code>uml-linux.sh</code> 脚本，这样 OpenVZ 系统启动之后可以根据配置自动运行并配置端口转发：</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
UML_ID=&quot;shadowsocks&quot;
TAP_DEV=&quot;tap0&quot;
ROUTER_DEV=&quot;venet0&quot;
TAP_ADDR=&quot;192.168.0.3&quot;
UML_ADDR=&quot;192.168.0.4&quot;
REV_TCP_PORTS=&quot;&quot;
REV_UDP_PORTS=&quot;&quot;
FWD_TCP_PORTS=&quot;9443&quot;
FWD_UDP_PORTS=&quot;9443&quot;

DIR=&quot;$( cd &quot;$( dirname &quot;$0&quot; )&quot; &amp;&amp; pwd )&quot;

[ ! -d /sys/class/net/$TAP_DEV ] &amp;&amp; tunctl -t $TAP_DEV
ifconfig $TAP_DEV $TAP_ADDR up

echo 1 &gt; /proc/sys/net/ipv4/ip_forward

iptables -t nat -I POSTROUTING -o $ROUTER_DEV -j MASQUERADE

for i in $REV_TCP_PORTS; do
	if [ &quot;x$i&quot; = &quot;x*&quot; ]; then
		P_TMP=&quot;&quot;
	else
		P_TMP=&quot;--dport $i &quot;
	fi
	iptables -t nat -A PREROUTING -p tcp $P_TMP-j RETURN
done
for i in $REV_UDP_PORTS; do
	if [ &quot;x$i&quot; = &quot;x*&quot; ]; then
		P_TMP=&quot;&quot;
	else
		P_TMP=&quot;--dport $i &quot;
	fi
	iptables -t nat -A PREROUTING -p udp $P_TMP-j RETURN
done

for i in $FWD_TCP_PORTS; do
	if [ &quot;x$i&quot; = &quot;x*&quot; ]; then
		P_TMP=&quot;&quot;
	else
		P_TMP=&quot;--dport $i &quot;
	fi
	iptables -t nat -A PREROUTING -i $ROUTER_DEV -p tcp $P_TMP-j DNAT --to-destination $UML_ADDR
done
for i in $FWD_UDP_PORTS; do
	if [ &quot;x$i&quot; = &quot;x*&quot; ]; then
		P_TMP=&quot;&quot;
	else
		P_TMP=&quot;--dport $i &quot;
	fi
	iptables -t nat -A PREROUTING -i $ROUTER_DEV -p udp $P_TMP-j DNAT --to-destination $UML_ADDR
done

nohup $DIR/vmlinux-i686 umid=$UML_ID root=/dev/root rootfstype=hostfs rootflags=$DIR/umlfs-i686 rw mem=48M init=/sbin/init con=pts eth0=tuntap,$TAP_DEV,,$UML_ADDR &amp;
</pre>
<p>一般只要修改脚本最开始的几行配置即可（最后一行 vmlinux 程序和 UML rootfs 路径默认使用脚本所在路径，如果不同请自行修改）：</p>
<ul>
<li><code>TAP_ADDR</code> 为 TUN/TAP 虚拟网卡地址，<code>UML_ADDR</code> 为 UML 系统内网卡地址；</li>
<li><code>REV_TCP_PORTS</code> 和 <code>REV_UDP_PORTS</code> 分别指定 OpenVZ 主机系统需要保留哪些 TCP 和 UDP 端口不转发到 UML 系统（多个以空格隔开），一般如果 UML 系统使用固定的一些端口，那么默认留空即可；</li>
<li><code>FWD_TCP_PORTS</code> 和 <code>FWD_UDP_PORTS</code> 分别指定哪些 TCP 和 UDP 端口需要转发到 UML 系统（默认只写了一个 <code>9443</code>，实际如果需要多个则以空格隔开），如果需要指定端口范围也可以写成 <code>15000:20000</code>，如果需要所有端口都转发到 UML 系统那可以直接写成 <code>*</code>（此时 <code>REV_TCP_PORTS</code> 一般最少要留一个端口用于 SSH 远程登录）；</li>
<li>需要分配给 UML 系统的内存大小请自行修改 vmlinux 的 <code>mem</code> 参数。</li>
</ul>
<h3 id="uml-ss-config">UML Shadowsocks 系统配置</h3>
<p>另外 UML 系统内部的网卡地址配置及启动 shadowsocks-libev 服务端的操作都在 <code>/etc/rc.local</code> 脚本中：</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
if [ -d /sys/class/net/eth0 ]; then
	ifconfig eth0 192.168.0.4 up
	route add default gw 192.168.0.3 dev eth0
	sleep 2
fi

SS_DNS=&quot;&quot;

[ -f /etc/default/pdnsd ] &amp;&amp; . /etc/default/pdnsd

# start local DNS server if needed
if [ &quot;x$START_DAEMON&quot; = &quot;xyes&quot; -o &quot;x$START_DAEMON&quot; = &quot;xYES&quot; ]; then
	pdnsd -d
	[ $? -eq 0 ] &amp;&amp; SS_DNS=&quot;-d 127.0.0.1 &quot;
fi

for i in `ls /etc/shadowsocks-libev/*.json 2&gt;/dev/null`; do
	SS_NAME=`basename $i .json 2&gt;/dev/null`
	start-stop-daemon -n shadowsocks-$SS_NAME -x ss-server -b -S -- -c $i -u $SS_DNS--fast-open
done

exit 0
</pre>
<p>简单说明一下：</p>
<ul>
<li>这里的 <code>192.168.0.4</code> 网卡 IP 地址就对应上面的 <code>UML_ADDR</code>，<code>192.168.0.3</code> 网关地址就是 <code>TAP_ADDR</code>，因此如果上面脚本中的地址修改了，那么 UML rootfs 的 <code>/etc/rc.local</code> 中的地址也需要修改；</li>
<li>你可以将 shadowsocks-libev 配置文件放到 <code>/etc/shadowsocks-libev</code> 目录中，此脚本会自动遍历并一一启动 <code>ss-server</code> 服务器，同时默认也开启了 TCP Fast Open 和 UDP 转发；</li>
<li>另外 rootfs 里集成了 <code>pdnsd</code> DNS 服务器，如果需要实现 DNS 缓存加速或者 UML 系统的 UDP DNS 解析存在问题，都可以启用 <code>pdnsd</code> 本地 DNS 服务器。</li>
</ul>
<p>配置修改完成之后，运行 <code>uml-linux.sh</code> 脚本就会在后台启动 UML 系统，并根据需要自动启动 shadowsocks-libev 服务器。</p>
<h3 id="control-uml-system">控制 UML 系统</h3>
<p>如果你需要登录到 UML 系统，可以先用 <code>uml_mconsole</code> 命令得到 UML 系统分配到的虚拟终端（第二个参数就是 UML 系统 ID）：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# uml_mconsole shadowsocks config con0
OK pts:/dev/pts/2
</pre>
<p>然后使用 <code>screen</code> 命令就可以连接到该虚拟终端上（默认什么都不显示，需要按回车键终端才会出来）：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# screen /dev/pts/2
</pre>
<p>如果想在 OpenVZ 主机系统里直接关闭整个 UML 系统，那也非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
root@zohead:~# uml_mconsole shadowsocks halt
</pre>
<h3 id="uml-ss-download">UML Shadowsocks 系统下载</h3>
<p>为了方便大家使用，我把 32 位和 64 位的 UML 4.10.1 版本 vmlinux 内核程序及配置和 Shadowsocks 服务端 rootfs 目录、<code>uml-linux.sh</code> 脚本一起打包分享给大家。</p>
<p>32 位的 UML Shadowsocks 系统（百度网盘备用）：</p>
<p><a href="https://zohead.com/downloads/uml-shadowsocks-i686.tar.xz">https://zohead.com/downloads/uml-shadowsocks-i686.tar.xz</a> <br />
<a href="https://pan.baidu.com/s/1kVdoWcB" target="_blank">https://pan.baidu.com/s/1kVdoWcB</a></p>
<p>64 位的 UML Shadowsocks 系统：</p>
<p><a href="https://zohead.com/downloads/uml-shadowsocks-x64.tar.xz">https://zohead.com/downloads/uml-shadowsocks-x64.tar.xz</a> <br />
<a href="https://pan.baidu.com/s/1dFDta9N" target="_blank">https://pan.baidu.com/s/1dFDta9N</a></p>
<p>将上面的文件下载到 VPS 某个目录并解压缩，修改 <code>uml-linux.sh</code> 文件中的转发端口，将 <a href="https://wiki.archlinux.org/index.php/Shadowsocks" target="_blank">Shadowsocks 服务端配置文件</a>放到 rootfs 的 <code>/etc/shadowsocks-libev</code> 目录，之后以 root 身份运行 <code>uml-linux.sh</code> 脚本即可。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>如果需要让 ShadowsocksR 服务器使用 TCP 等方式进行域名解析，可以修改 <code>/etc/default/pdnsd</code> 文件将其中的 <code>START_DAEMON</code> 改为 <code>yes</code> 来启用 <code>pdnsd</code> 本地 DNS 服务器。</p>
</blockquote>
<h3 id="uml-ssr-download">UML ShadowsocksR 系统</h3>
<p>考虑到某些网友的需要，我还生成了 32 和 64 位的 UML ShadowsocksR 系统，都是使用的最新支持混淆的 Python 版本 ShadowsocksR 服务器，有需要的朋友可以下载测试（百度网盘为备用下载地址）。</p>
<p>32 位的 UML ShadowsocksR 系统：</p>
<p><a href="https://zohead.com/downloads/uml-shadowsocksr-i686.tar.xz">https://zohead.com/downloads/uml-shadowsocksr-i686.tar.xz</a> <br />
<a href="https://pan.baidu.com/s/1eSDrWye">https://pan.baidu.com/s/1eSDrWye</a></p>
<p>64 位的 UML ShadowsocksR 系统：</p>
<p><a href="https://zohead.com/downloads/uml-shadowsocksr-x64.tar.xz">https://zohead.com/downloads/uml-shadowsocksr-x64.tar.xz</a> <br />
<a href="https://pan.baidu.com/s/1o7F3qpc">https://pan.baidu.com/s/1o7F3qpc</a></p>
<p>ShadowsocksR 系统的 rootfs 只包含了基础 Python 环境和 ShadowsocksR 服务器程序，同样下载并解压缩，由于包含了 Python 环境，该 rootfs 解压缩之后接近 30 MB。</p>
<p>使用前可根据需要修改 <code>uml-linux.sh</code> 文件中的转发端口，将 <a href="https://github.com/breakwa11/shadowsocks-rss/wiki/config.json" target="_blank">ShadowsocksR 服务器 JSON 格式配置文件</a>放到 rootfs 的 <code>/etc/shadowsocks</code> 目录，之后以 root 身份运行 <code>uml-linux.sh</code> 脚本即可（启用 <code>pdnsd</code> 本地 DNS 服务器的方法和上面的相同）。</p>
<h2 id="uml-bbr-compare">UML 系统 BBR 效果</h2>
<p>最后对比一下我的 AlphaRacks OpenVZ VPS 上启用 BBR 前后的对比速度，这里我就直接观看同一个 1080p 的 YouTube 视频来对比统计信息了。</p>
<p>在我的江苏移动宽带环境下，启用 BBR 之前 YouTube 视频连接速度一般只能跑到 1Mbps 左右：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442863/openvz-ss-speed.png" alt="OpenVZ 未启用 BBR 的 YouTube 速度" title="OpenVZ 未启用 BBR 的 YouTube 速度"></p>
<p>而在使用 UML Shadowsocks 系统开启 BBR 之后能跑到 2Mbps，不过有的时候速度还是不太稳定：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442867/openvz-ss-speed-bbr.png" alt="OpenVZ 启用 UML BBR 的 YouTube 速度" title="OpenVZ 启用 UML BBR 的 YouTube 速度"></p>
<p>UML 目前也是主要用于调试验证 Linux 内核功能的，总之 OpenVZ 使用 UML 开启 BBR 的实际使用效果还是需要长期观察测试的，本文也主要关注 UML 系统下使用 Shadowsocks 的问题，并没有考虑通用的情况，如果文章中有任何问题还请提出指正，祝大家玩的开心。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/openvz-uml-bbr/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>newifi mini路由器OpenWRT初步体验</title>
		<link>https://zohead.com/archives/newifi-mini-openwrt/</link>
		<comments>https://zohead.com/archives/newifi-mini-openwrt/#comments</comments>
		<pubDate>Sat, 09 Jan 2016 16:54:13 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[生活]]></category>
		<category><![CDATA[网络]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[dnsmasq]]></category>
		<category><![CDATA[gfwlist]]></category>
		<category><![CDATA[ipset]]></category>
		<category><![CDATA[newifi mini]]></category>
		<category><![CDATA[OpenWRT]]></category>
		<category><![CDATA[PandoraBox]]></category>
		<category><![CDATA[Shadowsocks]]></category>
		<category><![CDATA[翻墙]]></category>
		<category><![CDATA[路由器]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=1115</guid>
		<description><![CDATA[关于 newifi mini 之前在我住的地方一直都是凑合用着房东默认提供的渣渣 FAST 牌子路由器给几个人 PC 和手机上网，最近在尝试手机视频和照片通过 Wi-Fi DLNA 推送到 Android TV 棒上时发现这款路由器的 Wi-Fi 速度虽然看起来是 56 Mbps 的，但实际无线局域网的传输速度却异常感人，通过 iperf 测试工具得到的局域网机器之间的纯粹网络传输速度只有 600 KB/s 左右，这就造成 DLNA 媒体推送的效果非常差：稍微大点的照片需要等个几秒才能出来，视频推送更是经常缓冲无法忍。 这几天在网上搜索一番之后果断有了换路由器的念头，刚好最近小米、360、百度 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>关于 newifi mini</h2>
<p>之前在我住的地方一直都是凑合用着房东默认提供的渣渣 FAST 牌子路由器给几个人 PC 和手机上网，最近在尝试手机视频和照片通过 Wi-Fi DLNA 推送到 Android TV 棒上时发现这款路由器的 Wi-Fi 速度虽然看起来是 56 Mbps 的，但实际无线局域网的传输速度却异常感人，通过 iperf 测试工具得到的局域网机器之间的纯粹网络传输速度只有 600 KB/s 左右，这就造成 DLNA 媒体推送的效果非常差：稍微大点的照片需要等个几秒才能出来，视频推送更是经常缓冲无法忍。</p>
<p>这几天在网上搜索一番之后果断有了换路由器的念头，刚好最近小米、360、百度等厂商都推出了自家物（Zì）美（Dài）价（Hòu）廉（Mén）的智能路由器，比较之后发现联想和百度联合推出的 newifi mini 路由器相对符合我的要求：</p>
<ul>
<li>官方系统默认没有上锁可以很方便的刷 OpenWRT 等系统；</li>
<li>支持 2.4G 和 5G Wi-Fi，而且支持 802.11ac 千兆无线；</li>
<li>网上有一些黑点，但综合评价装 OpenWRT 之后还行；</li>
<li>99 RMB 的价格也还算合理（有段时间特价到 69 哦）。</li>
</ul>
<p>这样就在京东上入了一个，上午下单下午就送到的路由器带盒子照片：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442857/newifi-mini.jpg" alt="newifi mini路由器" title="newifi mini路由器"></p>
<h2>折腾 OpenWRT 系统</h2>
<p>外观看起来还凑合，不多说插上网线先试试官方系统，用了不到 10 分钟难以忍受必须弃用，从这里下载适合 newifi mini 的 PandoraBox OpenWRT 系统和 uboot 文件：</p>
<p><a href="http://downloads.openwrt.org.cn/PandoraBox/Lenovo-Y1_RY-1S/">http://downloads.openwrt.org.cn/PandoraBox/Lenovo-Y1_RY-1S/</a></p>
<p>重启路由器时长按 Reset 键进入恢复模式通过连网线之后就可以刷上（我用的 Dell Chromebook 和 Acer Win10 平板都没有 RJ45 接口，还好我还有个 USB 的有线网卡），刷的速度还是很快的，重启之后发现 PandoraBox 系统只是启动时间就已经比官方系统要好很多了 ^_^。</p>
<p>废话不多说，下面就是先在 OpenWRT 里配置 PPPoE 拨号连上网再说，刷完系统之后实际测试目前除了 5GHz 的 Wi-Fi 信号穿墙效果比较差（看起来在国内几个智能路由器里都有）之外还没发现什么问题。</p>
<p>接着是最主要的步骤：安装和配置 ShadowSocks 软件包实现 PC 和手机的无缝翻墙，由于之前从来没有搞过 OpenWRT 系统，在看了一些文章之后采用了飞羽博客里提到的使用 ipset + gfwlist 实现按需翻墙的方案，这样既可以避免影响访问国内网站和一些国外网站的速度，而且这种方案相对也比较灵活，默认使用 gfwlist 可以覆盖绝大多数需要翻墙的网站，也可以自己手工增加域名或者 IP 地址，详细介绍请参考 <a href="https://cokebar.info/archives/962">飞羽博客</a>。</p>
<p>我在实际测试中发现如果使用很多网友选择的 ChinaDNS 方案还是有一些网站域名会碰到 DNS 污染的情况，这样导致有一些网站还是不能访问，因此我选择了直接使用 ShadowSocks 解析（需要 ShadowSocks 服务端支持 UDP 转发）所有在 ipset 列表中的域名的方式，这样只需要在 PandoraBox 里运行 ss-redir 和 ss-tunnel 服务。</p>
<p>关于 gfwlist 的自动更新问题，为了方便我也是用的飞羽提供的 <code>gfwlist2dnsmasq.py</code> Python 脚本自动生成 <code>dnsmasq_list.conf</code> 配置文件，如果你的路由器里装有 Python 的运行环境可以直接使用这个脚本生成配置文件保存到路由器中。</p>
<p>我看到 newifi mini 的 rootfs 空间实在是有点小不适合再装个相对庞大的 Python 环境，因此就把 <code>gfwlist2dnsmasq.py</code> 放到我的 VPS 上了，并添加了 crontab 任务设置每天凌晨 5 点自动根据 gfwlist 生成 <code>dnsmasq_list.conf</code> 配置文件并输出到我的网站（也就是这个博客）目录里，并同时在 PandoraBox 上也添加了每天凌晨 5 点 10 分从我的博客下载 dnsmasq 配置文件覆盖到 <code>/etc/dnsmasq.d</code> 目录中。</p>
<p>这个是我基于 gfwlist 自动生成的 dnsmasq 配置文件地址：</p>
<p><a href="https://zohead.com/downloads/dnsmasq.tar.gz">https://zohead.com/downloads/dnsmasq.tar.gz</a></p>
<p>大家如果图省事的话也可以直接用我的这个配置文件哦，另外 PandoraBox 上的 crontab 定时任务配置如下所示：</p>
<pre class="brush: bash; title: ; notranslate">
[root@PandoraBox:/root]#cat /etc/crontabs/root
10 5 * * * curl -k -o /tmp/dnsmasq.tar.gz https://zohead.com/downloads/dnsmasq.tar.gz &amp;&amp; tar -C /tmp -xzf /tmp/dnsmasq.tar.gz &amp;&amp; cat /tmp/dnsmasq_list.conf &gt; /etc/dnsmasq.d/dnsmasq_list.conf &amp;&amp; rm -f /tmp/dnsmasq.tar.gz /tmp/dnsmasq_list.conf
</pre>
<p>实际使用时改掉行开始的地方执行的时间和后面的下载地址即可。</p>
<h2>手机 Tasker 设置</h2>
<p>经过一番小折腾我和小伙伴们在住的地方就可以不用装任何其它软件直接无缝翻墙上网了，对于我的 Android 手机在带出去和在公司里使用也需要翻墙的情况，就可以用到最新 ShadowSocks App 的 Tasker 集成功能：</p>
<ul>
<li>创建 Tasker 配置文件和任务，设置回到住处连接到 newifi mini 路由器对应 SSID 的 Wi-Fi 时自动关闭手机的 ShadowSocks App；</li>
<li>再创建另外一个 Tasker 配置文件和任务，设置离开此 SSID 的 Wi-Fi 时就自动开启 ShadowSocks 并连接到指定的服务器。</li>
</ul>
<p>来一张我的手机 Tasker App 的配置截图：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442946/shadowsocks-tasker.jpg" alt="ShadowSocks Tasker配置" title="ShadowSocks Tasker配置"></p>
<p>这样我就可以在任何地方都能 Happy 的上各种不存在的网站咯，本文中有任何问题欢迎提出指正哦，最后还是祝大家玩的开心。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/newifi-mini-openwrt/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>解决SSH Tunnel在Android 4.4下的问题</title>
		<link>https://zohead.com/archives/ssh-tunnel-4-4/</link>
		<comments>https://zohead.com/archives/ssh-tunnel-4-4/#comments</comments>
		<pubDate>Mon, 09 Feb 2015 16:24:09 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[ProxyDroid]]></category>
		<category><![CDATA[redsocks]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[SSH Tunnel]]></category>
		<category><![CDATA[代理]]></category>
		<category><![CDATA[翻墙]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=851</guid>
		<description><![CDATA[去年双11在 Linost 上打折促销买的 SSH 账号一直在电脑和手机上用来翻墙效果还是可以的，电脑上用 ssh 命令，Android 手机上用 SSH Tunnel 这款 App 配合使用的话也没发现什么问题。但最近把 New PadFone Infinity 手机的系统升级到 4.4 版本之后就发现 SSH Tunnel 的全局代理功能无法正常工作了，App 连接 SSH 服务器提示成功，但是实际在手机上其它 App 的任何网络请求都会报错，根本无法使用。 刚开始没找到解决办法，SSH Tunnel 的 Google Play Store 评论里也有其它用户反映了这个问题，但作者也一直没 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>去年双11在 <a href="https://my.linost.com/aff.php?aff=1674" target="_blank">Linost</a> 上打折促销买的 SSH 账号一直在电脑和手机上用来翻墙效果还是可以的，电脑上用 ssh 命令，Android 手机上用 <a href="https://play.google.com/store/apps/details?id=org.sshtunnel" target="_blank">SSH Tunnel</a> 这款 App 配合使用的话也没发现什么问题。但最近把 New PadFone Infinity 手机的系统升级到 4.4 版本之后就发现 SSH Tunnel 的全局代理功能无法正常工作了，App 连接 SSH 服务器提示成功，但是实际在手机上其它 App 的任何网络请求都会报错，根本无法使用。</p>
<p>刚开始没找到解决办法，SSH Tunnel 的 Google Play Store 评论里也有其它用户反映了这个问题，但作者也一直没有更新此软件，因此想了一个临时的办法就是用 SSH Tunnel 的动态 SOCKS 代理功能 + <a href="https://play.google.com/store/apps/details?id=org.proxydroid" target="_blank">ProxyDroid</a> 这款 App 的全局代理功能配合实现 Android 的全局翻墙功能。这样需要先关闭 SSH Tunnel 的全局代理功能，然后指定一个动态绑定端口，然后在 ProxyDroid 里指定使用 SSH Tunnel 绑定端口开启全局代理，经过实际测试可以达到效果。</p>
<p>后来想到明明一个 SSH Tunnel App 就可以实现的功能，现在必须安装两个 App 终究是不太好的，而且稍微了解下就清楚了 SSH Tunnel 和 ProxyDroid 的全局代理功能都是通过 redsocks + iptables 配合使用来实现的。</p>
<p>我们先来看看 SSH Tunnel 在启用全局代理选项并连接服务器之后生成的临时 <strong>redsocks.conf</strong> 配置文件内容：</p>
<pre class="brush: plain; title: /data/data/org.sshtunnel/redsocks.conf; notranslate">
base {
 log_debug = off;
 log_info = off;
 log = stderr;
 daemon = on;
 redirector = iptables;
}

redsocks {
 local_ip = 127.0.0.1;
 local_port = 8123;
 ip = 127.0.0.1;
 port = 9050;
 type = socks5;
}
</pre>
<p>这个文件所在路径为：<strong>/data/data/org.sshtunnel</strong>，<span style="line-height: 19.2000007629395px;">开启 root 权限之后</span><span style="line-height: 1.5;">安装终端模拟器或者其它文件管理器都可以看到。稍加分析可以看到 <strong>redsocks.conf</strong> 配置文件是由 SSH Tunnel 中自带的 <strong>proxy_socks.sh</strong> 脚本自动生成的。</span></p>
<p>通过查看 redsocks 项目网站上的说明，这个生成的临时 redsocks.conf 似乎也是对的，但是连接成功之后通过 ps 命令却看不到 redsocks 进程，看来就是 redsocks 进程没有正常运行引起的了。</p>
<p>经过多番尝试修改 <strong>proxy_socks.sh</strong> 脚本以产生不同的配置文件，才发现 SSH Tunnel 自带的 <strong>proxy_socks.sh</strong> 生成的配置文件在 Android 4.4 上由于日志选项被关闭会导致 redsocks 进程异常退出（具体原因未知）。使用 root 浏览器等工具修改该脚本为以下形式（修改的行已高亮显示出来）：</p>
<pre class="brush: bash; highlight: [12,13]; title: /data/data/org.sshtunnel/proxy_socks.sh; notranslate">
#!/system/bin/sh

DIR=/data/data/org.sshtunnel

PATH=$DIR:$PATH

case $1 in
 start)

echo &quot;
base {
 log_debug = on;
 log_info = on;
 log = stderr;
 daemon = on;
 redirector = iptables;
}
&quot; &gt;$DIR/redsocks.conf

   echo &quot;
redsocks {
 local_ip = 127.0.0.1;
 local_port = 8123;
 ip = 127.0.0.1;
 port = $2;
 type = socks5;
}
&quot; &gt;&gt;$DIR/redsocks.conf

  $DIR/redsocks -p $DIR/redsocks.pid -c $DIR/redsocks.conf

  ;;
stop)
  kill -9 `cat $DIR/redsocks.pid`

  rm $DIR/redsocks.pid
  rm $DIR/redsocks.conf

  ;;
esac
</pre>
<p>保存退出之后，重新开启 SSH Tunnel 的全局代理功能并连接 SSH 服务器，这时查看 redsocks 进程：</p>
<pre class="brush: bash; title: ; notranslate">
root@ASUS-A86:/ # busybox ps ax | busybox grep -i redsock
 7808 root       0:00 /data/data/org.sshtunnel/redsocks -p /data/data/org.sshtunnel/redsocks.pid -c /data/data/org.sshtunnel/redsocks.conf
 8211 root       0:00 busybox grep -i redsock
</pre>
<p>之后你就会发现处于墙外无限制的状态了。</p>
<p>另外还有一种解决办法就是直接把 ProxyDroid 软件中的 redsocks 二进制文件（路径为：/data/data/org.proxydroid）拷贝到 <strong>/data/data/org.sshtunnel</strong> 目录中直接覆盖，这样就不用修改脚本了，玩的开心 ^_^</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/ssh-tunnel-4-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
