按照普通容器化的wireguard文档,它可以使用与此配置文件类似的内容:
# /etc/wireguard/wg0.conf
#
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
[Peer]
PublicKey = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 11.111.111.111:51820
# Problem, using the following Endpoint won't work
# and the DNS entry is not allowed with wg setconf
# Endpoint = my.vpn.location.com:51820
问题是端点必须是一个 IP,一旦它是域,wireguard 就无法在link set gw0 up
.
由于在普通容器化中wg setconf
使用接口部分中不允许使用 DNS 和地址。
wg-quick
但以下内容可以使用
# /etc/wireguard/wg0.conf
#
[Interface]
PrivateKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
Address = 10.14.0.2/16
DNS = 123.456.789.01
[Peer]
PublicKey = BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = my.vpn.location.com:51820
wg-quick
能够解析my.vpn.location.com
,但是如何告诉wg setconfg
如何解析my.vpn.location.com
而不是必须对端点的 ip 进行硬编码?
注意:这是我用来设置它的命令,wg setconf
其中端点具有 ip,但不适用于域。
# ip netns add container
# ip link add wg0 type wireguard
# ip link set wg0 netns container
# ip -n container addr add 10.14.0.2/16 dev wg0
# ip netns exec container wg setconf wg0 /etc/wireguard/wg0.conf
# ip -n container link set wg0 up
# ip -n container route add default dev wg0
wg(8)
它接受主机名的文档,这意味着它将解析它们,包括使用 DNS(这是默认设置中的标准):事实上,代码使用
getaddrinfo(3)
:问题是因为该命令(
wg
但也会发生同样的情况wg-quick
)是在没有可用网络的环境中运行的:一个全新的容器,还没有提供连接的接口,因此依赖 DNS 的解析尝试只能在这一步失败。由于
wg
(与wg-quick
)相反,不会触及地址或路由,而只会触及 WireGuard 属性,因此只需更改操作顺序:在 DNS 解析工作的主机命名空间上配置接口的 WireGuard 属性,然后将其移动到目标命名空间,最后完成它的配置在那里。这变成:这将
wg
在主机而不是容器上运行,但最终结果是相同的:容器将具有单个wg0
接口,并且该接口仅在主机上有一个侦听端口。