== Installation == # make install == Usage == wg-config is a very simple utility for adding and configuring WireGuard interfaces using ip(8) and wg(8). Usage: wg-config [ add | del ] INTERFACE [arguments...] wg-config add INTERFACE --config=CONFIG_FILE [--address=ADDRESS/CIDR...] [--route=ROUTE/CIDR...] [--no-auto-route-from-allowed-ips] [--env-file=ENV_FILE] The add subcommand adds a new WireGuard interface, INTERFACE, replacing any existing interfaces of the same name. The --config argument is required, and its argument is passed to wg(8)'s setconf subcommand. The --address argument(s) is recommended for this utility to be useful. The --route argument is purely optional, as by default this utility will automatically add routes implied by --address and as implied by the allowed-ip entries inside the --config file. To disable this automatic route adding, you may use the option entitled --no-auto-route-from-allowed-ips. wg-config del INTERFACE [--config=CONFIG_FILE_TO_SAVE] [--env-file=ENV_FILE] The del subcommand removes an existing WireGuard interface. If the optional --config is specified, then the existing configuration is written out to the file specified, via wg(8)'s showconf subcommand. Both `add' and del' take the --env-file=ENV_FILE option. If specified, the contents of ENV_FILE are imported into wg-config. This can be used to set variables in a file, instead of needing to pass them on the command line. The following table shows the relation between the command line options described above, and variables that may be declared in ENV_FILE: --address=A, --address=B, --address=C ADDRESSES=( "A" "B" "C" ) --route=A, --route=B, --route=C ADDITIONAL_ROUTES=( "A" "B" "C" ) --config-file=F CONFIG_FILE="F" echo C > /tmp/F, --config-file=/tmp/F CONFIG_FILE_CONTENTS="C" --no-auto-route-from-allowed-ips AUTO_ROUTE=0 Additionally, ENV_FILE may define the bash functions pre_add, post_add, pre_del, and post_del, which will be called at their respective times. == Helper Tool == tungate is a separate utility, developed originally not explicitly for WireGuard, which acts as a poor man's way of ensuring 0/1 and 128/1 default route overrides still work with an endpoint going over the original default route. It's quite handy, and wg-config makes use of it for dealing with 0.0.0.0/0 routes. At the moment it only supports IPv4, but adding IPv6 should be pretty easy. == Example == /etc/wireguard/wg-server.conf: [Interface] PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk= ListenPort = 41414 [Peer] PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= AllowedIPs = 10.192.122.3/32, 10.192.124.1/24 [Peer] PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0= AllowedIPs = 10.192.122.4/32, 192.168.0.0/16 [Peer] PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA= AllowedIPs = 10.10.10.230/32 /etc/wireguard/wg-server.env: CONFIG_FILE="$(dirname "${BASH_SOURCE[0]}")/wg-server.conf" ADDRESSES=( 10.192.122.1/34 10.10.0.1/16 ) Run at startup: # wg-config add wgserver0 --env-file=/etc/wireguard/wg-server.env Run at shutdown: # wg-config del wgserver0 --env-file=/etc/wireguard/wg-server.env == Advanced Example == /etc/wireguard/wg-vpn-gateway.conf: [Interface] PrivateKey = 6JiA3fa+NG+x5m6aq7+lxlVaVqVf1mxK6/pDOZdNuXc= [Peer] PublicKey = 6NagfTu+s8+TkEKpxX7pNjJuTf4zYtoJme7iQFYIw0A= AllowedIPs = 0.0.0.0/0 Endpoint = demo.wireguard.io:29912 /etc/wireguard/wg-vpn-gateway.env: [[ $SUBCOMMAND == add ]] && CONFIG_FILE="$(dirname "${BASH_SOURCE[0]}")/demo-vpn.conf" || true ADDRESSES=( 10.200.100.2/32 ) post_add() { printf 'nameserver 10.200.100.1' | cmd resolvconf -a "$INTERFACE" -m 0 } post_del() { cmd resolvconf -d "$INTERFACE" } Run to flip on the VPN: # wg-config add wgvpn0 --env-file=/etc/wireguard/wg-vpn-gateway.env The config file is not overwritten on shutdown, due to the conditional in the env file: # wg-config del wgvpn0 --env-file=/etc/wireguard/wg-vpn-gateway.env == Single File Advanced Example == /etc/wireguard/wg-vpn-gateway.env: CONFIG_FILE_CONTENTS=" [Interface] PrivateKey = 6JiA3fa+NG+x5m6aq7+lxlVaVqVf1mxK6/pDOZdNuXc= [Peer] PublicKey = 6NagfTu+s8+TkEKpxX7pNjJuTf4zYtoJme7iQFYIw0A= AllowedIPs = 0.0.0.0/0 Endpoint = demo.wireguard.io:29912 " ADDRESSES=( 10.200.100.2/32 ) post_add() { printf 'nameserver 10.200.100.1' | cmd resolvconf -a "$INTERFACE" -m 0 } post_del() { cmd resolvconf -d "$INTERFACE" } Run to flip on the VPN: # wg-config add wgvpn0 --env-file=/etc/wireguard/wg-vpn-gateway.env Run to flip off the VPN: # wg-config del wgvpn0 --env-file=/etc/wireguard/wg-vpn-gateway.env