4 个版本 (2 个重大更改)

0.3.0 2020 年 2 月 5 日
0.2.1 2019 年 9 月 30 日
0.1.2 2019 年 5 月 18 日
0.1.1 2019 年 4 月 3 日

#342 in 配置

LGPL-3.0-or-later

78KB
2K SLoC

wgconfd

wgconfd 是一个 WireGuard 的配置管理器。

概述

wgconfd INTERFACE CONFIG 启动一个进程来管理 WireGuard 接口的某些对等点。它添加/覆盖其已知的对等点,并在它们从其视图中消失时删除对等点。它保留它从未见过的任何对等点。

对等点在源中定义。源是一个通过 curl 理解的协议提供的 JSON 文件。

具有已知 IP 地址的“服务器”对等点直接与其他服务器通信。而“远程战士”对等点通过其基础服务器与每个人通信。

配置

主要配置文件使用 toml 编写。

refresh_sec = 1200 # default
min_keepalive = 10 # default
max_keepalive = 0 # default, means "never"

[[source]]
name = "remote1"
url = "https://wg.example.org/peers.json"
ipv4 = [ "172.16.0.0/12", "192.168.5.0/24" ]
ipv6 = [ "2001:db8::/32" ]

[[source]]
name = "remote2"
url = "https://wg.example.com/peers.json"
ipv4 = [ "172.16.0.0/12", "192.168.6.0/24" ]
ipv6 = [ "2001:db8:1234:/48" ]
psk = "/path/to/psk/file"
allow_road_warriors = false

[[source]]
name = "local-user1"
url = "file:///etc/wireguard/example/user1.json"
ipv4 = [ "172.16.5.54/32" ]

[[source]]
name = "local-user2"
url = "file:///etc/wireguard/example/user2.json"
ipv6 = [ "2001:db8::5/128" ]

如果源 URL 中的所有 IP 地址范围都不完全包含在配置中,则丢弃它们 - 如果源声明 0.0.0.0/0 但配置只允许 10.0.0.0/8,则不允许任何操作。

预共享密钥应用于源中定义的所有对等点。如果单个对等点在多个源中定义,则从定义它的第一个源获取端点和预共享密钥。

可以为特定公钥覆盖一些选项,也可以限制定义该对等点的源。

[peer."yIOdSFrFQ1WPYS6IUWCsRjzw2Iqq0HMcyVVEXu5z+nM="]
source = "remote2"
endpoint = "[2001:db8::6]:10656"
psk = "QJmzt2PpKx8g98qrOtsNR4tB1bik+fMSabNNXCC5OUU="
keepalive = 20

替代配置

有一个用于与其他软件集成的替代配置机制:wgconfd --cmdline INTERFACE ARGS...

参数是一系列全局选项和源

  • min_keepaliveSEC
  • max_keepaliveSEC
  • refresh_secSEC
  • sourceNAME URL [pskPATH] [ipv4NET,NET,...] [ipv6NET,NET,...] [required] [allow_road_warriors|deny_road_warriors]
  • peerPUBKEY [endpointIP:PORT] [pskPATH] [keepaliveSEC] [sourceNAME]

源格式

该源描述了一个包含其相关 endpoint 地址(必需)、keepalive(可选,默认为从不)以及 ipv4ipv6 范围(可选,默认为无)的节点列表。

{
	"servers": [{
		"public_key": "hw0U7vI2rhjG9mQ34CUKO6M4dIF9e8ofKj5N6cAPtwY=",
		"endpoint": "198.51.100.66:656",
		"ipv4": [ "10.1.2.0/24" ]
	}, {
		"public_key": "nlFVtJrOwR2sVJji6NQjXnv//GVUK5W9T7ftkSnYPA8=",
		"endpoint": "[2002:cb00:71af::4]:656",
		"ipv4": [ "10.1.3.0/24" ]
	}],
}

出差人员

wgconfd 还支持名为“出差人员”的漫游节点。

{
	...
	"road_warriors": [{
		"public_key": "YJ0Ye/Z/f+kzMu5au8JL/OP+cMs0eRsJPSQ9FZIa7Sk=",
		"base": "hw0U7vI2rhjG9mQ34CUKO6M4dIF9e8ofKj5N6cAPtwY=",
		"ipv4": [ "10.2.5.44/32" ]
	}, ...]
}

出差人员通常不运行 wgconfd。它预期只能与它的基本服务器节点通信。

在基本节点上,为出差人员创建了一个 WireGuard 节点。在其他所有节点上,出差人员的允许 IP 地址范围添加到其基本设置中。

一个源地的出差人员可以使用另一个源地的服务器,但允许的 IP 总是会与包含出差人员定义的源进行比较。

[[source]] 部分中,可以使用 allow_road_warriors 选项来拒绝成为来自某些源地的出差人员的基本节点。

配置更新

根对象可以包含一个带有 "next" 时间戳和另一个配置的 "update_at" 字段。

{
	"servers": [{
		"public_key": "hw0U7vI2rhjG9mQ34CUKO6M4dIF9e8ofKj5N6cAPtwY=",
		"endpoint": "198.51.100.66:656",
		"ipv4": [ "10.1.2.0/24" ]
	}, {
		"public_key": "nlFVtJrOwR2sVJji6NQjXnv//GVUK5W9T7ftkSnYPA8=",
		"endpoint": "[2002:cb00:71af::4]:656",
		"ipv4": [ "10.1.3.0/24" ]
	}],
	"road_warriors": [{
		"public_key": "YJ0Ye/Z/f+kzMu5au8JL/OP+cMs0eRsJPSQ9FZIa7Sk=",
		"base": "hw0U7vI2rhjG9mQ34CUKO6M4dIF9e8ofKj5N6cAPtwY=",
		"ipv4": [ "10.2.5.44/32" ]
	}],
	"next": {
		"update_at": "2033-05-18T03:33:20Z",
		"servers": [{
			"public_key": "hw0U7vI2rhjG9mQ34CUKO6M4dIF9e8ofKj5N6cAPtwY=",
			"endpoint": "198.51.100.66:656",
			"ipv4": [ "10.1.2.0/24" ]
		}, {
			"public_key": "nlFVtJrOwR2sVJji6NQjXnv//GVUK5W9T7ftkSnYPA8=",
			"endpoint": "[2002:cb00:71af::4]:656",
			"ipv4": [ "10.1.3.0/25" ]
		}, {
			"public_key": "JjSETJ9ACv0sTTEtBE2qp9q4vbeq1i5suwWaJCuncFo=",
			"endpoint": "[2001:db8:ddcc:bbaa::5]:565",
			"ipv4": [ "10.1.3.128/25" ]
		}],
		"road_warriors": [{
			"public_key": "YJ0Ye/Z/f+kzMu5au8JL/OP+cMs0eRsJPSQ9FZIa7Sk=",
			"base": "nlFVtJrOwR2sVJji6NQjXnv//GVUK5W9T7ftkSnYPA8=",
			"ipv4": [ "10.2.5.44/32" ]
		}]
	}
}

使用该源的所有 wgconfd 实例将在指定的系统时钟时间切换到新的配置。请注意,常规更新机制仍然适用 - 要取消更新,请尽早移除 "next" 字段,以便所有机器在 "update_at" 之前刷新源。

操作系统支持

wgconfd 应该可以在提供 wgcurl 命令的所有操作系统上运行。

基于 systemd 的 Linux 发行版

示例单元文件位于 dist/systemd 目录中

  • wgconfd@IFNAME.service 在网络接口 IFNAME 上运行 wgconfd,使用 /etc/wireguard/IFNAME.toml 中的配置。服务预期该接口已创建且已设置私钥。
  • wgconfd-state@IFNAME.service 应在网络接口失去其配置时重启,例如 wg-quick 重启时。

Fedora 源代码包可在 https://git.venev.name/hristo/fedora/rust-wgconfd/ 获取。

OpenWRT

dist/netifd 中有一个 OpenWRT netifd 协议脚本。全局选项在 /etc/config/network 中的接口部分设置。源和节点在文件中的相同部分的 wgconfd_source_IFNAME/wgconfd_peer_IFNAME 部分中定义

config interface 'wg0'
	option proto 'wgconfd'
	option listen_port '656'
	option private_key 'uAoL9qoAFbAPg46NxIQJ36Zc5gJaYDBleL2iGEa8SEA='
	list ip6addr '2002:db8:1:1/48'
	list ipaddr '10.4.0.1/10'

config wgconfd_source_wg0
	option name 'source1'
	option url 'https://wg.example.org/peers.json'
	list ipv4 '10.5.0.0/16'
	list ip6addr '2002:db8:2:3/48'

config wgconfd_source_wg0
	option name 'source2'
	option url 'https://wg.example.com/peers.json'
	list ipv4 '10.6.0.0/16'

config wgconfd_peer_wg0
	option public_key 'dJyitquxsM3gf8a8yVDko6Se0sKrXi+glUTQN4mPZCo='
	option source 'source2'
	option psk '/etc/wgconfd-psk/example.com-machine1'

依赖关系

~2–3MB
~58K SLoC