编译安装路由器用的Privoxy 3.0.28(华硕RT-AC88U,原版梅林384.15)

时间:2024-03-04 19:03:58

编译安装路由器用的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

 参考资料

 https://www.privoxy.org/user-manual/configuration.html