使用 pfSense、Squid 和 SquidGuard 在所有设备上屏蔽广告

Marc Dahan

By Marc Dahan . 30 3月 2024

网络安全记者

Miklos Zoltan

Fact-Checked this

pfSense 是一个基于 FreeBSD 的强大的开源路由器/防火墙操作系统。刚开始使用时,pfSense 自带一些强大的工具,可以帮你构建一个安全的网络。

但 pfSense 还允许你从其官方仓库安装包,为你的系统添加更多功能。

在这篇文章中,你将了解到:

  • 什么是 pfSense 以及如何使用它
  • 什么是 Squid 以及如何使用它
  • 代理服务器是如何工作的
  • 如何安装和配置 Squid
  • 如何安装和配置 SquidGuard
  • 如何使用 pfSense、Squid 和 SquidGuard 屏蔽广告

pfSense 是一个基于 FreeBSD 的强大的开源路由器/防火墙操作系统。刚开始使用时,pfSense 自带一些强大的工具,可以帮你构建一个安全的网络。
但 pfSense 还允许你从其官方仓库安装包,为你的系统添加更多功能。

其中一个包叫做 Squid。Squid 是一个可以进行内容过滤的缓存网页代理。让我们稍微展开一下,提供一些关于代理服务器及其使用的上下文。

相关指南: 如何使用 pfBlockerNG 在 pfSense 上设置 IP 过滤和 DNS 黑洞

摘要:这篇文章解释了如何通过集成 pfSense、Squid 和 SquidGuard 在所有设备上实现广告屏蔽。
它介绍了 pfSense 作为一个全面的开源路由器/防火墙解决方案,具有强大的网络防御能力。文章强调 Squid 作为一个缓存代理,促进内容过滤。

文章详细阐述了代理服务器在缓存内容和执行过滤功能方面的作用,并提供了在 pfSense 上配置 Squid 和 SquidGuard 以屏蔽广告的逐步指南。

采用这种方法提高了安全性和隐私性,减少了数据消耗,并加快了网页加载时间。

How to Block Ads

代理服务器

代理服务器是一种中介服务器,位于你的设备(笔记本电脑、平板电脑、智能手机)和你最终的互联网目的地(某网站.com)之间。

你的流量离开设备,连接到代理服务器,然后从代理服务器出发前往其最终目的地。

为什么要通过代理服务器发送流量呢?原因有几个。其中之一是为了缓存内容。这意味着代理服务器会本地保存一些内容,这样下次客户端请求该内容时,就可以直接从缓存中获取,而不必再次从互联网上下载。

这加快了你的互联网浏览速度,因为从代理的本地缓存获取内容比重新启动一个互联网下载要快得多。

另一个目的是内容过滤。内容过滤意味着阻止连接到某些域名或IP地址。例如,阻止访问Facebook的组织正在执行内容过滤。

内容过滤的另一个用途是屏蔽广告。在线广告很讨厌。它们侵犯你的隐私,消耗你的带宽,并且是恶意软件的主要途径。有一些很好的理由想要摆脱它们。这就是我们在这篇文章中要使用 Squid 的原因。

我们将向你展示如何在 pfSense 上配置 Squid 和 SquidGuard(SquidGuard 是 Squid 的一个额外组件,启用基于列表的过滤)来屏蔽所有设备上的广告。

这个指南假设你已经有了一个配置好的、带有工作中的WAN和LAN接口的 pfSense 系统,并且你已经可以访问 GUI。

WAN and LAN 设置

安装 Squid

我们需要做的第一件事就是安装 Squid 代理服务器。

1. 从顶部菜单中选择系统 > 包管理器。你会被带到包管理器已安装包标签页。

前往包管理器

2. 选择可用包。可用包的列表将会显示出来。

选择 Squid 可用包

3. 向下滚动直到你看到squid,然后点击安装。将会显示包安装器窗口。

Squid 包

4. 点击确认。安装将会开始。

确认安装 Squid

5. 一旦安装完成,你应该在包安装器窗口的底部看到成功。Squid 现在已经安装好了。

Squid 已安装

配置 Squid

现在 Squid 已经安装好了,我们来配置我们的新代理服务器。

1. 从顶部菜单中选择服务 > Squid 代理服务器。你会被带到Squid 设置通用标签页。

前往 Squid 代理服务器

我们将逐部分讲解配置 Squid 的过程。我们的目标是用 Squid 设置广告屏蔽,所以我们不会深入每一个子菜单。只有我们为了实现目标需要的那些。任何未提到的设置都应保留为默认值。

在配置 Squid 之前,我们首先需要去到本地缓存标签页,并通过点击页面底部的保存,接受默认的本地缓存设置。

如果你在未接受默认的本地缓存设置的情况下尝试配置代理,你将被提示这样做,并且会丢失到目前为止配置的设置。

本地缓存页面

如果你以后想调整你的本地缓存设置,你可以从 Squid 设置的本地缓存标签页进行。

Squid 通用设置

  1. 暂时先不勾选启用 Squid 代理框。我们将先配置我们的代理服务器,然后再启用它。
  2. 如果你的 pfSense 设备同时使用 IPv4 和 IPv6,从监听 IP 版本下拉菜单中选择IPv4+IPv6。如果不是,就保留为 IPv4。
  3. 确保在代理接口中选择了LAN。如果你向你的 pfSense 设备添加了额外的接口,并希望那些接口的流量通过 Squid,你需要在这里选择它们。
  4. 将出站网络接口设置为默认(自动)

Squid 通用设置

透明代理设置

代理服务器可以以两种方式之一工作:透明模式或显式模式。在透明模式下,你的客户端(计算机、平板电脑、智能手机等)无需进行配置 – 它们的流量将被透明地代理。

然而,这种模式只会代理端口为80的HTTP流量,而不是HTTPS流量(除非你配置了中间人SSL过滤 – 下面会有更多解释)。由于大部分互联网流量使用HTTPS,透明模式在广告屏蔽方面的适用范围有限,但对于缓存仍然很有用。

显式模式要求你配置每个客户端来“请求”代理访问。在这种模式下,所有TCP互联网流量都被代理(HTTP和HTTPS)。这是我们在本指南中想要的。因此,我们不会在本指南中启用透明模式,但你可以毫无问题地帮助两种模式。

透明代理设置

SSL 中间人过滤

如我上面提到的,可以透明代理HTTPS连接。但要做到这一点,你本质上需要破解HTTPS。

Squid可以用它自己的证书替换你尝试访问的网站的正确SSL证书,解密连接,然后用它的证书重新加密。这使你能够过滤SSL连接,但也破坏了浏览器中应发生的HTTPS验证。

除非是由了解它们在做什么的人出于特定目的,我不推荐使用中间人SSL过滤。我们也将禁用这个功能。

SSL 中间人过滤

日志设置

  1. 勾选启用访问日志框。这将记录你的 Squid 流量,以便在你需要排除故障时查看 Squid 的行为。
  2. 勾选记录 SquidGuard 拒绝的页面框。这允许从实时标签页查看 SquidGuard 日志,与 Squid 代理日志一起。这在我们安装 SquidGuard 之后将会很有用。

日志设置

头信息处理、语言和其他自定义

这里的设置是可选的,但将限制在 Squid 头信息中显示的信息量。

  • 将 X-Forwarded 头信息模式设置为关闭。
  • 勾选禁用 VIA 头信息框。
  • 勾选抑制 Squid 版本框。
  • 点击保存。

头信息语言

ACLs 标签页

要明白我们可以用 Squid 明确屏蔽哪些内容,我们需要转到ACLs标签页。

我们可以看到有多个框用于定义 Squid 要过滤掉的不同元素。让我们来看看每一个。

ACLs 标签页

允许的子网

你可以在这里添加额外的子网,让它们通过 Squid 代理。这对于系统上未绑定接口的子网很有用,例如 IPSec。在我们的例子中不需要在这里添加任何内容。

无限制的 IP

这里列出的 IP 地址将不会被代理服务器过滤流量。

禁止的主机地址

这里列出的 IP 地址即使其子网被允许也不得使用代理服务器。

白名单

列在白名单框中的域名将对所有被授权使用代理的主机可用。白名单项将覆盖任何黑名单项。

黑名单

列在黑名单框中的域名将对所有被允许使用代理服务器的主机不可访问。

屏蔽用户代理

这个框非常实用,用于屏蔽特定应用程序访问互联网。当应用程序请求访问互联网时,其头信息中包含一个被称为用户代理的字段。用户代理标识了正在使用的应用程序。例如,谷歌 Chrome 的用户代理是 Chrome。

用户代理最初用于识别向服务器发出网络请求的网页浏览器,以便服务器知道如何在特定浏览器中渲染请求的数据。但现在它们的用途已经泛化到任何通过互联网发出请求的应用程序。

要在 Squid 中屏蔽一个用户代理,你需要在它前面加上 “^”(不包括引号)。

因此,在 Squid 的屏蔽用户代理框中列出^Chrome将阻止谷歌 Chrome 访问互联网。

列出^Mozilla将阻止 Firefox 访问互联网。列出^WhatsApp将阻止 WhatsApp 访问互联网。

用户代理非常具体,并不总是像上面的例子那样简单。你需要知道应用程序使用的确切用户代理才能在这里屏蔽它。

屏蔽 MIME 类型(仅回复)

MIME 类型中的 MIME 代表多用途互联网邮件扩展,它们用于定义 URL 内的文件类型。MIME 类型的结构如下:

类型/子类型

因此,将audio/mpeg添加到屏蔽 MIME 类型框中将阻止下载 mp3 文件。将image/png添加到屏蔽 MIME 类型框中将阻止下载 png 图像。

像用户代理一样,MIME 类型非常具体。你需要输入确切的类型和子类型,Squid 中的过滤才会起作用。

测试 Squid

向 Squid 的黑名单添加一个条目

在继续下一步之前,让我们先测试一下我们的 Squid 安装以确保一切正常运行。我们将在黑名单框中输入一个域名,看看 Squid 是否如预期那样阻止它。

1. 在Squid 代理设置ACLs标签页中,将facebook.com输入到黑名单框中。

Facebook 黑名单

2. 点击页面底部的保存

3. 转到Squid 代理设置常规标签页。

4. 勾选启用 Squid 代理框。

启用 Squid 代理

5. 点击页面底部的保存

我们的代理服务器现在已启用并配置为阻止 facebook.com。

我们将快速配置我们的网页浏览器通过代理服务器来看看它是否正常工作。如果一切配置正确,我应该无法访问 facebook.com。

配置 Firefox 使用代理服务器

1. 点击浏览器右上角的设置图标,选择偏好设置(在 Windows 中称为选项)。你将被带到常规设置页面。

Firefox 偏好设置

2. 在常规设置页面滚动到网络设置部分,点击设置按钮。

Firefox 网络设置

3. 选择手动代理配置

4. 在HTTP 代理框中,填入你的 pfSense 盒子的 IP 地址。在我的案例中,这是192.168.1.1

5. 将端口字段设置为3128

6. 勾选同时使用此代理进行 FTP 和 HTTPS框。

7. 点击窗口底部的确定,并关闭设置页面。

Firefox 代理设置

现在,如果我尝试访问 facebook.com(通过 HTTP 或 HTTPS),我的浏览器将显示以下页面:

Facebook 被阻止

这正是我们想要的结果。

SquidGuard

现在我们有了一个能够阻止访问 facebook.com 的工作代理服务器。很好。然而,如果我们想要屏蔽广告,我们将需要向 Squid 的黑名单框中添加成千上万个域名。这显然不是最佳选择…

这时候就需要 SquidGuard 登场了。SquidGuard 是 Squid 的一个附加模块,能够处理基于列表的过滤。

通过基于列表的过滤,你输入一个黑名单域名的 URL,任何与黑名单上的域名匹配的域名都将被阻止。

现在我们的基础 Squid 代理服务器已经启动并运行了,我们将继续安装和配置 SquidGuard。

安装 SquidGuard

1. 从顶部菜单中选择系统 > 包管理器。你会被带到包管理器已安装包标签页。

前往包管理器

2. 选择可用包。将会显示可用包的列表。

SquidGuard 可用包

3. 向下滚动直到你看到SquidGuard,然后点击安装。将会显示包安装器窗口。

找到 SquidGuard 安装

4. 点击确认。安装将开始。

确认 SquidGuard 安装

5. 安装完成后,你应该在包安装器窗口的底部看到成功。SquidGuard 现在已经安装好了。

SquidGuard 已安装

配置 SquidGuard

SquidGuard 现在已经安装好了。我们来配置基于列表的过滤吧。

1. 从顶部菜单中选择服务 > SquidGuard 代理过滤器。你将被带到SquidGuard 代理过滤器设置通用标签页。

前往 SquidGuard 页面

正如在配置 Squid 本身时所做的那样,我们将逐节过一遍 Squid Guard 的配置。同样,我们不会深入每一个子菜单 – 只配置我们为了达到目标需要配置的。任何未提到的设置应保留其默认值。

通用选项

1. 现在先不要勾选启用框。

SquidGuard 通用选项

日志选项

  • 勾选启用 GUI 日志框。
  • 勾选启用日志框。
  • 勾选启用日志轮换框。

SquidGuard 日志选项

其他选项

1. 勾选清除广告框。

SquidGuard 其他选项

黑名单选项

1. 勾选黑名单框。

2. 在黑名单 URL字段中输入以下 URL:https://shallalist.de/Downloads/shallalist.tar.gz。这是我们的黑名单 URL。SquidGuard 将下载此列表,并为我们提供可以选择允许或阻止的不同类别的域名。它是免费提供的,由Shalla Secure Services提供。还有其他列表可以使用,但许多是收费的。我已经使用 Shallalist 很多年了,它运作良好且频繁更新,所以我推荐使用它。

3. 点击页面底部的保存

SquidGuard 设置黑名单选项

下载黑名单

1. 前往SquidGuard 代理过滤器设置黑名单标签页。黑名单 URL 将会显示出来。

2. 点击下载按钮。黑名单的下载和解析就会开始。

SquidGuard 黑名单页面

3. 一旦完成,你应该会在黑名单更新日志窗口的底部看到黑名单更新完成

黑名单更新完成

配置 SquidGuard 中的黑名单过滤

1. 前往SquidGuard 代理过滤器设置公共 ACL标签页。

2. 点击目标规则列表旁边的 + 符号。将会显示目标规则列表

配置 SquidGuard 中的黑名单过滤

3. 列表中的第一个条目是adv,代表广告。从它右边的下拉菜单中,选择拒绝

拒绝广告

4. 继续阻止你想要屏蔽的任何其他内容类别。

5. 一旦你拒绝了所有你想要屏蔽的类别,前往列表底部,在默认访问旁边的下拉菜单中选择允许

6. 点击页面底部的保存

SquidGuard ACL

7. SquidGuard ACL

8. 保存后,点击应用按钮。

启用 SquidGuard

测试设置

我们现在已经配置了带有黑名单过滤的 Squid。如果我使用已经配置为使用代理的浏览器访问一个已知会显示广告的网页,那些广告应该不见了。

启用 Squid 时:

SquidGuard 测试

禁用 Squid 时:

SquidGuard 测试

它有效。太好了。但按照我现在的设置,Squid 只会拦截浏览器的流量;因此,我只能在我的网络浏览器中受益于 Squid 的广告拦截功能。

我将向你展示如何配置你的整个设备,让它的所有流量都通过代理服务器。这样你就能在应用程序中而不仅仅是浏览器中受益于广告拦截。我会向你展示如何在 macOS、Windows、Linux、iOS 和 Android 上做到这一点。

在客户端设备上配置系统范围的内容过滤

重置浏览器设置

在设置客户端设备进行系统范围代理配置之前,让我们撤销在 Firefox 中配置的手动代理设置来测试我们的连接。

1. 返回到 Firefox 的网络设置中,选择使用系统代理设置。这会指示浏览器使用系统设置作为其代理设置。这是默认设置。

2. 点击确定并关闭设置页面。

FireFox 系统代理

macOS

1. 从系统偏好设置应用中选择网络

2. 确保你当前的连接被选中,并在右下角点击高级

3. 选择代理标签页。

4. 勾选Web 代理 (HTTP)安全 Web 代理 (HTTPS)框。

5. 输入你的 pfSense 盒子 IP 地址和代理端口——在我的案例中是192.168.1.13128

6. 点击确定应用

macOS 代理设置

Windows

1. 打开设置应用(Win+I键盘快捷方式)。

2. 转到网络和互联网

3. 选择代理标签页。

4. 向下滚动到手动代理设置部分。

5. 启用使用代理服务器开关。

6. 输入你的 pfSense 盒子 IP 地址和代理端口 – 在我的例子中是192.168.1.13128

7. 点击保存

Windows 10 代理设置

Linux

1. 在网络设置窗口中,选择网络代理

2. 从方法下拉菜单中选择手动

3. 在HTTP 代理HTTPS 代理旁边输入你的 pfSense 盒子 IP 地址和代理端口 – 在我的例子中是192.168.1.13128

4. 关闭网络设置窗口。

Linux 代理设置

iOS

1. 从设置 > WiFi,点击你的 WiFi 连接右边的 “i”。

2. 向下滚动并选择配置代理

3. 选择手动

4. 在服务器端口旁边输入你的 pfSense 盒子 IP 地址和代理端口 – 在我的例子中是192.168.1.13128

5. 关闭设置应用。

iPhone 代理设置

Android

1. 从设置应用中,选择WiFi

2. 长按当前连接的 WiFi 网络。

3. 选择修改网络

4. 展开高级选项

5. 从代理下拉菜单中选择手动

6. 在代理主机名代理端口下输入你的 pfSense 盒子 IP 地址和代理端口 – 在我的例子中是192.168.1.13128

7. 点击保存

Android 代理

请注意,要在 iOS 或 Android 上通过移动数据使用代理,你需要安装移动设备管理(MDM)配置文件,这超出了本指南的范围。也许我们将来会涉及这个话题。

总结一下

现在你已经有了一个带有黑名单过滤功能的工作代理服务器,可以用它来屏蔽所有设备上的广告。通过移除那些偷窃你数据的烦人广告,你增强了自己的安全性和隐私保护。

你还会消耗更少的带宽。由于不需要下载和渲染广告,你的网页加载速度会更快。但这也得益于 Squid 为你缓存内容。因此,你经常请求的内容会更快地加载。

很棒的东西。保持安全。