如何在 Ubuntu 16.04 上使用 Pi-hole 和 OpenVPN 在 DNS 层面阻止广告

介绍

虽然有插件旨在阻止每一个应用程序/每一个设备的基础上的广告,停止广告在 DNS 级别提供一个更完整的解决方案,在您的所有应用程序和设备一次。

[Pi-hole] (https://pi-hole.net/) & mdash; 一个最初创建的DNS服务器,用于[Raspberry Pi单板电脑] (https://www.raspberrypi.org/) & mdash; 过滤请求以代理域,屏蔽广告并改进网络性能. 有了"Pi-hole",您可以积极监控您网络上提出的每个DNS请求,并屏蔽苍蝇上的请求. 这个功能也超越了网页浏览器,允许您通过针对适当的DNS查询来过滤出其他应用程序中的广告.

Pi-hole与虚拟私人网络(VPN)结合使用时特别有效. VPN通过_tunnels_建立和维护连接,这些连接是客户端和服务器之间的逻辑网络连接. 此外,如果您的 VPN 支持 [Secure Socket Layle (https://andsky.com/tech/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs (SSL)),则整个交易都会被加密,为数据传输提供一个安全链接.

在本教程中,您将安装和配置OpenVPN和Pi-hole,以作为您自己的私人网络,基于DNS的广告阻止过滤器,用于连接到您的网络的所有设备。

前提条件

要完成本教程,您将需要:

第1步:收集网络信息

在开始安装之前,您需要收集网络信息,用于与VPN进行通信,因为Pi-hole的安装过程接管了您的终端会话,在您开始之前掌握这些信息将使整个过程更顺利。

首先,使用),您的VPN隧道是活跃的。

1ip addr show tun0

输出提供了有关接口的深入信息。

1[secondary_label Output from ip addr show tun0]
21: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
3    link/none
4    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
5       valid_lft forever preferred_lft forever

更具体地说:

  • 联合国 第一行告诉你接口名称`tun0',然后是一系列描述网络套接字特性的旗帜。
  • 联合国 第二行表示,目前此界面上没有[链接层 (https://andsky.com/tech/tutorials/an-introduction-to-networking-terminology-interfaces-and-protocols# network-layers)设备可用.
  • 联合国 第三行包含这个网络接口的IP地址值.
  • 联合国 第四行报告说,接口的IPv6有效且首选的租赁寿命被设定为永远。 在这种情况下,IP地址的租赁时间永远不会改变,因为地址在VPN安装期间被专门分配给了接口. .

记住net后面的 IP 地址,因为这是您的 VPN 服务器的地址,您需要在安装 Pi-hole 时知道这一点。

除了您的 VPN 服务器的 IP 地址外,Pi-hole 还需要知道用于 IPv4 流量的 gateway

再次使用) 到) 字符串, default. default 表示服务器使用的默认网关。

1ip route show | grep default

在下面的示例中,输出告诉你默认网关的 IP 地址是 198.51.100.1,网关可以在 eth0 界面上访问,并且网关的 onlink 选项已启用,这是默认的隧道连接。

1[secondary_label Output from ip r | grep default]
2default via 198.51.100.1 dev eth0 onlink

请记住通过之后的IP地址,因为这是您的服务器的默认网关地址,您需要在安装Pi-hole时知道这一点。

有了网络信息,您可以下载和安装Pi-hole。

第2步:下载Pi洞

通过 官方安装说明,使用 Git 将 Pi-hole repository on GitHub克隆成 ~/Pi-hole,该目录将在克隆过程中自动创建。 使用 --deepth 1 选项创建具有截止到最后修订历史的克隆;这将为您提供最新的 Pi-hole 版本,而无需所有额外的历史修订。

更改到您的家庭目录并克隆存储库。

1cd ~
2git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole

输出证实了你正在克隆的位置,然后提供了一个实时的过程报告,包括Git预计将复制的对象的数目以及它实际复制的数量。

1[secondary_label Output from git clone]
2Cloning into 'Pi-hole'...
3remote: Counting objects: 65, done.
4remote: Compressing objects: 100% (56/56), done.
5remote: Total 65 (delta 5), reused 26 (delta 1), pack-reused 0
6Unpacking objects: 100% (65/65), done.
7Checking connectivity... done.

现在,进入新创建的Pi-hole/automated\install/目录,您将找到 Pi-hole 的安装脚本。

1cd Pi-hole/automated\ install/

打开安装脚本,以确保您对它所做的事情感到舒适,或根据需要修改它。

1nano basic-install.sh

保存并关闭文件以继续。

您现在拥有最新的 Pi-hole 版本的副本,并且已经检查了自动安装脚本,以查找潜在问题。

步骤 3 — 运行安装脚本

Pi-hole 安装和配置是通过基于终端的向导进行的,以以下命令启动向导:

1bash basic-install.sh

首先,安装脚本告诉你,它是 安装包 ,它正在检索安装所需的额外文件。

Step 1: Pi-hole Installation Script

下一个屏幕是自动安装程序 Pi-hole自动安装程序 的消息,告知您正在安装网络范围内的广告阻止程序。

点击进入继续。

Step 2: Pi-hole Installation Script

接下来,安装向导告诉你,Pi-hole是免费的和开源的,并告诉你如何向Pi-hole项目捐款。

Enter来继续安装。

Step 3: Pi-hole Installation Script

然后,安装脚本会通知您,该服务需要一个 静态IP地址 才能正常运作。

再次按进入来继续。

Step 4: Pi-hole Installation Script

下一个屏幕会要求你 Choose An Interface for Pi-hole to listen on. 因为你需要 Pi-hole 来监控 VPN 的网络接口,使用键盘上的箭头来突出** tun0** ,然后按SPACE来进行选择。

Step 5: Pi-hole Installation Script

该向导现在要求您指定 Upstream DNS Provider . 这是 Pi-hole 将使用的服务 解决域名. 为了方便,您可以将此设置留给默认值,** Google** 。

TAB跳到屏幕底部,然后按ENTER,当 被突出时。

Step 6: Pi-hole Installation Script

在下面的屏幕上,Pi-hole 提示你选择哪个 互联网协议来过滤。 协议 —如 IPv4 和 IPv6 —指定包的技术格式和计算机通过网络进行通信的地址方案。 IPv4 是连接设备到网络的最广泛采用的互联网协议。

IPv4 和 IPv6 都需要过滤才能有效地执行 Pi-hole,所以让两个协议都选择,然后按TAB跳到屏幕底部的选项。

Step 7: Pi-hole Installation Script

Pi-hole 现在会询问您是否希望使用当前的网络设置作为 静态 IP 地址 . 因为您需要 Pi-hole 来使用 VPN,您将在下一个屏幕上手动输入此信息。

使用箭头键选择 ,然后按ENTER

Step 8: Pi-hole Installation Script

Pi-hole 现在会提示您一个 IPv4 地址 . 输入您的 VPN 服务器的地址在这里. 这是从 [步骤 1](# step-1-%E2%80%94-gathering-network-information)的 IP 地址,在您第一次运行ip命令时收到输出中的net之后。

如果您遵循了 OpenVPN 服务器在 Ubuntu 16.04 指南在 [前提](# preresquites),那么您的 IP 地址应该与下面的屏幕相同。 添加 /24到 IP 地址的尽头,以指定 VPN 的 [子网面罩](https://andsky.com/tech/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking netmasks-and-subnets)。

选择OK,然后按ENTER

Step 9: Pi-hole Installation Script

下一个屏幕要求你输入 IPv4 网关(路由器)**,而 Pi-hole 应该使用它来访问互联网. 输入您的服务器的默认网关的 IP 地址在这里. 这是来自 [步骤 1] 的 IP 地址(# step-1-%E2%80%94-gathering-network-information) 在您第二次运行ip命令时收到输出中的via之后。

选择 ,然后在输入信息后按ENTER

Step 10: Pi-hole Installation Script

在下一个屏幕上,确认 IP 地址 和** Gateway** 是正确的,然后将它们应用到 Pi-hole 的配置中。如果需要进行更改,请选择** ** ,然后按ENTER

Step 11: Pi-hole Installation Script

除了命令行接口外,您还可以通过其 web admin 接口 管理 Pi-hole. Web 接口的主要优点之一是能够查看直播 DNS 查询和阻止统计数据。

默认情况下,web admin 界面设置为 On . 这既是推荐的设置,也是本教程中的 [步骤 7](# step-7-%E2%80%94-filtering-with-block-lists)和 步骤 8所需的设置。

虽然本教程使用 Web 界面来管理 Pi-hole,但如果你想在开发过程中查看项目的不同分支,或者如果你只是更喜欢通过终端会话工作,你可以了解更多关于 Pi-hole 的命令行界面 在这个官方常见问题

使用TAB选择OK,然后按ENTER

Step 12: Pi-hole Installation Script

为了利用 web admin 界面 的能力查看实时 DNS 查询和阻止统计数据,您必须将 Pi-hole 配置为** log 查询** 。

这是默认和推荐的设置,所以使用TAB来选择 ,然后按ENTER

Step 13: Pi-hole Installation Script

在此时,Pi-hole 将下载并安装剩余的依赖性以及区块和黑名单的默认数据,从那里,Pi-hole 将应用您在前面屏幕中输入的所有网络配置设置。

在此步骤中,Pi-hole 会告诉您使用的防火墙,然后安装程序会提示您接受服务正常运作所需的防火墙设置。

使用TAB选择Yes,然后按ENTER

Step 14: Pi-hole Installation Script

完成后,对话框的标题将更改为安装完成!**,Pi-hole 将自动启动并开始过滤网络上的所有 DNS 查询。

Enter来退出安装向导。

Step 15: Pi-hole Installation Script

Pi-hole 现在已安装和配置,但在继续前,让我们测试一切是否按预期工作。

第4步:测试DNS过滤器

当 OpenVPN 和 Pi-hole 都完全配置并协作时,在您的网络上发出的每个 DNS 请求都会被转发到 Pi-hole,然后将检查请求的域是否匹配了任何其他域名,无论是区块链列表还是黑名单。

尽管 Pi-hole 尚未配置为与 OpenVPN 合作,但您仍然可以通过测试 Pi-hole 的能力来从您的服务器中过滤广告服务域来验证当前的安装。

要进行测试,请使用主机命令在google.com上进行DNS搜索,指定默认网关10.8.0.1,作为要查询的名称服务器。

1host google.com 10.8.0.1

由于输出包括域的公共IP地址,你知道google.com没有匹配任何区块链列表或黑名单上的域。

1[secondary_label Output from host google.com 10.8.0.1]
2...
3google.com has address 216.58.194.174
4...

现在,再次尝试主机命令,这次通过它pagead2.googlesyndication.com,一个已知的广告服务域。

1host pagead2.googlesyndication.com 10.8.0.1

而不是域的公共 IP 地址,这一次你会得到默认网关的地址,这意味着 Pi-hole 成功识别了广告服务域,然后通过放弃请求来回应。

1[secondary_label Output from host pagead2.googlesyndication.com 10.8.0.1]
2...
3pagead2.googlesyndication.com has address 10.8.0.1
4...

如果您在输出中看不到默认网关的地址,请双重检查是否包含了10.8.0.1作为要查询的名称服务器,然后检查终端是否有消息表明安装或启动 Pi-hole 存在问题。

Pi-hole 现在已正确安装并过滤请求,所以是时候将 OpenVPN 配置为将 DNS 请求指向 Pi-hole。

第5步:设置OpenVPN

OpenVPN目前已配置为将所有 DNS 流量导向到您在安装过程中指定的 DNS 服务器(# preresquites)。

首先,打开OpenVPN的主要配置文件进行编辑。

1sudo nano /etc/openvpn/server.conf

找出以下几条线:

1[label /etc/openvpn/server.conf]
2...
3;push "dhcp-option DNS 208.67.222.222"
4;push "dhcp-option DNS 208.67.220.220"
5...

这些设置允许您将DHCP选项(包括DNS设置)推到连接到VPN的客户端。

由于在「server.conf」中包含的两个「dhcp-option」设置默认地被评论,因此,如果您需要在未来再次参考它们,请留下它们。

现在,添加新的设置,告诉OpenVPN指导客户端使用位于10.8.0.1的Pi洞,用于所有DNS请求。

1[label /etc/openvpn/server.conf]
2...
3;push "dhcp-option DNS 208.67.222.222"
4;push "dhcp-option DNS 208.67.220.220"
5push "dhcp-option DNS 10.8.0.1"
6...

保存并关闭文件以继续。

若要应用这些更改,请重新加载 OpenVPN。

1sudo systemctl restart openvpn@server

最后,测试OpenVPN成功启动了备份。

1sudo systemctl status openvpn@server

如果一切顺利,输出将告诉你OpenVPN是活跃(运行)

1[secondary_label Output from systmctl]
2...
3Active: active (running) since Mon 2017-11-27 22:08:43 UTC; 1 day 23h ago
4...

如果该服务未能启动,请执行以前的步骤来解决问题。

OpenVPN现在已配置为将 DNS 请求直接发送到 Pi-hole,但您仍然需要调整防火墙以使一切正常工作。

第6步:调整防火墙规则

现在 Pi-hole 和 OpenVPN 都已配置和运行,打开端口53,允许通过 Pi-hole 过滤器的 DNS 请求继续到上游 DNS 服务器。

1sudo ufw allow 53

为了让网络浏览正常工作,打开 HTTP 和 HTTPS 流量的防火墙。

1sudo ufw allow http
2sudo ufw allow https

接下來,告訴 UFW 允許所有「udp」和「tcp」傳輸來自「10.8.0.0/24」到「10.8.0.1」 IP 範圍的端口 `53」。

1sudo ufw allow proto udp from 10.8.0.0/24 to 10.8.0.1 port 53
2sudo ufw allow proto tcp from 10.8.0.0/24 to 10.8.0.1 port 53

同样,允许源自10.8.0.0/24 IP 范围的网络流量通过10.8.0.1端口80的 VPN 服务器。

1sudo ufw allow proto tcp from 10.8.0.0/24 to 10.8.0.1 port 80

若要应用更改,请重新加载 UFW。

1sudo ufw reload

如果成功,输出将读到:

1[secondary_label Output from ufw reload]
2Firewall reloaded

如果您遇到问题,请遵循屏幕上的消息来解决问题。

现在,防火墙已为 OpenVPN 和 Pi-hole 配置,您可以登录 Web 管理界面,探索 Pi-hole 的过滤功能。

步骤 7 — 通过区块清单过滤

Pi-hole 配备一组由项目开发团队维护的默认区块列表,但这些列表并不总是足够的,理想情况下,您应该将区块列表定制为适合您的浏览习惯和您使用的应用程序。

要通过其 Web 界面管理 Pi-hole,您需要先 连接到您的 OpenVPN 网络。一旦连接到,请将您的 Web 浏览器导航到 Web 界面的默认主页到 http://10.8.0.1/admin

您将收到一个显示屏,其中包括指示过去 24 小时封锁的查询数、过去 24 小时封锁的查询数、过去 24 小时封锁的查询百分比、区块链上的域数。

Web Interface Dashboard Not Logged In

点击 登录 以访问完整的界面. 当被提示时,请在 [步骤 3](# step-3-%E2%80%94-running-the-installation-script)中输入您在最后的 Pi-hole 安装屏幕上收到的密码。

登录后,界面的总体布局将保持相同,但现在屏幕左侧将包含更多的菜单选项,以及 Query Types over Time 和** Forward Destinations over Time** 的额外小工具。

Web Interface Dashboard Logged In

在将额外的区块列表添加到 Pi-hole 之前,您应该首先更新项目维护者的官方区块列表数据,因为最新的更新可能包含您即将手动添加的一些或所有数据源。

在屏幕的左侧,单击 工具 来扩展导航菜单,然后选择** 更新列表** 。

在下一个屏幕上,点击屏幕中间的蓝色 更新列表 按钮,以获取官方封锁列表来源的最新版本。

Web Interface Updating List of Ad-Serving Domains

随着 Pi-hole 执行更新,它将向您显示它从哪个来源提取列表数据,自上次更新以来这些来源是否已被修改,以及是否有任何数据被导入到您的安装中。

Web Interface Updated List of Ad-Serving Domains

随着官方区块清单数据的更新,您已经准备好添加自己的额外的区块清单。

在屏幕左侧的导航菜单中点击设置以获取 Pi-hole 的主要配置选项。

在下一个屏幕上,点击标记为Pi-Hole’s Block Lists的框中的 + 符号,查看当前的区块列表数据。

Web Interface Adding Additional Block Lists

默认情况下,Pi-hole 使用以下列表来过滤:

  • [https://raw.githubusercontent.com/Steven Black/hosts/master/hosts]https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts (中文(简体) ).
  • [https://mirror1.malwaredomains.com/files/justdomains]https://mirror1.malwaredomains.com/files/justdomains。
  • [http://sysctl.org/相机/hosts]http://sysctl.org/cameleon/hosts。
  • [https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist]https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist (中文(简体) ).
  • [https://s3.amazonaws.com/lists.disconnection.me/simp_tracking.txt]https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt (中文(简体) ).
  • [https://s3.amazonaws.com/lists.disconnection.me/simp_ad.txt]https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt (中文(简体) ).
  • [https://hosts-file.net/ad_servers.txt]https://hosts-file.net/ad_servers.txt。

要将新列表添加到您的安装中,请在窗口底部的输入字段中输入列表的源URL,然后按 保存和更新 按钮来保存您的添加,并重新运行 ** 更新列表** 函数。

有关其他分类的区块清单,如可疑清单,广告清单和跟踪和远程测量清单,请参阅 The Big Blocklist Collection

现在你已经更新了默认区块列表,并学会了如何手动添加更多,让我们看看使用黑色和白色列表过滤请求。

第8步:使用黑名单和白名单过滤

除了 Pi-hole 用于过滤 DNS 请求的区块链列表外,您还可以使用黑名单来瞄准个别域名。 黑名单会自动将来自特定域的出入请求放下,这对企业和其他组织尤其有用,他们需要阻止包含不适合工作或已知托管病毒和其他恶意软件的域名。

要黑名单域名,请在屏幕左侧的主要导航中点击 黑名单

在下一个屏幕上,您可以添加 exact 或** wildcard** 封锁到一个域。

Web Interface Blacklist Screen

通过 exact 封锁,只有与您在** 添加域** 输入字段中输入的值完美匹配的域将被阻止,换句话说,如果您在输入字段中输入 example.com,则将阻止向和从 example.com 发出的请求,但不会阻止向和从 www.example.com 发出的请求。

通过 wildcard 封锁,您输入的域和任何相关的 子域都将被封锁。在这种情况下,这意味着无论是 example.com 还是 www.example.com 都将被封锁。

测试黑名单的功能,输入)**`按钮。

Web Interface Blacklisting pi-hole.net

任何向或从 pi-hole.net 发出的请求将被 Pi-hole 的黑名单过滤器阻止. 尝试导航您的网页浏览器到 https://pi-hole.net. 虽然错误消息因浏览器而异,但您将无法访问此地址。

要从 准确封锁 中删除 pi-hole.net,请点击域右侧的红色按钮,并使用白色垃圾桶图标。

在光谱的对立端,白名单告诉Pi-hole始终允许所有请求到特定域和从特定域通过其过滤器。

要列出一个域名,请在屏幕左侧的主要导航中点击 Whitelist

在下一个屏幕上,您可以添加新的域名来白列表,并查看哪些域名已经白列表。

Web interface Default Whitelist Screen

即使您尚未自行列出任何域名,Pi-hole 默认情况下也将其用于更新区块列表的域名列出白色,以防止一个区块列表阻止其他区块列表。

此外,请注意 Note ,说明您不能白列出被封锁的域名的子域名,这意味着如果您已经在example.com上有wildcard区块,白列表www.example.com仍然不会让您访问子域名。

要将域名列入白名单,请在添加域名输入字段中输入域名,然后按添加按钮。Pi-hole会短暂闪烁一个消息,上面说:添加到白名单,接着一个第二个消息说:`成功!列表将更新

要从白名单中删除域名,请单击您不再希望被白名单列出的域名右侧的红色按钮和白色垃圾箱图标。

最后,要测试您的安装的黑名单和白名单功能,请参阅 Pi-hole 的官方列表 测试设置的广告阻止性能的页面

结论

您现在有一个简单但有效的方法来过滤您的网络上的任何DNS请求,但请记住,您可能需要调整区块列表,以适应您的个人浏览习惯。

有关运行 Pi 洞的另一种方法的信息,请参阅 将 Pi 洞放入 Docker 容器的这个项目

或者,为了进一步增强您的网络安全性,请了解如何在当前的Pi洞安装中启用DNSCrypt(https://github.com/pi-hole/pi-hole/wiki/DNSCrypt)以创建私人和安全的Intranet(https://andsky.com/tech/tutorials/how-to-create-an-intranet-with-openvpn-on-ubuntu-16-04)。

有关一般信息和其他问题,请访问官方Pi-hole讨论论坛(https://discourse.pi-hole.net/latest)。

Published At
Categories with 技术
Tagged with
comments powered by Disqus