在本教程中,我们将部署一个带有 pihole 的 DNS 广告拦截器,使用递归 DNS 作为上游服务器,可通过wireguard vpn 在 LAN 网络和互联网中访问。我们使用K3S作为 kubernetes 提供程序。

假设

要遵循本教程,您需要:

  • 一台运行任何 linux 发行版的计算机(在本教程中,我使用的是 debian buster)

  • 这台计算机需要至少 1 Gb 的内存和 2 个内核。

  • 这台电脑需要有一个静态IP地址(在我的情况下是192.168.10.10,局域网:192.168.10.1/24)

  • 将防火墙配置为接受以下端口的入站连接:

  • 53/tcp

  • 53/udp

  • 80/tcp

  • 443/tcp

  • 51820/udp

  • 为了从 Internet 连接,您需要在 ISP 的路由器中打开以下端口:

  • 80/tcp(Pihole Web 接口 HTTP)

  • 443/tcp(Pihole Web 界面 HTTPS)

  • 51820/tcp (Wireguard VPN)

  • 为了从互联网通过 Web UI 连接到 pihole,您需要有一个FQDN指向您的网络(在本教程中,我使用的是 google 域,如果您没有域,您可以使用duckdns)

  • 一个功能齐全的 K3S 集群(参见安装指南)。本教程应该适用于 K8S,但您需要部署一些额外的功能,例如 Traefik Ingress、Klipper 服务负载均衡器

  • 你需要有kubectl才能在K3S集群中进行操作

系统架构

在下图中,您可以看到我们要实现的图表。我们可以访问本地网络(192.168.10.1/24)中的 pihole 并通过 Internet 访问管理界面,最后我们可以通过 VPN 槽 Wireguard 访问集群资源或仅路由 dns 查询。

图

资源

所有清单都在这个GitHub 存储库中随意克隆和自定义

方法论

命名空间

我们需要配置的第一件事是namespace,我们需要创建 2 个命名空间:pihole用于 pihole、unbound 和 wireguard。cert-manager部署证书管理器以在 pihole UI 界面上启用 HTTPS。

$ kubectl apply -f k8s/01-namespaces.yaml

进入全屏模式 退出全屏模式

动态DNS

如果您没有分配静态 ip 地址,您可以使用动态 dns 指向您的 ISP 提供的公共 ip,在我的情况下,我使用的是 google 域,所以我可以使用 curl 更新子域。我创建了一个cronJob,每 5 分钟更新一次我的 ISP 分配的公共 IP。

$ kubectl apply -f k8s/02-dynamic-dns-google.yaml

进入全屏模式 退出全屏模式

创建目录

要存储配置文件,您需要在主节点中创建 2 个目录。

$ sudo mkdir -p /var/lib/{pihole,wireguard}

进入全屏模式 退出全屏模式

钻孔

Pihole(您可能已经知道)是一个 dns 添加拦截器。为了配置 Pihole 并使其在我们的 LAN 网络中可访问,我们需要在 53/tcp-udp 中配置一个绑定到本地主机的LoadBalancer服务。 Web UI 将可以通过 Ingress 控制器访问(如果您不想这样做,只需在pihole-ui-svc中使用NodePort服务)

此清单带有三种不同的配置:

  • 带有上游服务器的 Pihole

  • 未绑定的 Pihole

  • 带有 DNS over HTTP(S) 和 cloudflare DNS 服务器的 Pihole

常见配置:

  • 持久卷类型hostPath(/var/lib/pihole)

  • 持久卷声明

  • 配置图(时区、管理员电子邮件和上游 dns)

  • 密码(Web 密码)

  • Deployment

  • 集群 IP 服务(Pihole UI、Pihole DNS)

  • LoadBalancer服务(Pihole DNS 绑定到主机)

你需要配置:

  • 时区 (pihole-configmap)

  • 管理员电子邮件 (pihole-configmap)

  • 网络密码(pihole-secret)

带上游服务器的 Pihole

此配置将 dns 查询转发到上游服务器,例如 cloudflare dns1.1.1.1和 google dns8.8.8.8,没有加密。

要应用此配置,请使用以下命令

$ kubectl apply -f k8s/03-pihole-upstream-dns.yaml

进入全屏模式 退出全屏模式

未绑定的孔

Unbound 是一个验证、递归、缓存的 DNS 解析器。为了解决对根域 (.com) 的 dns 查询未绑定查询,然后查询到子域 (example.com) 并继续执行直到找到所需域 (pihole.example.com)。对于避免在流行的 dns 服务器(如 google)中进行某种类型的跟踪非常有用。在本教程中,我们使用此图像mvance/unbound,它预先配置为用作递归 dns。

要应用此配置,请使用以下命令

$ kubectl apply -f k8s/03-pihole-unbound.yaml

进入全屏模式 退出全屏模式

测试非绑定安装

unbound-dig-example

带有 DNS over HTTP(S) 和 cloudflare DNS 服务器的 Pihole

此配置通过 https 将 DNS 查询转发到 cloudflare dns 服务器,即。所有查询都被加密,因为它们使用 TLS 执行与 cloudflare 的连接。您的 ISP 不知道您正在提出什么 DNS 请求。

要应用此配置,请使用以下命令

$ kubectl apply -f k8s/03-pihole-DoH-cloudflare.yaml

进入全屏模式 退出全屏模式

测试孔安装

pihole-dig-test

WireGuard

WireGuard 是一个在内核级别工作的现代 VPN 服务器。在本教程中,我们使用 vpn 从 Internet 访问 LAN 资源,或者只是加密从 Internet 到我们的 pihole 安装的 dns 查询。

此清单附带:

  • 持久卷类型hostPath(/var/lib/wireguard)

  • 持久卷声明

  • 配置映射(时区、服务器 url、对等点数量等)

  • 护线器StatefulSet

  • LoadBalancer服务(Wireguard监听端口51820/udp)

你需要配置:

  • 时区 (wireguard-configmap)

  • 服务器 URL (wireguard-configmap)

  • 对等点数(wireguard-configmap)

$ kubectl apply -f k8s/04-wireguard.yaml

进入全屏模式 退出全屏模式

Wireguard 客户端配置

您可以查看wireguard pod的日志以获取每个对等方的二维码,如下图所示

wg-qr

您还可以为位于/var/lib/wireguard/config/peer<N>/peer<N>.conf的每个对等点复制配置文件

Extra(Pihole UI 的入口配置)

此步骤描述如何使用TraefikIngress 从 InternetHTTP/HTTPS使 Pihole Web 用户界面可用。如果你不想这样,只需在pihole-ui-svc中使用NodePort服务。

部署证书管理器

我们需要部署一个证书管理器来为 HTTPS 提供 TLS 证书。

$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml

进入全屏模式 退出全屏模式

部署集群发行者(让我们加密)

此清单部署了一个指向 Let's encrypt 的集群颁发者。您需要配置电子邮件以获取通知。

$ kubectl apply -f k8s/05-cluster-issuer-letsencrypt.yaml

进入全屏模式 退出全屏模式

入口

此清单带有您的 pihole 主机的域。您需要配置之前配置的子域。

$ kubectl apply -f k8s/06-ingress.yaml

进入全屏模式 退出全屏模式

使用方法

您可以更改 LANDNS服务器以指向您的 pihole 安装。如果您在默认情况下使用 VPN,您将通过 Wireguard 路由所有流量,包括您的 dns 查询。如果您只想通过wireguard 路由您的dns 查询,您应该只在AllowedIPS中路由以下路由:10.0.0.0/8192.168.10.0/24(替换您的本地网络CIDR)。

如果您到目前为止一直在学习本教程,您将在您的 Kubernetes 集群上看到以下资源

完整安装

Pihole 管理员用户界面可通过互联网通过FQDN访问

pihole-ui

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐