官办青楼暂停营业之后的探索之旅——基于teddysun的代码编译Shadowsocks-libev

前两天在网上看到消息,说出现了一款可以合法翻墙的浏览器,叫酷鸟。浏览器加个插件甚至预置插件便利用户跨越中国防火墙这事儿不稀罕,稀罕离奇的是网传的它的前置定语——国内首家[1]合法翻墙。虽说相关的信息后来大多被删除[2],但事件给我留下的感觉却相当的诡异。其一,中国官方很长时间内并不承认有国家级的防火墙,并且也暧昧的界定翻墙为违法行为,那么翻墙又如何能够“合法”的进行?其二,以中国大陆当下的政经环境,偷偷的打枪已然胆战心惊,可却有人主动戴上高帽就怕别人不晓得它就是下一秒钟要押上戏台被批斗的反革命?其三,消息在网上的“爆款”实在是过快,似乎有明显的人为推动炒作手法,其后又莫明的发生消息被删除、酷鸟被消声……加上网上有人分析指出酷鸟实际带有后门,令我基本确信背后更可能是有关力量想推动数据收集与机器学习,以便不久的将来能够更精准的堆砌奥威尔式柏林墙。

看到有网友把酷鸟等同类浏览工具比喻成官办青楼,我哑然而笑。国进民退自非小民之力可挽回,但工作和生活之中所需却让我觉得必须正视一些可能的前景,官办青楼尚且被临时打烊,遍地私家少年总得自己学会怎么找到相好的吧,况且自己能够随时追新(的版本和获取更多的适时特性)。于是乎,在摸着秋水逸冰宣布离去、不再更新维护的Shadowsocks一键安装包石头的基础上,用一台Bandwagon Host VPS实施了一路艰难的探索,并将建设成就记录下来供狐(同)朋(仁)狗(志)友(士)们参考。

要在中国大陆探索不合法的灯红酒绿场所,靠高(尚)(道)德(导航)是没用的,只能自我寻觅(编译)。考虑到有这类需求的大多都不“拖家带口”,大多在小内存、有资源限制的主机上编译,这里就以圈内向来有着资源友好名声的Debian 8 (Jessie)为例说一下整个编译流程。如此,一旦将来官楼遍地,私以为,狗友们还能艰苦奋斗而自(支)力(犁)更(根)生(盛),让私会莺莺的张生有最新的梯子。

简单说来,这次编译安装Shadowsocks的不便因素一是资源限制,主机内存小、CPU占用不能过高;二是要安装最新版本,必须下载新版源代码自己编译,而非以一键安装包或预安装包形式进行。

采用Debian 8系统,好处是:

  • 它目前仍处于“服役期”[3],且与另一款主流发行版Ubuntu同宗,适用面较宽
  • 安装源里用于编译所需的软件较红帽子系的CentOS 6新得多,更好的应付当前的编译需求
  • 编译所需的关键依赖包除了Mbed TLS之外,基本上都可由Debian DPA提供,稳定性和资源占用有优势

根据目前仍在持续维护的Shadowsocks-libev的官方说明,编译前需要几个主要的软件包(依赖包),其中最重要的两个分别是libmbedtls、libsodium,后者可通过DEB.SURY.ORG获取,而前者只能手工编译了。

第一步,在干净的Debian 8系统中以管理员身份[4]登录系统,先新增源库并安装必要的软件工具

1
2
3
4
5
6
7
8
9
10
11
apt-get -y install apt-transport-https lsb-release ca-certificates wget
# 下载验证文件以新增DEB.SURY.ORG的Debian DPA
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
# 将新增的DPA写入系统源列表
sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
# 更新源数据
apt-get update
# 以软件管理包方式安装编译所需工具及依赖
apt-get install -y --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev libev-dev libc-ares-dev automake libsodium-dev
# 下载并安装Mbed TLS
wget -O - https://tls.mbed.org/download/mbedtls-2.16.3-gpl.tgz | tar xvz && cd mbedtls-2.16.3 && make SHARED=1 && make DESTDIR=/usr install && ldconfig

第二步,正式安装Shadowsocks-libev

1
2
3
4
5
6
7
# 下载Shadowsocks-libev源码包,目前是3.3.3
wget -O - https://github.com/shadowsocks/shadowsocks-libev/releases/download/v3.3.3/shadowsocks-libev-3.3.3.tar.gz | tar xvz
cd shadowsocks-libev-3.3.3
# 预编译,如不加--disable-documentation参数,则还要安装asciidoc和xmlto这两个系统软件包
./configure --disable-documentation
# 编译及安装到预设或默认目录
make && make install

第三步,进行安装后期工作。这一步涉及到软件的自启动文件、软件的配置文件等,直接借用teddysun的轮子而不从头编写了。因大多低配主机为压低成本,CPU不包含用于高阶加密的AES指令集,Shadowsocks-libev配置文件的加密方式如默认,可采用chacha20-ietf-poly1305,相比于AES系的aes-256-gcm更合适。如已知CPU启用了AES指令集,则加密方式选择“硬解压”的aes-256-gcm在多数情形下更有效率和优势。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 下载并设置启动管理文件
wget -O /etc/init.d/shadowsocks https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian && chmod +x /etc/init.d/shadowsocks
# 编辑配置文件并根据实际需求设定参数
mkdir /etc/shadowsocks-libev
cat > /etc/shadowsocks-libev/config.json<<-EOF
{
"server":"0.0.0.0",
"server_port":此处填写服务器端的端口号如12345,
"password":"此处填写连接用的密码",
"timeout":300,
"user":"nobody",
"method":"此处填写加密方式,比如aes-128-cfb、aes-256-gcm、chacha20-ietf-poly1305等",
"fast_open":false,
"nameserver":"8.8.8.8",
"mode":"tcp_and_udp"
}
EOF
# (重)启动Shadowsock服务查看是否正常运行
/etc/init.d/shadowsocks start && /etc/init.d/shadowsocks status
# or in systemctl way after reboot
systemctl restart shadowsocks && systemctl status shadowsocks

第四步(可选),设定服务器防火墙。Debian 8的用户大多使用UFW或iptables这两款防火墙,使用后者,则建议搭配一个防火墙规则保存软件,以便系统重启后原规则立即生效。这里以iptables为例(完整的配置说明见个人网站iptables的几条简单设置一文),相关命令行如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装Debian系统工具包
apt install -y debconf-utils
# 设置预应答参数
debconf-set-selections <<< 'iptables-persistent iptables-persistent/autosave_v4 boolean true'
debconf-set-selections <<< 'iptables-persistent iptables-persistent/autosave_v6 boolean true'
# 安装防火墙工具及辅助保存工具
apt install iptables iptables-persistent
# 设置防火墙规则,放行SSH端口及Shadowsocks端口(假设12345)的数据,并将除此外所有不相关入站数据作丢包处理
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport $(cat /etc/ssh/sshd_config | grep 'Port\ [0-9]\{2,5\}' | cut -d ' ' -f 2) -j ACCEPT
iptables -A INPUT -p tcp --dport 12345 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP && iptables -P OUTPUT ACCEPT && iptables -P FORWARD DROP
# 保存防火墙规则
iptables-save > /etc/iptables/rules.v4 && ip6tables-save > /etc/iptables/rules.v6

至此,手工的编译工作结束,试了一下效果,还不错。


  1. 据说“首家”后被更正为“首批” ↩︎

  2. 微博等主要媒体的相关信息之后一览无迹,如07073官网报导的11月13当天ID为天眼查的微博 ↩︎

  3. Debian 8 Jessie属于LTS长期支持版,因此有长达五年的生命期,在2018年6月之后仍可获得安全更新 ↩︎

  4. 如果以非root身份登录进系统,则后面的包安装、编译安装等操作均须以sudo身份执行 ↩︎