Privoxy 完全指南:功能、域名控制与实战配置
一、Privoxy 是什么
Privoxy 是一个过滤型 HTTP 代理,核心工作是在网页内容到达浏览器之前,按规则进行拦截、修改或替换。它不做缓存加速,定位很明确:内容过滤和隐私增强。
它不依赖任何特定上游代理,可以直连,也可以转发到任意 HTTP 或 SOCKS 代理。你可以把它理解成一个站在你和互联网之间的“清洗工”——所有经过它的明文 HTTP 流量,都会被按你的规则处理一遍。
核心能力:
- 拦截广告、横幅、弹窗
- 修改或删除 HTTP 请求头,减少追踪
- 精细管理 Cookie,拦截第三方追踪 Cookie
- 基于正则表达式替换网页内容
- 按域名分流,不同域名走不同上游代理
- 统一管理多台设备的过滤策略
它做不到的:
- 过滤 HTTPS 内容(加密流量它看不到)
- 加速访问
- 绕过网络封锁
二、安装与文件结构
sudo apt update
sudo apt install privoxy
安装后需要知道三个位置:
| 路径 | 作用 |
|---|---|
/etc/privoxy/config | 主配置文件,控制监听地址、转发规则、ACL、日志 |
/etc/privoxy/default.action | 官方维护的默认过滤规则,不建议直接改 |
/etc/privoxy/user.action | 你自己的规则写在这里,优先级最高,不会被升级覆盖 |
服务管理:
sudo systemctl restart privoxy # 改完配置后重启
sudo systemctl status privoxy # 查看运行状态
默认监听 127.0.0.1:8118。
三、主配置文件详解
用 sudo nano /etc/privoxy/config 编辑。以下按功能模块逐项说明。
3.1 监听地址(listen-address)
控制 Privoxy 监听哪个 IP 和端口,以及谁可以连它。
默认(只允许本机):
listen-address 127.0.0.1:8118
允许局域网访问:
listen-address 0.0.0.0:8118
改成 0.0.0.0 意味着任何能连到你机器的人都能用这个代理。如果是在不信任的网络里,必须配合 ACL 使用。
3.2 转发规则(forward)
Privoxy 自己不能上网,需要把请求转发给某个出口。不配置 forward 时,它默认直连。
转发到 SOCKS5 代理:
forward-socks5 / 127.0.0.1:1080 .
这行的含义:所有流量(/)通过本机 1080 端口的 SOCKS5 代理转发。末尾的 . 不能漏掉。
转发到 HTTP 代理:
forward / 127.0.0.1:3128
所有流量交给本机 3128 端口的 HTTP 代理。
只转发特定域名:
forward-socks5 .onion 127.0.0.1:9050 .
这行只把 .onion 域名的请求转发给本机 9050 端口,其他流量直连。按域名分流是 Privoxy 的常用能力。
3.3 ACL 访问控制(permit-access / deny-access)
当监听地址不是 127.0.0.1 时,强烈建议配置 ACL,否则你的代理可能被滥用。
语法规则:最后匹配的规则生效,默认拒绝。
只允许局域网使用:
permit-access 192.168.1.0/24
deny-access 0.0.0.0/0
permit-access 允许 192.168.1.x 网段,deny-access 拒绝其他所有。
只允许特定 IP 访问特定目标:
permit-access 192.168.45.64/26
deny-access 192.168.45.73 www.example.com
格式为 src_addr[/mask] [dst_addr[/mask]]。源地址可选带子网掩码,目标地址也可选带掩码。如果配置了 forward,dst_addr 检查的是转发目标的地址,不是最终目标网站的地址。
注意事项:
- 优先使用 IP 地址而非域名,因为域名解析需要时间
- 所有 DNS 名称必须能解析,不能使用
*.org这种通配域名 - 如果某个 IP 被拒绝但该机器上还有其他网站,可能产生意外副作用
3.4 日志与调试(logfile / debug)
Privoxy 默认只记录致命错误,日志几乎是空的。
启用日志文件:
logfile /var/log/privoxy/logfile
启用调试级别:
debug 1 # 记录每个请求的目标地址
debug 1024 # 记录被阻止的请求及原因
debug 4096 # 启动横幅和警告
debug 8192 # 非致命错误
debug 1 最有用,能看到每个经过 Privoxy 的请求。多个 debug 行可以叠加,也可以写成一行用加法组合。
3.5 其他常用选项
关闭编辑权限(安全建议):
enable-edit-actions 0
默认情况下,任何能访问 Privoxy 的人都可以通过浏览器编辑过滤规则。如果代理对局域网开放,建议关掉这个功能。
设置管理员邮箱(可选):
admin-address you@example.com
当用户访问 http://config.privoxy.org 时,会显示这个邮箱作为联系方式。
四、过滤规则(actions 文件)
config 文件负责基础设施(监听、转发、ACL、日志),而过滤规则写在 actions 文件里。
/etc/privoxy/default.action:官方维护的默认规则,不建议直接改,升级会丢/etc/privoxy/user.action:你自己的规则写在这里,优先级最高
actions 文件按顺序解析,后面的匹配覆盖前面的。user.action 最后解析,拥有最终决定权。
4.1 规则语法
一条规则由动作和匹配模式组成:
{ +动作名 }
匹配的URL模式
多个动作可以写在同一对花括号里,用空格分隔。
4.2 内容拦截
+block — 直接阻断
{ +block }
.doubleclick.net
.ads.example.com
.doubleclick.net 的写法会匹配 www.doubleclick.net、ad.doubleclick.net、stats.doubleclick.net 等所有子域名。
+block-as-image — 阻断并伪装成图片
有些广告来自 URL 里看不出“ad”字样的域名。这个动作告诉 Privoxy:“把它当图片拦掉”,浏览器会显示一个占位图而不是破图。
{ +block-as-image }
.fastclick.net
+block{理由} — 附带说明
可以附加一个说明文字,记录在日志里:
{ +block{广告域名} }
.adnxs.com
+block-as-empty-document — 返回空文档
{ +block-as-empty-document }
.tracking-pixel.com
4.3 HTTP 头修改
+hide-user-agent{值} — 伪造浏览器标识
{ +hide-user-agent{Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36} }
/
+hide-referer{值} — 控制 Referer 头
常用值:
+hide-referer{forge}:伪造一个同站 Referer+hide-referer{block}:完全移除 Referer+hide-referer{http://example.com/}:指定固定值
{ +hide-referer{forge} }
/
+hide-from-header{block} — 移除 From 头
{ +hide-from-header{block} }
/
+hide-accept-language{值} — 控制 Accept-Language 头
防止网站通过语言推断你的地区。
{ +hide-accept-language{en-US} }
/
+hide-if-modified-since 和 +hide-if-none-match
移除条件请求头,防止网站通过缓存机制追踪你。
{ +hide-if-modified-since +hide-if-none-match }
/
4.4 Cookie 管理
+crunch-incoming-cookies 拦截服务器发给浏览器的 Cookie。
+crunch-outgoing-cookies 拦截浏览器发给服务器的 Cookie。
+session-cookies-only 只允许会话 Cookie,拒绝持久化 Cookie。会话 Cookie 在浏览器关闭后消失。
{ +session-cookies-only }
/
+filter-cookies 更精细的 Cookie 过滤,可以按域名、路径、名称匹配。
4.5 内容过滤
+filter 启用内容过滤器。Privoxy 自带几个过滤器:
js-annoyances:去除 JavaScript 弹窗、自动跳转等js-events:去除 JavaScript 事件处理器html-annoyances:去除 HTML 层面的烦人元素content-cookies:去除基于 Cookie 的内容refresh-tags:去除自动刷新标签unsolicited-popups:拦截非请求的弹窗
{ +filter{js-annoyances} +filter{refresh-tags} }
/
+filter{all} 启用所有过滤器。
4.6 内容替换
+replace 用正则表达式替换网页内容。Privoxy 自带一个 replace 过滤器,但你可以自定义:
{ +filter{my-replace} }
/
然后在过滤器定义文件中写:
FILTER: my-replace 把某个词换成另一个词
s/某个词/另一个词/g
4.7 访问控制
+limit-connect{端口列表} 限制 CONNECT 方法可以连接哪些端口。默认只允许 443 和 563。
{ +limit-connect{443,8443} }
/
+prevent-compression 阻止服务器压缩响应,便于 Privoxy 过滤内容。
+force-text-mode 强制以文本模式处理响应。
4.8 其他动作
+handle-as-empty-document 返回一个空文档,而不是错误页面。
+handle-as-image 把响应当作图片处理。
+client-header-filter 和 +server-header-filter 对客户端和服务器头部进行更复杂的过滤。
+client-body-filter 和 +server-body-filter 对请求体和响应体进行过滤。
五、指定域名:Privoxy 的核心能力
能,而且这是 Privoxy 最核心的能力之一。
Privoxy 的规则匹配基于 URL 模式,支持多种匹配方式。
5.1 基本域名匹配
匹配所有子域名:
{ +block }
.doubleclick.net
开头的 . 表示匹配 doubleclick.net 及其所有子域名。
匹配特定域名:
{ +block }
ads.example.com
不带前导 . 时,只匹配完全相同的域名。
匹配所有域名:
{ +block }
/
/ 是通配符,匹配所有 URL。
5.2 按域名分流转发
这是 Privoxy 作为代理最实用的功能之一。你可以让不同域名走不同的上游代理。
所有流量走同一个 SOCKS5 代理:
forward-socks5 / 127.0.0.1:1080 .
特定域名走特定代理:
forward-socks5 .onion 127.0.0.1:9050 .
forward-socks5 .internal.example.com 127.0.0.1:3128 .
forward / 127.0.0.1:8118
这三行的含义:
.onion域名走 9050 端口的 SOCKS5.internal.example.com走 3128 端口的 HTTP 代理- 其他所有流量走最后一个
forward指定的出口
5.3 匹配模式的高级用法
Privoxy 的 URL 模式支持正则表达式和变量。
使用变量匹配:
{ +block }
$host=ads\.example\.com
$host 匹配 URL 的主机部分。这行只阻断 ads.example.com 这个主机,不匹配其子域名。
组合条件:
{ +block }
$host=example\.com$path=/ads/
这行只阻断 example.com 下 /ads/ 路径的请求。
正则表达式:
{ +block }
.*\.(doubleclick|fastclick|adnxs)\.(net|com)
这行匹配所有以 doubleclick、fastclick 或 adnxs 为子域名,且顶级域名为 .net 或 .com 的请求。
否定匹配:
{ +block }
$host=example\.com^$path=/ads/
^ 表示否定,这行匹配 example.com 下不是 /ads/ 路径的请求。
5.4 按域名设置不同动作
对特定域名关闭所有过滤:
{ -filter }
.mybank.com
-filter 是关闭所有过滤器的“一键关”。网银、政府网站等经常需要这个。
对特定域名启用特定过滤器:
{ +filter{js-annoyances} +filter{refresh-tags} }
.news-site.com
对特定域名伪造 User-Agent:
{ +hide-user-agent{Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)} }
.mobile-site.com
对特定域名只允许会话 Cookie:
{ +session-cookies-only }
.tracking-site.com
5.5 规则的优先级
Privoxy 按顺序解析 actions 文件,后面的匹配覆盖前面的。
user.action 在 default.action 之后解析,所以你在 user.action 里写的规则拥有最终决定权。
如果同一个 URL 匹配多条规则,最后一条匹配的规则生效。
例如:
# default.action 里
{ +block }
.ads.example.com
# user.action 里
{ -block }
.ads.example.com
最终 .ads.example.com 不会被阻断,因为 user.action 里的 -block 覆盖了前面的 +block。
5.6 规则的继承与组合
动作可以设置全局默认,也可以针对特定 URL 覆盖。
设置全局默认:
{ +filter{js-annoyances} +session-cookies-only }
/
这行对所有网站启用 JS 烦人元素过滤和会话 Cookie 限制。
针对特定域名覆盖:
{ -filter }
.mybank.com
这行对 .mybank.com 关闭所有过滤器,覆盖上面的全局设置。
六、过滤器定义
过滤器定义写在单独的文件中,默认在 /etc/privoxy/ 目录下,文件名以 .filter 结尾。
创建自定义过滤器:
# /etc/privoxy/my-filters.filter
FILTER: my-replace 把某个词换成另一个词
s/某个词/另一个词/g
FILTER: remove-tracking-pixel 移除 1x1 追踪像素
s/<img[^>]*width=["']?1["']?[^>]*height=["']?1["']?[^>]*>//gi
然后在 config 中引用:
filterfile /etc/privoxy/my-filters.filter
在 user.action 中使用:
{ +filter{my-replace} }
.example.com
七、让浏览器用上 Privoxy
方法一:系统级环境变量(部分应用会自动读取)
在 ~/.bashrc 里加:
export http_proxy="http://127.0.0.1:8118"
export https_proxy="http://127.0.0.1:8118"
注意 https_proxy 的值协议头写 http://,不是 https://。因为 Privoxy 只接受 HTTP 代理协议,HTTPS 流量会以 CONNECT 隧道方式转发。
方法二:浏览器手动设置
Firefox:设置 → 网络设置 → 手动配置代理,HTTP 和 HTTPS 都填 127.0.0.1,端口 8118。
Chrome/Chromium 可以用命令行:
chromium --proxy-server="localhost:8118"
验证是否生效:浏览器访问 http://config.privoxy.org,能看到 Privoxy 的页面说明代理在工作。
八、调试:规则没生效怎么办
Privoxy 默认只记录致命错误,日志几乎是空的。要排查问题,需要手动打开日志。
在 config 里找到被注释掉的 debug 行,启用:
debug 1 # 记录每个请求的目标地址
debug 4096 # 启动横幅和警告
debug 8192 # 非致命错误
debug 1 最有用,它会把每个经过 Privoxy 的请求都打印出来,你能看到它到底拦了什么、放行了什么。
日志文件位置由 logfile 选项控制,默认不写文件。启用后通常在 /var/log/privoxy/logfile。
九、安全注意事项
9.1 不要随意开放监听
默认 listen-address 127.0.0.1:8118 只允许本机访问,这是安全的。如果你改成 0.0.0.0:8118 让局域网其他人也能用,必须同时配置 ACL,否则任何能连到你机器的人都能拿你的代理当跳板。
9.2 ACL 的顺序很重要
规则是最后匹配的生效,默认行为是拒绝。所以顺序很重要:先写宽的 permit,再写窄的 deny 来排除例外。
9.3 关闭规则编辑
如果开放了监听,建议关掉 enable-edit-actions,不然任何能用你代理的人都能直接改你的过滤规则。
9.4 不要用 Privoxy 处理敏感流量
Privoxy 只能看到明文 HTTP 流量。HTTPS 流量它只能以 CONNECT 隧道方式转发,看不到内容也改不了。所以它无法保护你的 HTTPS 流量隐私,也不应该被当作安全边界。
十、完整配置示例
/etc/privoxy/config
# 监听地址
listen-address 127.0.0.1:8118
# 日志
logfile /var/log/privoxy/logfile
debug 1
debug 1024
debug 4096
debug 8192
# 转发规则:特定域名走特定代理
forward-socks5 .onion 127.0.0.1:9050 .
forward-socks5 .internal.example.com 127.0.0.1:3128 .
forward / 127.0.0.1:8118
# ACL:只允许本机
permit-access 127.0.0.1
deny-access 0.0.0.0/0
# 安全设置
enable-edit-actions 0
# 管理员邮箱
admin-address you@example.com
/etc/privoxy/user.action
# 全局默认:启用常用过滤,限制 Cookie
{ +filter{js-annoyances} +filter{refresh-tags} +session-cookies-only }
/
# 全局默认:伪造 User-Agent
{ +hide-user-agent{Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36} }
/
# 阻断常见广告域名
{ +block }
.doubleclick.net
.fastclick.net
.adnxs.com
.ads.example.com
# 对网银关闭所有过滤
{ -filter }
.mybank.com
.online-banking.example.com
# 对特定新闻网站启用额外过滤
{ +filter{unsolicited-popups} }
.news-site.com
# 对特定域名伪造 Referer
{ +hide-referer{forge} }
.social-media.com
十一、总结
Privoxy 的核心能力可以概括为:
- 拦截:按域名、路径、正则表达式阻断请求
- 修改:改写 HTTP 头、Cookie、网页内容
- 分流:按域名把流量转发到不同的上游代理
- 替换:用正则表达式替换网页中的任意文本
它的配置逻辑是:config 管基础设施(监听、转发、ACL、日志),user.action 管过滤规则(拦截、修改、替换)。规则按顺序解析,后面的覆盖前面的,user.action 拥有最终决定权。
指定域名是它的基本能力,通过 .domain.com、$host=、正则表达式等多种方式实现,可以精确到单个主机、单个路径、单个 URL 模式。