跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

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 模式。

作者

老丹

关注我
其他文章
上一个

WebDAV 详解:让远程文件像本地硬盘一样好用

下一个

深入解读 udevadm info 输出:一块 Realtek RTL8851BU USB 无线网卡的完整身份档案

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

近期文章

  • 在 Windows 里养一只 Linux:WSL 完整指南 2026年10月24日
  • Paho MQTT C 与 C++ 客户端库完全指南:从概念到 Ubuntu 26.04 下的编译、安装与使用 2026年10月23日
  • Mosquitto $SYS 主题详解:Broker 自监控指南 2026年10月23日
  • 应用级 MQTT 服务搭建完全指南:Mosquitto + 宿主机 Nginx 2026年10月22日
  • OpenWrt 固件签名三剑客:usign、ucert 与 fwtool 深度解析 2026年10月21日

文章分类

  • C/C++开发 (22)
  • Docker容器 (5)
  • Linux工具包 (21)
  • Linux服务配置 (53)
  • Linux系统 (16)
  • MQTT技术 (6)
  • OpenWrt路由 (5)
  • Shell脚本 (3)
  • 代码管理 (1)
  • 安防技术 (4)
  • 数据安全 (36)
  • 网络协议 (25)
  • 计算机理论 (23)
  • 问题解决 (3)
  • 防火墙 (6)
  • 音视频技术 (6)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号