如何在Ubuntu16.04上使用Pi-hole和OpenVPN在DNS级别阻止广告
介绍
在线广告不仅令人讨厌,而且是您设备上潜在的恶意软件来源。 虽然有一些插件设计用于在每个应用程序/每个设备的基础上阻止广告,但在 DNS 级别 停止广告可以同时为您的所有应用程序和设备提供更完整的解决方案。
Pi-hole — 最初创建用于 Raspberry Pi 单板计算机 的 DNS 服务器 — 过滤掉对广告服务域的请求,阻止广告并提高网络性能。 使用 Pi-hole,您可以主动监控网络上发出的每个 DNS 请求并即时阻止请求。 此功能还扩展到网络浏览器之外,允许您通过定位适当的 DNS 查询来过滤其他应用程序中的广告。
当您将 Pi-hole 与 虚拟专用网络 (VPN) 结合使用时,它特别有效。 VPN 通过 隧道 建立和维护连接,这是客户端和服务器之间的逻辑网络连接。 此外,如果您的 VPN 支持 [X35X] 安全套接层 (SSL),则整个交易都会被加密,为数据传输提供安全链接。
在本教程中,您将安装和配置 OpenVPN 和 Pi-hole,以充当您自己的私有、网络范围、基于 DNS 的广告拦截过滤器,用于连接到您网络的所有设备。
先决条件
要完成本教程,您需要:
- 按照本Ubuntu 16.04初始服务器设置教程设置一台具有2 GB内存的Ubuntu 16.04服务器,包括sudo非root用户和防火墙。
- 按照此 OpenVPN Server on Ubuntu 16.04 指南 安装和配置 OpenVPN。
第 1 步 — 收集网络信息
在开始安装之前,您需要收集 Pi-hole 用于与 VPN 通信的网络信息。 由于 Pi-hole 的安装过程接管了您的终端会话,因此在您开始之前掌握这些信息将使整个过程更加顺利。
首先,使用ip
命令和addr
和show
子命令来识别tun0
的IP地址,网络接口您的 VPN 隧道处于活动状态。
ip addr show tun0
输出提供有关接口的详细信息。
Output from ip addr show tun01: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever
进一步来说:
- 第一行告诉您接口名称,
tun0
,然后是一系列描述网络套接字特征的标志。 - 第二行表示该接口上当前没有链路层设备可用。
- 第三行包含此网络接口的 IP 地址值。
- 第四行报告接口的 IPv6 有效和首选租约寿命都设置为
forever
。 在这种情况下,IP 地址的租用时间永远不会改变,因为该地址是在 VPN 安装期间专门分配给接口的。
记下 inet
后面的 IP 地址,因为这是您的 VPN 服务器的地址。 在安装 Pi-hole 时,您需要知道这一点。
除了您的 VPN 服务器的 IP 地址,Pi-hole 还需要知道 网关 以用于 IPv4 流量。 您可以将网关视为不同网络之间的接入点。
再次使用 ip
命令,这次使用 route
和 show
子命令,以获取服务器的路由表信息。 将路由表信息传送到grep
,这将解析并在输出中搜索字符串default
。 default
表示服务器使用的默认网关。
ip route show | grep default
在以下示例中,输出告诉您默认网关的 IP 地址为 198.51.100.1
,网关在 eth0
接口上可达,网关的 onlink
选项为打开,这是隧道连接的默认设置。
Output from ip r | grep defaultdefault via 198.51.100.1 dev eth0 onlink
记下 via
后面的 IP 地址,因为这是您服务器的默认网关地址。 在安装 Pi-hole 时,您需要知道这一点。
有了网络信息,您就可以下载并安装 Pi-hole。
第 2 步 — 下载 Pi-hole
按照官方安装说明,使用Git将GitHub上的Pi-hole仓库克隆到~/Pi-hole
,这个目录会在克隆过程中自动创建。 使用 --depth 1
选项创建一个克隆,其历史被截断到最后一个版本; 这将为您提供最新版本的 Pi-hole,而无需进行所有额外的历史修订。
切换到您的主目录并克隆存储库。
cd ~ git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole
输出确认您要克隆到的位置,然后提供该过程的实时报告,包括 Git 预期复制的对象的计数以及它实际复制的数量。
Output from git cloneCloning into 'Pi-hole'... remote: Counting objects: 65, done. remote: Compressing objects: 100% (56/56), done. remote: Total 65 (delta 5), reused 26 (delta 1), pack-reused 0 Unpacking objects: 100% (65/65), done. Checking connectivity... done.
现在,进入新创建的 Pi-hole/automated\ install/
目录,您将在其中找到 Pi-hole 的安装脚本。
cd Pi-hole/automated\ install/
打开安装脚本以确保您对它的功能感到满意或根据需要对其进行修改。
nano basic-install.sh
保存并关闭文件以继续。
您现在拥有最新版本的 Pi-hole 的副本,并且您已经检查了自动安装脚本是否存在潜在问题。 是时候安装和配置 Pi-hole 了。
第 3 步 — 运行安装脚本
Pi-hole 安装和配置是在基于终端的向导的帮助下进行的。 使用以下命令启动向导:
bash basic-install.sh
首先,安装脚本告诉您它正在 Installing packages 并且它正在检索安装所需的其他文件。
下一个屏幕是来自 Pi-hole 自动安装程序 的消息,通知您正在安装网络范围的广告拦截器。
按 ENTER
继续。
接下来,安装向导会告诉您 Pi-hole 是 免费和开源的 ,并让您知道如何为 Pi-hole 项目捐款。
按 ENTER
继续安装。
然后,安装脚本将通知您需要 静态 IP 地址 才能使服务正常运行。
再次按 ENTER
继续。
下一个屏幕要求您 选择一个接口' 供 Pi-hole 监听。 因为您需要 Pi-hole 来监控 VPN 的网络接口,所以使用键盘上的箭头键突出显示 tun0,然后按 SPACE
进行选择。 接下来,按 TAB
跳转到屏幕底部的选项。 和'突出显示,按ENTER
保存设置并继续。
向导现在要求您指定 上游 DNS 提供商 。 这是 Pi-hole 将用于 解析域名 的服务。 为简单起见,您可以将此设置保留为默认值 Google。
按TAB
跳到屏幕底部,然后按ENTER
什么时候'突出显示。
在以下屏幕上,Pi-hole 会提示您选择要过滤的 互联网协议 。 协议(如 IPv4 和 IPv6)指定数据包的技术格式和计算机通过网络通信的寻址方案。 IPv4 是将设备连接到网络的最广泛采用的互联网协议。
Pi-hole 需要过滤 IPv4 和 IPv6 才能有效执行,因此选择这两个协议并按 TAB
跳转到屏幕底部的选项。 选择'然后按ENTER
.
Pi-hole 现在询问您是否要将当前网络设置用作 静态 IP 地址 。 因为您需要 Pi-hole 才能使用 VPN,所以您将在下一个屏幕上手动输入此信息。
使用箭头键选择'然后按ENTER
.
Pi-hole 现在将提示您输入 IPv4 地址。 在此处输入您的 VPN 服务器地址。 这是您第一次运行 ip
命令时收到的输出中 inet
之后的 Step 1 的 IP 地址。
如果您按照 Prerequisites 中的 OpenVPN Server on Ubuntu 16.04 指南,那么您的 IP 地址应该与以下屏幕截图中的相同。 在 IP 地址的末尾添加 /24
以指定 VPN 的 子网掩码 。
选择'并按下ENTER
接着说。
下一个屏幕要求您输入 Pi-hole 用来访问互联网的 IPv4 网关(路由器)。 在此处输入服务器默认网关的 IP 地址。 这是您第二次运行 ip
命令时收到的输出中 via
之后的 Step 1 的 IP 地址。
选择'并按下ENTER
输入信息后。
在下一个屏幕上,在将 IP 地址 和 Gateway 应用到 Pi-hole 配置之前确认它们是正确的。 如果您需要进行更改,请选择'并按下ENTER
. 否则,选择'并按下ENTER
继续安装。
除了命令行界面,您还可以通过它的web管理界面来管理Pi-hole。 Web 界面的主要优势之一是它能够查看实时 DNS 查询和阻止统计信息。
默认情况下,web 管理界面设置为On。 这是本教程中 Step 7 和 Step 8 的推荐设置和必需设置。
尽管本教程使用 Web 界面来管理 Pi-hole,但如果您想在开发过程中查看项目的不同分支,或者您只是更喜欢通过终端会话工作,您可以了解有关 Pi-hole 命令的更多信息-line interface in this official FAQ。
采用TAB
选择'然后按ENTER
.
为了利用 网络管理界面的 查看实时 DNS 查询和阻止统计信息的能力,您必须将 Pi-hole 配置为 记录查询 。
这是默认设置和推荐设置,因此请使用TAB
选择'然后按ENTER
.
此时,Pi-hole 将下载并安装剩余的依赖项以及阻止和黑名单的默认数据。 从那里,Pi-hole 将应用您在之前的屏幕中输入的所有网络配置设置。
在此步骤中,Pi-hole 会告诉您有 防火墙正在使用 ,然后安装程序会提示您接受服务正常运行所需的防火墙设置。
采用TAB
选择'然后按ENTER
.
从这里开始,Pi-hole 将继续自行安装。 完成后,对话标题将变为 Installation Complete!,Pi-hole 将自动启动并开始过滤网络上的所有 DNS 查询。
按 ENTER
退出安装向导。
Pi-hole 现在已经安装并配置好了,但在继续之前,让我们测试一下一切是否按预期工作。
第 4 步 — 测试 DNS 过滤
当 OpenVPN 和 Pi-hole 完全设置并一起工作时,在您的网络上发出的每个 DNS 请求都将被转发到 Pi-hole,然后它会检查请求的域是否与阻止列表中的任何其他域匹配,或者黑名单。 如果是这样,过滤器将完全删除域; 如果没有,过滤器将允许域通过。
即使 Pi-hole 尚未配置为与 OpenVPN 一起使用,您仍然可以通过测试 Pi-hole 直接从您的服务器过滤广告服务域的能力来验证当前安装。
要执行测试,请使用 host
命令在 google.com
上进行 DNS 查找,指定默认网关 10.8.0.1
作为要查询的名称服务器。 这将导致请求通过 Pi-hole 的过滤器。
host google.com 10.8.0.1
因为输出包括域的公共 IP 地址,所以您知道 google.com
不匹配阻止列表或黑名单中的任何域。
Output from host google.com 10.8.0.1... google.com has address 216.58.194.174 ...
现在,再次尝试 host
命令,这次将其传递给 pagead2.googlesyndication.com
,这是一个已知的广告服务域。
host pagead2.googlesyndication.com 10.8.0.1
这次您获取的是默认网关的地址,而不是域的公共 IP 地址。 这意味着 Pi-hole 成功识别了广告服务域,然后通过丢弃请求进行响应。
Output from host pagead2.googlesyndication.com 10.8.0.1... pagead2.googlesyndication.com has address 10.8.0.1 ...
如果您在输出中没有看到默认网关的地址,请仔细检查您是否已将 10.8.0.1
作为要查询的名称服务器,然后查看终端以获取指示安装或启动 Pi 时出现问题的消息-洞。
Pi-hole 现在已正确安装并过滤请求,因此是时候配置 OpenVPN 以将 DNS 请求指向 Pi-hole。
第 5 步 — 配置 OpenVPN
OpenVPN 当前配置为将所有 DNS 流量定向到您在安装期间在 Prerequisites 中指定的 DNS 服务器。 要将 Pi-hole 用作广告拦截器,您现在需要重新配置 OpenVPN 以将 DNS 流量指向 Pi-hole。
首先,打开 OpenVPN 的主配置文件进行编辑。
sudo nano /etc/openvpn/server.conf
找到以下几行:
/etc/openvpn/server.conf
... ;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220" ...
这些设置允许您将 DHCP 选项(包括 DNS 设置)推送到连接到 VPN 的客户端。
由于 server.conf
中包含的两个 dhcp-option
设置默认被注释掉,请保留它们以备将来需要再次引用它们。
现在,添加新设置,告诉 OpenVPN 引导客户端使用位于 10.8.0.1
的 Pi-hole 来处理所有 DNS 请求。
/etc/openvpn/server.conf
... ;push "dhcp-option DNS 208.67.222.222" ;push "dhcp-option DNS 208.67.220.220" push "dhcp-option DNS 10.8.0.1" ...
保存并关闭文件以继续。
要应用更改,请重新加载 OpenVPN。
sudo systemctl restart openvpn@server
最后,测试 OpenVPN 是否成功启动备份。
sudo systemctl status openvpn@server
如果一切正常,输出会告诉你 OpenVPN 是 active (running)
。
Output from systmctl... Active: active (running) since Mon 2017-11-27 22:08:43 UTC; 1 day 23h ago ...
如果服务启动失败,请回溯之前的步骤来解决问题。
OpenVPN 现在配置为将 DNS 请求定向到 Pi-hole,但您仍然需要调整防火墙以使一切正常。
第 6 步 — 调整防火墙规则
现在 Pi-hole 和 OpenVPN 都已配置并运行,打开端口 53
以允许通过 Pi-hole 过滤器的 DNS 请求继续到上游 DNS 服务器。
sudo ufw allow 53
要使 Web 浏览正常工作,请为 HTTP 和 HTTPS 流量打开防火墙。
sudo ufw allow http sudo ufw allow https
接下来,告诉 UFW 允许在端口 53
上从 10.8.0.0/24
到 10.8.0.1
IP 范围内的所有 udp
和 tcp
传输。 这将允许来自 VPN 的 IP 范围的 DNS 查询传递到 Pi-hole 进行过滤。
sudo ufw allow proto udp from 10.8.0.0/24 to 10.8.0.1 port 53 sudo ufw allow proto tcp from 10.8.0.0/24 to 10.8.0.1 port 53
同样,允许源自 10.8.0.0/24
IP 范围的网络流量通过端口 80
上 10.8.0.1
的 VPN 服务器。
sudo ufw allow proto tcp from 10.8.0.0/24 to 10.8.0.1 port 80
要应用更改,请重新加载 UFW。
sudo ufw reload
如果成功,输出将显示:
Output from ufw reloadFirewall reloaded
如果遇到问题,请按照屏幕上的消息解决问题。
现在防火墙已针对 OpenVPN 和 Pi-hole 进行了配置,您可以登录 Web 管理界面来探索 Pi-hole 的过滤功能。
第 7 步 — 使用阻止列表过滤
Pi-hole 附带一组由项目开发团队维护的默认阻止列表; 然而,仅仅这些列表并不总是足够的。 理想情况下,您应该定制阻止列表以适应您的特定浏览习惯和您使用的应用程序。 您可以使用 Pi-hole 的管理 Web 界面管理阻止列表等。
要通过其 Web 界面管理 Pi-hole,您需要先 连接到您的 OpenVPN 网络。 连接后,将 Web 浏览器导航到 Web 界面的默认主页 http://10.8.0.1/admin
。
您将看到一个屏幕,其中包含报告 过去 24 小时被阻止的查询数 、 过去 24 小时的查询数、 过去 24 小时被阻止的查询的百分比的小部件,以及阻止列表中的 域数 。 您还将看到过去 24 小时内 查询的图表 、Pi 孔 状态 指示器以及 仪表板 、 的导航选项登录 屏幕和 PayPal 上的 捐赠 页面。
点击【X6X】登录【X15X】进入完整界面。 出现提示时,输入您在 步骤 3 的最终 Pi-hole 安装屏幕上收到的密码。
登录后,界面的总体布局将保持不变,但现在它将在屏幕左侧包含更多菜单选项以及 Query Types over Time 和 的附加小部件]随着时间的推移转发目的地。
在向 Pi-hole 添加其他阻止列表之前,您应该首先更新项目维护人员的官方阻止列表数据,因为最近的更新可能包含您将要手动添加的部分或全部数据源。
在屏幕左侧,单击 Tools 展开导航菜单,然后选择 Update Lists。
在下一个屏幕上,单击屏幕中间的蓝色 Update Lists 按钮以获取最新版本的官方阻止列表源。
当 Pi-hole 执行更新时,它将向您显示它从中提取列表数据的源、自上次更新以来是否已修改源以及是否将任何数据导入到您的安装中。 完成后,屏幕顶部的绿色条将显示 Success!。
随着官方阻止列表数据的更新,您可以添加自己的其他阻止列表。
在屏幕左侧的导航菜单中单击设置,查看Pi-hole的主要配置选项。
在下一个屏幕上,单击标有 Pi-Hole's Block Lists 的框中的 + 符号以查看当前的阻止列表数据。
默认情况下,Pi-hole 使用以下阻止列表进行过滤:
- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
- https://mirror1.malwaredomains.com/files/justdomains
- http://sysctl.org/cameleon/hosts
- https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
- https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
- https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
- https://hosts-file.net/ad_servers.txt
要将新列表添加到您的安装中,请在窗格底部的输入字段中输入列表的源 URL,然后按 保存并更新 按钮以保存添加并重新运行 更新列表 函数。 这将自动提取与新阻止列表源关联的数据。
有关按类别划分的其他阻止列表,例如可疑列表、广告列表以及跟踪和遥测列表,请参阅大块列表集合 .
现在您已经更新了默认阻止列表并了解了如何手动添加更多,让我们看一下使用黑白名单过滤请求。
第 8 步 — 使用黑名单和白名单进行过滤
除了 Pi-hole 用于过滤 DNS 请求的阻止列表之外,您还可以使用黑名单来定位单个域。 黑名单会自动丢弃进出特定域的传出和传入请求。 这对于需要阻止包含不适合工作或以托管病毒和其他恶意软件而闻名的内容的域的企业和其他组织特别有用。
要将域列入黑名单,请单击屏幕左侧主导航中的 Blacklist。
在下一个屏幕上,您可以将 exact 或 wildcard 阻止添加到域。
通过 exact 阻止,只有那些与您在 Add a domain 输入字段中输入的值完全匹配的域才会被阻止。 换句话说,如果您在输入字段中输入 example.com
,则来自 example.com
的请求将被阻止,但来自 www.example.com
的请求不会。
使用 通配符 阻止,您输入的域和任何相关的 子域 都将被阻止。 在这种情况下,这意味着 example.com
和 www.example.com
都将被阻止。
通过在 添加域 输入字段中输入 pi-hole.net
来测试黑名单功能,然后单击 添加(精确) 按钮。 pi-hole.net 现在列在 Blacklist 屏幕上的 Exact blocking 下。
任何发往或来自 pi-hole.net
的请求现在都将被 Pi-hole 的黑名单过滤器阻止。 尝试将您的网络浏览器导航到 https://pi-hole.net
。 尽管错误消息因浏览器而异,但您将无法再访问此地址。
要从 精确阻止 中删除 pi-hole.net
,请单击域右侧带有白色垃圾桶图标的红色按钮。
在光谱的另一端,白名单告诉 Pi-hole 始终允许进出特定域的所有请求通过其过滤器。 当合法域最终出现在您正在使用的阻止列表中时,或者当您希望允许进出包含基于广告和非广告内容的域的流量时,白名单会很有用。
要将域列入白名单,请单击屏幕左侧主导航中的 Whitelist。
在下一个屏幕上,您可以添加要列入白名单的新域,并查看哪些域已列入白名单。
即使您自己尚未将任何域列入白名单,默认情况下,Pi-hole 也会将其用于更新阻止列表的域列入白名单。 这是为了防止一个阻止列表阻止另一个阻止列表。
此外,请注意 Note 说明您不能将通配符阻止域的子域列入白名单。 这意味着,如果您在 example.com
上已有通配符块,将 www.example.com
列入白名单仍然不会让您访问子域。 为了将 example.com
列入黑名单但将 www.example.com
列入白名单,您需要将确切的阻止应用于 example.com
。
要将域列入白名单,请在添加域输入字段中输入域,然后按添加按钮。 Pi-hole 将短暂闪烁一条消息,上面写着: 添加到白名单... ,然后是第二条消息说, 成功! 列表将刷新 . 然后,这两条消息都会消失,并且列入白名单的域列表将包含您刚刚输入的域。
要从白名单中删除域,请单击您不再希望列入白名单的域右侧带有白色垃圾桶图标的红色按钮。
最后,要测试您的安装的黑名单和白名单功能,请参阅 Pi-hole 的 页面的官方列表,以测试您的安装的广告拦截性能 。
结论
您现在有了一种简单而有效的方法来过滤网络上的任何 DNS 请求,但请记住,您可能需要稍微调整阻止列表以适应您的个人浏览习惯。
要了解运行 Pi-hole 的另一种方式,请参阅 这个将 Pi-hole 放入 Docker 容器的项目 。
或者,为了进一步增强您的网络安全性,了解如何在您当前的 Pi-hole 安装上 启用 DNSCrypt 以创建私密且安全的 内联网 。
有关一般信息和其他问题,请访问 官方 Pi-hole 讨论论坛 。