遵循 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
正如所建议的,这个问题是从这里提出的网络工程.stackexchange
答案1
wg(8)
记录它确实接受主机名,这意味着它将解析它们,包括使用 DNS(这是默认设置中的标准):
- 端点 — 端点 IP或主机名,后跟冒号,然后是端口号。[...]
的确代码用途getaddrinfo(3)
:
ret = getaddrinfo(begin, end, &hints, &resolved);
问题是因为该命令(wg
但会发生相同的情况wg-quick
)是在没有可用网络的环境中运行的:一个全新的容器,没有任何接口提供连接,因此依赖 DNS 的解析尝试只能在此步骤失败。
由于wg
(与 不同wg-quick
)不会触及地址或路由,而只会触及 WireGuard 属性,因此只需改变操作顺序:在 DNS 解析起作用的主机命名空间上配置接口的 WireGuard 属性,然后将其移动到目标命名空间,最后在那里完成其配置。这变成:
# ip netns add container
# ip link add wg0 type wireguard
# wg setconf wg0 /etc/wireguard/wg0.conf # altered, was #5
# ip link set wg0 netns container # was #3
# ip -n container addr add 10.14.0.2/16 dev wg0 # was #4
# ip -n container link set wg0 up
# ip -n container route add default dev wg0
这将wg
在主机而不是容器上运行,但最终结果是相同的:容器将具有单一wg0
接口,并且该接口将仅在主机上有一个监听端口。