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 配置
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
(可选,默认为从不)以及 ipv4
和 ipv6
范围(可选,默认为无)的节点列表。
{
"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 应该可以在提供 wg
和 curl
命令的所有操作系统上运行。
基于 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