如何在 kubernetes 上部署 pihole 和wireguard(DNS over HTTPS)
在本教程中,我们将部署一个带有 pihole 的 DNS 广告拦截器,使用递归 DNS 作为上游服务器,可通过wireguard vpn 在 LAN 网络和互联网中访问。我们使用K3S作为 kubernetes 提供程序。 假设 要遵循本教程,您需要: 一台运行任何 linux 发行版的计算机(在本教程中,我使用的是 debian buster) 这台计算机需要至少 1 Gb 的内存和 2 个内核
在本教程中,我们将部署一个带有 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
进入全屏模式 退出全屏模式
测试非绑定安装
带有 DNS over HTTP(S) 和 cloudflare DNS 服务器的 Pihole
此配置通过 https 将 DNS 查询转发到 cloudflare dns 服务器,即。所有查询都被加密,因为它们使用 TLS 执行与 cloudflare 的连接。您的 ISP 不知道您正在提出什么 DNS 请求。
要应用此配置,请使用以下命令
$ kubectl apply -f k8s/03-pihole-DoH-cloudflare.yaml
进入全屏模式 退出全屏模式
测试孔安装
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的日志以获取每个对等方的二维码,如下图所示
您还可以为位于/var/lib/wireguard/config/peer<N>/peer<N>.conf
的每个对等点复制配置文件
Extra(Pihole UI 的入口配置)
此步骤描述如何使用Traefik
Ingress 从 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/8
、192.168.10.0/24
(替换您的本地网络CIDR)。
如果您到目前为止一直在学习本教程,您将在您的 Kubernetes 集群上看到以下资源
Pihole 管理员用户界面可通过互联网通过FQDN
访问
更多推荐
所有评论(0)