编译安装路由器用的Privoxy 3.0.28(华硕RT-AC88U,原版梅林384.15)
Privoxy有什么特殊之处?
- 支持和SOCKS/HTTP代理的级联。这个功能轻松将SOCKS转为HTTP,当然也可以和某些不可名之软件配合形成级联(说出名字会导致本帖子根本发不出来)。
- 支持强大的自定义过滤规则,实现类似浏览器PAC脚本的功能实在是小意思,可以指定访问某些URL走特定的线路。
下面是编译Privoxy的笔记,包括在路由器上本地编译、在Ubuntu上交叉编译两种方式,二选一,爱用哪种用哪种。
在路由器上本地编译
安装编译工具
这主要是仰仗Entware中的gcc包。先安装好Entware,再从Entware的源安装编译工具。
opkg install autoconf gcc coreutils-groups zlib-dev automake libtoolbin cmake unzip curl
以下都假定在路由器的外挂硬盘目录下操作(取名为WORKHOME),因为root用户的默认主目录下空间小,而且易失,重启就没了。
export WORKHOME=/tmp/mnt/WD12T/home
编译PCRE正则式库
Privoxy对HTTP字段的过滤就依赖于正则式匹配。
为什么要编译PCRE?因为不能让Privoxy自动使用梅林的系统目录下(也就是/lib目录)的正则式库,这些库是依赖于libc.so.0的,而这个gcc编译出来的产物是依赖于libc.so.6的,这两个libc在链接时当然会冲突,必须统一使用其中一个libc。使用Entware的源中安装的PCRE库貌似也有点问题,Privoxy目录下自带的PCRE版本老,所以就自己编译一个PCRE给Privoxy用。条条大路通罗马,此路不通则绕行,不必吊死在一棵树上。
编译时使用CMake工程。PCRE虽然也提供了Autoconf工程,不过坑比较多,我都踩过了才发现改用CMake能让生活更简单、更充满阳光。
cd $WORKHOME curl -O https://ftp.pcre.org/pub/pcre/pcre-8.44.zip unzip pcre-8.44.zip cd pcre-8.44 cmake -DCMAKE_INSTALL_PREFIX=$WORKHOME/pcre -DPCRE_SUPPORT_UTF=ON -DPCRE_SUPPORT_JIT=ON -DCMAKE_BUILD_TYPE=Release . make install
编译Privoxy
下载Privoxy需要挂代理。
cd $WORKHOME
curl -x socks5://127.0.0.1:1080 -O https://www.privoxy.org/sf-download-mirror/Sources/3.0.28%20%28stable%29/privoxy-3.0.28-stable-src.tar.gz
tar zxf privoxy-3.0.28-stable-src.tar.gz
cd privoxy-3.0.28-stable
autoheader autoconf CFLAGS="-O2 -I$WORKHOME/pcre/include" LDFLAGS=-L$WORKHOME/pcre/lib ./configure --prefix=$WORKHOME/privoxy make
这里只编译不安装,因为安装脚本有一堆检查,比如检查当前用户是否为root,这些安全检查跟我们局域网使用关系不大(万一需要,可以用防火墙阻止从WAN访问Privoxy的端口),而且碍事,所以就不要安装了。也可以把那些碍事的脚本代码注释掉再安装。
编译出来的可执行文件依赖于libc.so.6。
在Ubuntu中交叉编译
跟Ubuntu的版本关系不大,假定为18.04。
准备编译环境
首先最好是按照Ubuntu 18.04上交叉编译华硕路由器RT-AC88U的梅林384.15版本这个帖子或者梅林工具链的官方README,把对应的工具链的设置熟悉一下,能完整编译一下梅林的源码最好,那样的话依赖的第三方包和梅林工具链肯定没问题了。
假定已按上述帖子把依赖的各种第三方包都装好,那么下载梅林工具链并设置/opt下的各个符号链接。针对华硕不同型号的路由器,需要设置的工具链的符号链接不一样。路由器主要是有HND和非HND的类别区分,HND是Home Networking Division的缩写,是Broadcom搞的。以下均假定针对RT-AC88U型号。
cd ~ git clone https://github.com/RMerl/am-toolchains sudo ln -s ~/am-toolchains/brcm-arm-hnd /opt/toolchains sudo ln -s ~/am-toolchains/brcm-arm-sdk/hndtools-arm-linux-2.6.36-uclibc-4.5.3 /opt/brcm-arm sudo ln -s ~/am-toolchains/brcm-mips-sdk/tools/brcm /opt/brcm
设置PATH便于Autoconf优先搜索到工具链中的gcc、cc1等工具:
export PATH=/opt/brcm-arm/bin:/opt/brcm-arm/arm-brcm-linux-uclibcgnueabi/bin:/opt/brcm-arm/libexec/gcc/arm-brcm-linux-uclibcgnueabi/4.5.3/:$PATH
编译PCRE
这里不用CMake了,改用Autoconf。因为CMake在这里搞交叉编译麻烦。
cd ~ curl -O https://ftp.pcre.org/pub/pcre/pcre-8.44.zip unzip pcre-8.44.zip cd pcre-8.44 CFLAGS="-O2" ./configure --prefix=$HOME/pcre --host=arm-linux --enable-utf8 --enable-jit make install
编译Privoxy
下载Privoxy需要挂代理。
这里有个坑,梅林开发组的大佬在制作梅林工具链本身时是采用了绝对路径的,所以梅林工具链中Autoconf带的Perl脚本使用了绝对路径来定位,不信可以打开$HOME/am-toolchains/brcm-arm-sdk/hndtools-arm-linux-2.6.36-uclibc-4.5.3/share/autoconf/autom4te.cfg这个文件看看,里面使用了诸如"/projects/hnd/tools/linux/hndtools-arm-linux-2.6.36-uclibc-4.5.3/share/autoconf"这样的绝对路径。所以需要建立符号链接,不然执行autoheader/autoconf时会提示有些Perl模块找不到。符号链接指向的真实路径同样和路由器是否为HND类别的有关。RT-AC88U的如下:
sudo mkdir -p /projects/hnd/tools sudo ln -s $HOME/am-toolchains/brcm-arm-sdk /projects/hnd/tools/linux
配置Privoxy工程:
cd ~
curl -x socks5://127.0.0.1:1080 -O https://www.privoxy.org/sf-download-mirror/Sources/3.0.28%20%28stable%29/privoxy-3.0.28-stable-src.tar.gz
tar zxf privoxy-3.0.28-stable-src.tar.gz
cd privoxy-3.0.28-stable
autoheader
autoconf
CFLAGS="-O2 -I$HOME/pcre/include" LDFLAGS="-L$HOME/pcre/lib" ./configure --prefix=$HOME/privoxy --host=arm-linux --with-docbook=no
到这步后,先不编译。新开一个shell窗口,确保这个shell窗口中未设置梅林工具链的PATH,在这个窗口中用Ubuntu自带的gcc编译出程序dftables,再运行dftables生成chartables.c源码文件。如果用梅林工具链中的gcc编译的话,产物是针对ARM的,显然不能在Ubuntu amd64环境中运行。
cd ~/privoxy-3.0.28-stable
gcc -o pcre/dftables -pipe -O2 -I$HOME/pcre/include -pthread -Wall -Ipcre pcre/dftables.c pcre/dftables >pcre/chartables.c
然后回到原来的shell窗口继续编译Privoxy:
make
这里也是只编译不安装。编译出来的可执行文件依赖于libc.so.0,最终依赖于uClibc,而在路由器上用gcc本地编译出来的会依赖于libc.so.6。
配置Privoxy
假定编译产物最后放在路由器的目录/tmp/mnt/WD12T/home/privoxy下,目录结构如下:
admin@RT-AC88U-4AF8:/tmp/mnt/WD12T/home/privoxy# ls -la drwxrwxrwx 6 admin root 4096 Mar 24 14:28 . drwxrwxrwx 10 admin root 4096 Mar 24 14:28 .. drwxrwxrwx 3 admin root 4096 Apr 19 05:32 etc drwxrwxrwx 2 admin root 4096 Mar 24 14:28 sbin drwxrwxrwx 4 admin root 4096 Mar 24 14:28 share drwxrwxrwx 4 admin root 4096 Mar 24 14:28 var
下载Privoxy的Windows版本的zip包。假定把zip中的配置文件解压到路由器的目录/tmp/mnt/WD12T/home/privoxy/etc下面。
所需要的文件/目录列表为:
config.txt default.action default.filter match-all.action templates (这个是目录) trust.txt user.action user.filter
编辑主配置文件config.txt
设置其他配置文件所在的目录:
confdir /tmp/mnt/WD12T/home/privoxy/etc
设置监听端口。默认是127.0.0.1:8118,改为监听在路由器的内网IP 192.168.xxx.xxx上,要不内网的设备访问不了8118端口。注意:此处不要设置为监听在0.0.0.0:8118,那样会导致路由器外面的人也能访问你的这个端口。
listen-address 192.168.1.1:8118
设置log目录。方便查看错误的原因。
logdir /tmp/mnt/WD12T/home/privoxy/var/log/privoxy
增加自定义动作。假定过滤动作文件名为pac.action,文件名是可以随便取的。
actionsfile pac.action
自定义URL过滤器
pac.action文件的内容如下。以后可以随时根据需要增加需要转发的URL,亦即对于满足条件的URL,是转发到本机的SOCKS5代理的。
{+forward-override{forward .}} / {+forward-override{forward-socks5 127.0.0.1:8080 .}} .github.com .microsoft.com
添加路由器开机启动项
建立符号链接:
ln -s /tmp/mnt/WD12T/home/privoxy/sbin/privoxy /opt/bin/privoxy
新建梅林的开机脚本文件/opt/etc/init.d/S81privoxy,内容为:
#!/bin/sh ENABLED=yes PROCS=privoxy ARGS="--no-daemon --pidfile /tmp/mnt/WD12T/home/privoxy/var/run/privoxy.pid /tmp/mnt/WD12T/home/privoxy/etc/config.txt" PREARGS="" DESC=$PROCS PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/tmp/mnt/WD12T/home/privoxy . /opt/etc/init.d/rc.func
注意这个脚本最后调用的是/opt/etc/init.d/rc.func,确保这个文件存在。这文件是Entware的服务管理框架脚本,参看https://github.com/Entware/entware-ng-rtndev/blob/master/entware-opt/files/rc.func。
脚本存盘后记得给S81privoxy加上可执行属性:
chmod u+x /opt/etc/init.d/S81privoxy
参考资料