编译安装路由器用的Privoxy 3.0.28(华硕RT-AC88U,原版梅林384.15)
编译安装路由器用的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.-uclibc-4.5. /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 admin root Mar : .
drwxrwxrwx admin root Mar : ..
drwxrwxrwx admin root Apr : etc
drwxrwxrwx admin root Mar : sbin
drwxrwxrwx admin root Mar : share
drwxrwxrwx admin root Mar : 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:
设置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: .}}
.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
编译安装路由器用的Privoxy 3.0.28(华硕RT-AC88U,原版梅林384.15)的更多相关文章
- skywalking探针tomcat8.0.28报错解决
在部署skywalking agent的时候遇到一个异常 环境如下: tomcat8.0.28 catalina.out 日志报如下错误 30-Apr-2019 10:25:57.664 INFO [ ...
- 手动脱KBys Packer(0.28)壳实战
作者:Fly2015 吾爱破解培训第一课选修作业第5个练习程序.在公司的时候用郁金香OD调试该加壳程序的时候出了点问题,可是回家用吾爱破解版的OD一调试,浑身精神爽,啥问题也没有. 首先使用查壳工具对 ...
- centos7.6环境zabbix3.2源码编译安装版升级到zabbix4.0长期支持版
zabbix3.2源码编译安装版升级到zabbix4.0长期支持版 项目需求: .2版本不再支持,想升级成4.0的长期支持版 环境介绍: zabbix服务端是编译安装的,数据库和web在一台机器上 整 ...
- MySQL8.0.28安装教程全程参考MySQL官方文档
前言 为了MySQL8.0.28安装教程我竟然在MySQL官方文档逛了一天,至此献给想入门MySQL8.0的初学者.以目前最新版本的MySQL8.0.28为示例进行安装与初步使用的详细讲解,面向初学者 ...
- java连接mysql8.0.28数据库实例
首先说明,由于是8版本的数据库,所以配置类的写法上与5版本的有所区别,需要注意,同时用idea或eclipse时需要导入jar包,jar包的下载链接: https://dev.mysql.com/ge ...
- mysql 8.0.28 查询语句执行顺序实测结果
TL;NRs 根据实测结果,MySQL8.0.28 中 SQL 语句的执行顺序为: (8) SELECT (5) DISTINCT <select_list> (1) FROM <l ...
- Linux下以tar包的形式安装mysql8.0.28
Linux下以tar包的形式安装mysql8.0.28 1.首先卸载自带的Mysql-libs(如果之前安装过mysql,要全都卸载掉) rpm -qa | grep -i -E mysql\|mar ...
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...
- CentOS7 编译安装 Git 服务器 Centos 7.0 + Git 2.2.0 + gitosis (实测 笔记)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 服务器IP:192.168.1.31 域 ...
随机推荐
- Vue集成tinymce富文本编辑器并实现本地化指南(2019.11.21最新)
tinymce是一款综合口碑特别好.功能异常强大的富文本编辑器,在某些网站,甚至享有"宇宙最强富文本编辑器"的称号.那么,在Vue项目中如何集成呢?这并不困难,只需要参照官方教程 ...
- mac OS Apache Tomcat 启动/停止服务
进入Tomcat下的bin目录 启动Tomcat命令 ./startup.sh Tomcat 默认端口 8080 停止Tomcat服务命令 ./shutdown.sh 执行tomcat ./shutd ...
- 压缩工具gzip、bzip2、xz的使用
2019独角兽企业重金招聘Python工程师标准>>> 本文使用 为了要压缩 常见压缩格式 压缩工具 gzip压缩工具 bz2压缩工具 xz压缩工具 为什么要压缩 为什么要压缩?文件 ...
- 数学--数论--中国剩余定理 拓展 HDU 1788
再次进行中国余数定理 问题描述 我知道部分同学最近在看中国剩余定理,就这个定理本身,还是比较简单的: 假设m1,m2,-,mk两两互素,则下面同余方程组: x≡a1(mod m1) x≡ a2(mod ...
- 什么才是Python的高级编程?大牛总结,绝对让你受益匪浅
很多刚入门或者还在了解的小伙伴们都会遇到迷茫期吧,就是学完这些基础,函数,字典啥的,好像也做不了什么东西,其实你基础学的扎实的话,是能做很多的事的,学完基础也不要迷茫,因为每门语言都是博大精深的,不是 ...
- 70行实现Promise核心源码
70行实现Promise核心源码 前言: 一直以来都是只会调用Promise的API,而且调API还是调用axios封装好的Promise,太丢人了!!!没有真正的去了解过它的原理是如何实现的,自 ...
- libevent(二)尾队列 && 最小堆
本文主要研究libevent中用来存储事件的两个结构体. 尾队列 具体定义位于queue.h中. #define TAILQ_HEAD(name, type) \ struct name { \ st ...
- 如何将PHP7达到最高性能
PHP7 VS PHP5.6 1. Opcache 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人 ...
- P2309(逆序对)
传送门 描述:给定一个序列长n,求多少子串和大于零. \(一开始一定会想到根据前缀和优化,枚举起点和中点O(n)解决\) \(那更高效的方法呢?实际上,我们上面就是要求S_i-S_j>0的数量\ ...
- Re模块练习题
import re s = "1 -2*(60+(-40.35/5)-(-4*3))" # 获取所有数字 ret = re.findall(r"\d+", s) ...