我们可以使用 base64 和 base32 命令来回转换编码格式,例如:
$ wg genkey | wg pubkey > pub.txt $ cat pub.txt O9rAAiO5qTejOEtFbsQhCl745ovoM9coTGiprFTaHUE= $ cat pub.txt | base64 -D | base32 HPNMAARDXGUTPIZYJNCW5RBBBJPPRZUL5AZ5OKCMNCU2YVG2DVAQ==== $ cat pub.txt | base64 -D | base32 | base32 -d | base64 O9rAAiO5qTejOEtFbsQhCl745ovoM9coTGiprFTaHUE=我们可以直接使用 base32 这种不区分大小写的公钥编码,来使其与 DNS 兼容。
编译插件CoreDNS 提供了,插件必须要实现 plugin.Handler 接口:
type Handler interface { ServeDNS(context.Context, dns.ResponseWriter, *dns.Msg) (int, error) Name() string }我自己已经写好了插件,通过 DNS-SD(DNS-based Service Discovery)语义来提供 WireGuard 的 Peer 信息,该插件名就叫 wgsd。自己编写的插件不属于官方内置插件,从 CoreDNS 官方下载页下载的可执行程序并不包括这两个插件,所以需要自己编译 CoreDNS。
编译 CoreDNS 并不复杂,在没有外部插件的情况下可以这么编译:
$ git clone https://github.com/coredns/coredns.git $ cd coredns $ make如果要加上 wgsd 插件,则在 make 前,要修改 plugin.cfg 文件,加入以下一行:
wgsd:github.com/jwhited/wgsd然后开始编译:
$ go generate $ go build查看编译好的二进制文件是否包含该插件:
$ ./coredns -plugins | grep wgsd dns.wgsd编译完成后,就可以在配置文件中启用 wgsd 插件了:
.:53 { wgsd <zone> <wg device> }可以来测试一下,配置文件如下:
$ cat Corefile .:53 { debug wgsd fuckcloudnative.io. wg0 }运行 CoreDNS:
$ ./coredns -conf Corefile .:53 CoreDNS-1.8.1 linux/amd64, go1.15,当前节点的 WireGuard 信息:
$ sudo wg show interface: wg0 listening port: 52022 peer: mvplwow3agnGM8G78+BiJ3tmlPf9gDtbJ2NdxqV44D8= endpoint: 3.3.3.3:8888 allowed ips: 10.0.0.2/32下面就是见证奇迹的时候,列出所有 Peer:
$ dig @127.0.0.1 _wireguard._udp.fuckcloudnative.io. PTR +noall +answer +additional ; <<>> DiG 9.10.6 <<>> @127.0.0.1 _wireguard._udp.fuckcloudnative.io. PTR +noall +answer +additional ; (1 server found) ;; global options: +cmd _wireguard._udp.fuckcloudnative.io. 0 IN PTR TL5GLQUMG5VATRRTYG57HYDCE55WNFHX7WADWWZHMNO4NJLY4A7Q====._wireguard._udp.fuckcloudnative.io.查询每个 Peer 的 IP 和端口:
$ dig @127.0.0.1 TL5GLQUMG5VATRRTYG57HYDCE55WNFHX7WADWWZHMNO4NJLY4A7Q====._wireguard._udp.fuckcloudnative.io. SRV +noall +answer +additional ; <<>> DiG 9.10.6 <<>> @127.0.0.1 TL5GLQUMG5VATRRTYG57HYDCE55WNFHX7WADWWZHMNO4NJLY4A7Q====._wireguard._udp.fuckcloudnative.io. SRV +noall +answer +additional ; (1 server found) ;; global options: +cmd tl5glqumg5vatrrtyg57hydce55wnfhx7wadwwzhmno4njly4a7q====._wireguard._udp.fuckcloudnative.io. 0 IN SRV 0 0 8888 TL5GLQUMG5VATRRTYG57HYDCE55WNFHX7WADWWZHMNO4NJLY4A7Q====.fuckcloudnative.io. TL5GLQUMG5VATRRTYG57HYDCE55WNFHX7WADWWZHMNO4NJLY4A7Q====.fuckcloudnative.io. 0 IN A 3.3.3.3