跳到主要内容

搭建一个内网 DNS 服务

结合 WireGuard 搭建一个内网 DNS 服务

配置一个私有 DNS 服务器来解析内部服务是一个常见的需求,尤其是在使用 WireGuard VPN 创建的内部网络中。以下是一些基本的步骤来帮助你配置一个私有 DNS 服务器:

1、安装 DNS 服务器软件

你可以选择多种 DNS 服务器软件,常见的有 BIND, Unbound, dnsmasq 等。以 dnsmasq 为例,你可以在 Ubuntu/Debian 系统上使用以下命令安装:

sudo apt-get update
sudo apt-get install dnsmasq

2、配置 DNS 服务器

安装完成后,你需要配置 dnsmasq。配置文件通常位于 /etc/dnsmasq.conf。以下是一些基本的配置示例:

打开配置文件:

sudo nano /etc/dnsmasq.conf

添加以下内容:

# 监听的网络接口,确保这是你 WireGuard VPN 使用的接口
interface=wg0

# 指定上游 DNS 服务器
server=8.8.8.8
server=8.8.4.4

# 配置本地域解析
address=/myinternal-service.local/10.0.0.2

上面的配置设置 dnsmasq 仅监听在 wg0 接口上的 DNS 查询,所有其他查询将被忽略。server 指令设置了上游 DNS 服务器,用于解析不在本地定义的域名。address 指令设置了一个本地域解析,所有查询 myinternal-service.local 的请求都将解析到 10.0.0.2

3、重启 DNS 服务器

配置完成后,你需要重启 dnsmasq 以应用更改:

sudo systemctl restart dnsmasq

4、在 WireGuard 配置中设置 DNS

确保你在 WireGuard 客户端的配置文件中设置了 DNS 服务器地址,指向你的 dnsmasq 服务器的地址。例如:

[Interface]
PrivateKey = <客户端私钥>
Address = 10.0.0.3/32
DNS = 10.0.0.1 # 这应该是你的 dnsmasq 服务器的内网 IP 地址

[Peer]
PublicKey = <服务器公钥>
Endpoint = <服务器地址>:<端口>
AllowedIPs = 0.0.0.0/0

5、测试 DNS 解析

最后,你可以在连接到 WireGuard VPN 后测试 DNS 解析:

nslookup myinternal-service.local

你应该看到 myinternal-service.local 被解析到 10.0.0.2

这样,你就配置好了一个基本的私有 DNS 服务器来服务你的 WireGuard VPN 内部网络。当然,dnsmasq 和其他 DNS 服务器提供了大量的高级配置选项,你可以根据需要进行调整和优化。

暴露 Kubernetes API 服务器

暴露 Kubernetes API 服务器的端口(通常是6443)到外部网络并将其关联到一个内网域名,需要谨慎处理,因为这可能会暴露你的集群管理接口,增加安全风险。一般来说,推荐使用 VPN 或其他安全通道来访问 Kubernetes API 服务器。

如果你确实需要将 Kubernetes API 服务器的端口暴露到外部并关联到一个内网域名,你可以按照以下步骤进行:

1、获取 Kubernetes API 服务器的地址和端口

Kubernetes API 服务器通常监听在6443端口。你可以通过查看 kube-apiserver Pod 的命令行参数来确认这一点:

kubectl get pods -n kube-system -l component=kube-apiserver -o yaml | grep -o '--secure-port=[^ ]*'

2、在你的内网域名服务器上创建一个DNS记录

在你的内网DNS服务器上为 Kubernetes API 服务器创建一个 A 或 CNAME 记录。具体操作取决于你使用的 DNS 服务器类型。

例如,如果你的内网域名是 internal.example.com,你可以创建一个 A 记录指向 Kubernetes 主节点的内网 IP 地址:

api-server.internal.example.com. IN A 192.168.1.100

这里的 192.168.1.100 是 Kubernetes 主节点的内网 IP 地址。

3、配置网络以允许流量

你可能需要在防火墙上打开6443端口,以便允许流量进入 Kubernetes API 服务器。这取决于你的网络配置和安全策略。

例如,如果你使用的是 iptables,你可以使用以下命令:

sudo iptables -A INPUT -p tcp --dport 6443 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 6443 -j ACCEPT

请确保这样做不会违反你的安全策略,并且只在你确信这是安全的情况下进行操作。

4、测试访问

在完成上述配置后,你应该能够使用内网域名访问 Kubernetes API 服务器:

curl https://api-server.internal.example.com:6443

请记住,你可能需要配置证书或使用 --insecure 标志来允许使用自签名证书。

再次强调,直接暴露 Kubernetes API 服务器并将其关联到域名涉及到显著的安全风险。确保你了解这些风险,并采取适当的安全措施来保护你的集群。

配置私有 CA 证书

首先是给自己搞个自签 CA 证书,这个证书是用来给你的域名签发证书的,这个证书是自签名的,所以你需要自己信任这个证书,这个证书的作用是用来给你的域名签发证书的,这个证书是自签名的,所以你需要自己信任这个证书。 可以的,下面是一个创建自签名证书颁发机构(CA)并用它来签发域名证书的步骤。注意这个例子是基于Linux操作系统和OpenSSL工具的。

sudo apt-get update
sudo apt-get install openssl

1、创建一个私钥:

openssl genpkey -algorithm RSA -out ca.key

2、 创建一个自签名的CA证书:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

在这个过程中,系统会提示你输入证书的相关信息,如国家、省份、城市、组织名等。

使用CA证书签发域名证书

1、为你的域名生成一个私钥:

openssl genpkey -algorithm RSA -out domain.key

2、创建一个证书签名请求(CSR):

openssl req -new -key domain.key -out domain.csr

同样,系统会提示你输入证书的相关信息。在这个步骤中,最重要的是你需要正确输入你的域名作为 "Common Name"。

3、使用CA证书来签发域名证书:

openssl x509 -req -in domain.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out domain.crt -days 365 -sha256

至此,你就已经使用自签名的CA证书成功签发了一个域名证书,证书文件是 domain.crt,对应的私钥文件是 domain.key

然后让客户端信任上面的 ca.crt 即可。