如何让wireguard解析谷歌计算引擎上的内部dns名称

Posted

技术标签:

【中文标题】如何让wireguard解析谷歌计算引擎上的内部dns名称【英文标题】:How do I get wireguard to resolve internal dns names on google compute engine 【发布时间】:2021-05-01 11:20:46 【问题描述】:

我在 Google Cloud Platform 上有一个内部 DNS 区域,其 A 记录为 dev.internal,它指向 VM 的 IP,例如 10.0.0.17。当我通过 ssh 在 GCP VM 节点/服务器上时,我可以 ping dev.internal 并解析为 10.0.0.17。

我现在用我的笔记本电脑设置了一个wireguard peer。我的服务器端设置是:

[Interface]
Address = 192.168.69.1/24
ListenPort = 51820
PrivateKey = SERVER_KEY
PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens4 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o wg0  -j ACCEPT; iptables -t nat -D POSTROUTING  -o ens4 -j MASQUERADE

[Peer]
PublicKey = CLIENT_KEY
AllowedIPs = 192.168.69.2
PersistentKeepalive = 25

我的客户端(笔记本电脑 - 我使用的是 Ubuntu 20.01)设置是

[Interface]
Address = 192.168.69.2/32
PrivateKey = CLIENT_PRIVATE_KEY
DNS = 192.168.69.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = 35.XX.XX.XX:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21

我确认客户端和服务器对等点已启动,我从客户端转到 ifconfig.co 或 whatsmyip,它显示了 35.XX.XX.XX(服务器)ip。

在客户端,我现在想通过 VM 上的 dev.internal 区域解析来访问 10.0.0.17 IP。

ping dev.internal
ping: dev.internal: Name or service not known

我需要在客户端或服务器上设置什么,以便客户端能够解析内部区域指向的 IP?

在 Google Cloud 上,internal resolver 位于 169.254.169.254。

我已经在客户端中使用和不使用DNS = 192.168.69.1 进行了尝试,得到了相同的结果。

【问题讨论】:

路由169.254.169.254/32 是否从您的有线对等方共享? GCP 元数据服务器169.254.169.254 需要可从您当前的 GCP VPC 内部访问,如果您使用不同的 DNS 服务器,那么 dev.internal 将无法解决(直到手动添加到那里或直到您手动在 @ 中创建条目987654332@ 客户端上的文件) @Frank 不幸的是,正如 John 提到的,这是我遇到的主要问题,我无法让 VM 共享路由或访问元数据服务器。 @JohnHanley 那么这是否意味着我需要创建一个公共区域记录,例如dev.internal.mydomain.com 并将其附加到指向10.0.0.17. 的DNS/域(这样客户端可以解析)?这是否安全,因为访问该域的其他人也将被重定向到这个内部 IP(在他们的网络上)。还是您的意思是另一种方法? 【参考方案1】:

要通过 WireGuard *** 解析 VPC 内的主机名,需要创建 Google Cloud DNS 策略并在 WireGuard 中配置 VPC DNS 服务器 IP 地址。

第 1 步。创建入站 DNS 服务器策略

gcloud dns policies create NAME ^
    --description=DESCRIPTION ^
    --networks=VPC_NETWORK_LIST ^
    --enable-inbound-forwarding

应用该策略会在每个 VPC 子网中分配一个 DNS IP 地址。要查看这些地址:

gcloud compute addresses list ^
--project [PROJECT_ID] ^
--filter="purpose = \"DNS_RESOLVER\"" ^
--format="csv(address, region, subnetwork)"

记下您的实例所在或离您最近的区域的 IP 地址。

第 2 步。配置在 VPC 中运行的 Wireguard。

在下面的例子中:

192.168.9.x 是 WireGuard *** CIDR 10.138.x.x 是 VPC CIDR 10.0.0.x 是本地网络 CIDR。 ens4 是 Ubuntu 中的 VM 以太网适配器。 Centos 通常是 eth0。

VPC 中的 VM 实例需要启用 IP 转发(在创建实例时),并且必须将 WireGuard 配置为路由从 *** 接收到的数据包。

sysctl -w net.ipv4.ip_forward=1
iptables -D FORWARD -i wg0 -j ACCEPT
iptables -t nat -D POSTROUTING -o ens4 -j MASQUERADE

VPC 端:在 wg0.conf 中配置 WireGuard 转发数据包

[Interface]
PrivateKey = ...
ListenPort = 51820
Address = 192.168.9.1/24

[Peer]
PublicKey = ...
AllowedIPs = 192.168.9.2/32, 10.138.0.0/16
Endpoint = 34.45.56.67:51820
PersistentKeepalive = 30

远端: DNS 值来自gcloud compute addresses list。请注意为 AllowedIPs = 192.168.9.1/32, 10.138.0.0/16 指定的两个 CIDR。

[Interface]
PrivateKey = ...
ListenPort = 51820
Address = 192.168.9.2/24
DNS = 10.138.0.16

[Peer]
PublicKey = ...
AllowedIPs = 192.168.9.1/32, 10.138.0.0/16
Endpoint = 34.45.56.67:51820
PersistentKeepalive = 30

假设您在 VPC 中有一个名为“my-vm-1”的虚拟机,您现在可以ping my-vm-1 并且 VPC DNS 服务器将解析该地址。

注意:当 WireGuard 启动并运行时,所有 DNS 流量都将通过 *** 并由 Google Cloud DNS 服务器解析。当您停用 WireGuard 时,DNS 流量将流向默认解析器。

【讨论】:

我尝试了上述配置并让wireguard客户端和服务器握手并处理所有流量,客户端的IP在检查dnsleak等时是VM的IP。虽然DNS解析不起作用全部,我无法 ping VM cloud.google.com/dns/docs/…。 DNS 是否仅适用于互连和云 *** “本地客户端使用 Cloud *** 或 Cloud Interconnect 连接到 VPC 网络。” dig xxx.c.yyyy.internal @[dns-ip] connection timed out; no servers could be reached gcloud compute addresses list --filter=' purpose = "DNS_RESOLVER"' 报告什么? 所以更进一步,地址列表为我的地区提供了一个 IP 10.154.0.5,我按照上面的方法插入,它可以工作 dig tt.test @10.154.0.5 提供 A 记录 tt.test. 5 IN A 10.154.0.3,但我无法获得使用该 DNS 名称服务器的wireguard systemd-resolve --status 提供Link 8 (wg0-client) Current Scopes: none DefaultRoute setting: no LLMNR setting: yes MulticastDNS setting: no DNSOverTLS setting: no DNSSEC setting: no DNSSEC supported: no 重启后 systemd-resolve 出现在全局 Global LLMNR setting: no MulticastDNS setting: no DNSOverTLS setting: no DNSSEC setting: no DNSSEC supported: no Current DNS Server: 8.8.8.8 DNS Servers: 8.8.8.8 8.8.4.4 10.154.0.5 但没有指定名称服务器的 telnet 失败 telnet tt.test 22 telnet: could not resolve tt.test/22: Name or service not known

以上是关于如何让wireguard解析谷歌计算引擎上的内部dns名称的主要内容,如果未能解决你的问题,请参考以下文章

连接到谷歌计算引擎上的 postgres 服务器

wireguard 客户端未连接到互联网

如何让 Wireguard-Android make 文件在 Windows 上运行?

我可以让 Wireguard *** 对等方互相交谈吗?

使用cmd提示符搜索谷歌或其他搜索引擎上的单词

如何在谷歌应用引擎和计算引擎之间建立私有连接?