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

在本教程中,您将安装并配置OpenVPN和Pi-hole,作为您所有连接到您网络的设备的私有网络范围的基于DNS的广告拦截过滤器。

介绍

在线广告不仅令人恼火,而且是您设备上潜在的恶意软件来源。 虽然有些插件旨在根据每个应用程序/每个设备阻止广告,但是在DNS级别停止广告可以一次性在所有应用程序和设备上提供更完整的解决方案。

Pi-hole (最初创建用于Raspberry Pi单板计算机的DNS服务器)将请求过滤到广告服务域,阻止广告并提高网络性能。 使用Pi-hole,您可以主动监视网络上发出的每个DNS请求,并可以即时阻止请求。 该功能还可以扩展到网页浏览器之外,允许您通过定位适当的DNS查询来过滤掉其他应用程序中的广告。

当您将其与虚拟专用网络 (VPN)结合使用时,Pi孔特别有效。 VPN通过隧道来建立和维护连接, 隧道是客户端和服务器之间的逻辑网络连接。 此外,如果您的VPN支持安全套接字层 (SSL),则整个事务将被加密,从而为数据传输提供安全的链接。

在本教程中,您将安装并配置OpenVPN和Pi-hole,作为您所有连接到您的网络的设备的私有网络范围的基于DNS的广告拦截过滤器。

先决条件

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

第1步 - 收集网络信息

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

首先,使用带有addrshow子命令的ip命令来标识tun0 (您的VPN隧道处于活动状态的网络接口)的IP地址。

ip addr show tun0

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

1: 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孔时,您需要知道这一点。

除了VPN服务器的IP地址,Pi-hole还需要知道用于IPv4流量的网关 您可以将网关看作是不同网络之间的接入点。

再次使用ip命令,这次是使用routeshow子命令来获取服务器的路由表信息。 将路由表信息传递grep ,它将解析并搜索字符串的输出default值为。 default表示服务器使用的默认网关。

ip route show | grep default

在以下示例中,输出会告诉您默认网关的IP地址为198.51.100.1 ,网关在eth0接口上可以访问,并且网关的onlink选项处于打开状态,这是带有隧道连接的默认网关。

default via 198.51.100.1 dev eth0 onlink

记下via后的IP地址,因为这是您服务器的默认网关地址。 安装Pi孔时,您需要知道这一点。

掌握网络信息后,即可下载并安装Pi-hole。

第2步 - 下载Pi孔

根据官方安装说明 ,使用Git将GitHub上Pi-hole存储库克隆到~/Pi-hole目录中,该目录将在克隆过程中自动创建。 使用--depth 1选项来创建一个历史截断到最后一个版本的克隆; 这将给你没有所有额外的历史修订的最新版本的Pi孔。

转到您的主目录并克隆存储库。

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

输出确认你正在克隆的位置,然后提供一个实时的过程报告,包括Git期望复制的对象的数量以及它实际复制的数量。

Cloning 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孔安装和配置。 使用以下命令启动向导:

bash basic-install.sh

首先,安装脚本告诉你它是正在安装软件包 ,并且正在检索安装所需的其他文件。

第1步:Pi孔安装脚本

下一个屏幕是来自Pi孔自动安装程序的消息,通知您正在安装网络广告拦截器。

ENTER继续。

第2步:Pi孔安装脚本

接下来,安装向导告诉你Pi洞是免费的,开源的 ,让你知道如何捐献给Pi洞项目。

ENTER继续安装。

第3步:Pi孔安装脚本

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

再次按ENTER继续。

第四步:Pi孔安装脚本

下一个屏幕会要求您选择一个 Pi孔的接口来监听。 由于您需要Pi孔来监视VPN的网络接口,请使用键盘上的箭头键突出显示tun0 ,然后按SPACE进行选择。 接下来,按TAB键跳转到屏幕底部的选项。 <Ok>突出显示,按ENTER保存设置并继续。

第5步:Pi孔安装脚本

该向导现在要求您指定上游DNS提供程序 这是Pi-hole用来解析域名的服务。 为了简单起见,您可以将此设置保留为默认值Google

TAB跳到屏幕底部,然后按< ENTER >ENTER

第6步:Pi孔安装脚本

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

Pi孔需要过滤IPv4和IPv6才能有效执行,因此选择两个协议并按TAB键跳转到屏幕底部的选项。 选择<Ok> ,然后按ENTER

第7步:Pi孔安装脚本

Pi-hole现在询问您是否要使用当前网络设置作为静态IP地址 因为你需要Pi-hole才能使用VPN,所以你会在下一个屏幕上手动输入这个信息。

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

第8步:Pi孔安装脚本

Pi-hole现在会提示您输入IPv4地址 在这里输入您的VPN服务器的地址。 这是第1步中的IP地址,是在您首次运行ip命令时收到的输出中的inet之后发出的。

如果您在先决条件中遵循Ubuntu 16.04上OpenVPN Server指南 ,则您的IP地址应与以下屏幕截图中的IP地址相同。 /24添加到IP地址的末尾以指定VPN的子网掩码

选择<Ok> ,然后按ENTER继续。

第9步:Pi孔安装脚本

下一个屏幕要求您输入Pi-hole应该用来访问互联网的IPv4网关(路由器) 在此输入服务器默认网关的IP地址。 这是来自第1步的IP地址,它是在您第二次运行ip命令时收到的输出中经过的。

输入信息后,选择<Ok>并按ENTER

第10步:Pi孔安装脚本

在下一个屏幕上,确认IP地址网关在应用于Pi孔配置之前是否正确。 如果您需要进行更改,请选择<No> ,然后按ENTER 否则,请选择<是> ,然后按ENTER继续安装。

第1步1:Pi孔安装脚本

除了命令行界面之外,您还可以通过其管理界面管理Pi-hole。 Web界面的主要优势之一是能够查看实时DNS查询和阻止统计信息。

默认情况下, Web管理界面设置为 这是推荐的设置,也是本教程中第7步第8步的必需步骤

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

使用选项卡选择<Ok> ,然后按ENTER

第12步:Pi孔安装脚本

为了使用Web管理界面查看实时DNS查询和阻止统计信息的功能,您必须配置Pi-hole来记录查询

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

第1步3:Pi孔安装脚本

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

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

使用选项卡选择<是> ,然后按ENTER

第1步4:Pi孔安装脚本

从这里开始,Pi-hole将继续自行安装。 完成后,对话标题将变为, 安装完成! ,Pi孔将自动启动并开始过滤网络上的所有DNS查询。

ENTER退出安装向导。

第1步5:Pi孔安装脚本

Pi孔现在已经安装和配置好了,但在继续之前,让我们测试一切正常。

第4步 - 测试DNS过滤

当OpenVPN和Pi-hole都完全建立并且一起工作时,您网络上的每个DNS请求都会被转发到Pi-hole,然后Pi-hole会检查请求的域是否与阻止列表中的任何其他域匹配黑名单。 如果是这样,过滤器将完全删除域; 如果没有,过滤器将允许域通过。

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

要执行测试,请使用host命令在google.com上执行DNS查找,并指定默认网关10.8.0.1作为要查询的Nameservers。 这将导致请求通过Pi孔的过滤器。

host google.com 10.8.0.1

由于输出包含域的公共IP地址,因此您知道google.com与阻止列表或黑名单中的任何域都不匹配。

...
google.com has address 216.58.194.174
...

现在,再次尝试host命令,这次是传递给已知广告服务域的pagead2.googlesyndication.com

host pagead2.googlesyndication.com 10.8.0.1

而不是域的公共IP地址,这次你找回默认网关的地址。 这意味着Pi孔成功识别了广告服务域,然后通过放弃请求进行响应。

...
pagead2.googlesyndication.com has address 10.8.0.1
...

如果在输出中没有看到默认网关的地址,请仔细检查是否包含了10.8.0.1作为要查询的Nameservers,然后查看终端是否有安装或启动Pi-hole的问题。

Pi洞现在可以正确安装并过滤请求,所以现在可以配置OpenVPN来将DNS请求指向Pi孔。

第5步 - 配置OpenVPN

OpenVPN当前配置为将所有DNS流量定向到您在先决条件中安装期间指定的DNS服务器。 要将Pi孔作为广告拦截器,您现在需要重新配置OpenVPN以将DNS流量指向Pi孔。

首先打开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)

...
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

要使网页浏览正常工作,请打开HTTP和HTTPS流量的防火墙。

sudo ufw allow http
sudo ufw allow https

接下来,告诉UFW允许端口53上的10.8.0.0/2410.8.0.1 IP范围内的所有udptcp传输。 这将允许来自VPN的IP范围的DNS查询传递到Pi孔进行过滤。

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

如果成功,输出结果将如下所示:

Firewall reloaded

如果遇到问题,请按照屏幕上的信息解决问题。

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

第7步 - 使用阻止列表进行筛选

Pi-hole附带一套由项目开发团队维护的默认阻止列表; 然而,单靠这些清单并不总是足够的。 理想情况下,您应该根据您的特定浏览习惯和您使用的应用程序来定制阻止列表。 您可以使用Pi-hole的管理Web界面管理阻止列表和更多内容。

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

屏幕上会显示一个屏幕,其中包含报告过去24小时 查询次数, 最近24小时查询次数, 最近24小时 查询百分比以及阻止 列表上数量的小部件。 您还可以看到过去24小时查询的图表,一个Pi-hole 状态指示器,以及仪表板登录屏幕和PayPal上的捐赠页面的导航选项。

Web界面仪表板未登录

点击登录进入完整的界面。 出现提示时,在第3步中输入您在最终Pi孔安装屏幕上收到的密码。

登录后,界面的总体布局将保持不变,但现在屏幕左侧将包含更多的菜单选项,以及“随时间变化的 查询类型”“随时间变化的目的地”的其他小部件。

Web界面仪表板已登录

在向Pi-hole添加额外的阻止列表之前,您应该首先更新项目维护人员的官方阻止列表数据,因为最近的更新可能包括您手动添加的部分或全部数据源。

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

在下一个屏幕上,单击屏幕中间的蓝色“ 更新列表”按钮以获取最新版本的官方阻止列表来源。

Web界面正在更新广告投放域列表

当Pi-hole执行更新时,它会向您显示它从中拉取列表数据的来源,源自上次更新以来是否已被修改,以及是否有任何数据已导入到您的安装中。 完成后,屏幕顶部的绿色栏会显示“ 成功!

Web界面更新广告投放域列表

随着官方阻止列表数据更新,您可以添加自己的附加阻止列表。

单击屏幕左侧导航菜单中的“设置” ,查看Pi孔的主要配置选项。

在下一个屏幕上,单击标记为“ Pi-Hole的块列表”的框中的+符号以查看当前的块列表数据。

Web界面添加其他阻止列表

默认情况下,Pi-hole使用以下阻止列表进行过滤:

要向安装添加新列表,请在窗格底部的输入字段中输入列表的源URL,然后按保存并更新按钮保存添加,然后重新运行“ 更新列表”功能。 这将自动拉入与新的块列表源相关的数据。

对于分类为可疑列表,广告列表以及跟踪和遥测列表的其他阻止列表,请参阅“大阻止列表收集”

现在您已经更新了默认阻止列表并学习了如何手动添加更多内容,让我们来看看使用黑名单和白名单的filtertering请求。

第8步 - 使用黑名单和白名单进行过滤

除了Pi孔用于过滤DNS请求的阻止列表之外,您还可以使用黑名单定位到单个域。 黑名单会自动丢弃去往和来自特定域的传出和传入请求。 这对于需要阻止包含不适合工作的内容的域或者已知用于托管病毒和其他恶意软件的企业和其他组织来说尤其有用。

要将某个域列入黑名单,请在屏幕左侧的主导航栏中单击黑名单

在下一个屏幕上,您可以将精确通配符阻止添加到域。

Web界面黑名单屏幕

确切阻止的情况下,只有与您在添加域输入字段中输入的值完全匹配的才会被阻止。 换句话说,如果在输入字段中输入example.com ,那么向example.com发送的请求将被阻止,但是从www.example.com发出的请求不会被发送。

使用通配符阻止时,您输入的域和任何相关的子域都将被阻止。 在这种情况下,这意味着example.comwww.example.com都将被阻止。

通过在添加域名输入字段中输入pi-hole.net测试黑名单功能,然后单击添加(确切)按钮。 现在, pi-hole.net列在黑名单屏幕上的精确屏蔽下。

Web界面黑名单pi-hole.net

任何向pi-hole.net提出的请求现在都将被Pi-hole的黑名单过滤器阻止。 尝试浏览您的网页浏览器https://pi-hole.net 尽管错误消息因浏览器而异,但您将不能再访问此地址。

要从完全阻止中删除pi-hole.net ,请单击域右侧的白色垃圾桶图标的红色按钮。

在频谱的另一端,白名单告诉Pi-hole总是允许来自特定域的所有请求通过其过滤器。 如果合法域名最终位于您正在使用的阻止列表中,或者您希望允许来自包含基于广告和非广告内容的域的流量,则白名单可能非常有用。

要将网域列入白名单,请点击屏幕左侧主导航栏中的白名单

在下一个屏幕上,您可以添加要列入白名单的新域,并查看哪些域已被列入白名单。

Web界面默认白名单屏幕

尽管您自己还没有将任何域名列入白名单,但是默认情况下,Pi-hole会将用于更新阻止列表的域列入白名单。 这是为了防止一个块列表阻塞另一个块列表。

另外, 请注意注意 ,说明您不能将通配符阻止的域的子域列入白名单。 这意味着,如果您已在example.com上拥有通配符,则将www.example.com列入白名单仍然不会让您访问该子域。 为了将example.com列入黑名单,而将www.example.com列入白名单,则需要将确切的代码块应用于example.com

要将域列入白名单,请在添加域输入字段中输入域,然后按添加按钮。 Pi孔会短暂地闪烁一条消息,说: 添加到白名单... ,然后是第二条消息,说: 成功! 该列表将刷新 这两条消息都将消失,列入白名单的域名将包含您刚输入的域名。

要从白名单中删除域,请单击红色按钮,白色垃圾桶图标位于不再需要列入白名单的域右侧。

最后,要测试您的安装的黑名单和白名单功能,请参阅Pi-hole的官方页面列表, 以测试您的安装程序的广告拦截性能

结论

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

要了解运行Pi-hole的另一种方式,请参阅将Pi-hole放入Docker容器的此项目

或者,为了进一步增强您的网络安全性,请了解如何在您当前的Pi-hole安装上启用DNSCrypt ,以创建一个私人安全的Intranet

有关一般信息和其他问题,请访问官方的Pi-hole论坛


分享按钮