編譯安裝路由器用的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
參考資料