V předchozím článku jsme si vysvětlili principy tunelování provozu pomocí nástroje WireGuard. Poté jsme si vytvořili páry klíčů a nakonfigurovali jsme funkční VPN. To jsme udělali jednak manuálně, ale také jsme si ukázali standardní konfigurační soubor.
Stále jsme ale ve stavu, kdy je spouštění VPN vlastně manuální záležitostí, protože zbytek systému o něm nic neví. To může stačit, pokud chceme jednou za čas nahodit VPN pro nějaký jednorázový úkol. Pak si skutečně vystačíme s manuálně volanou utilitou wg-quick
.
Podpora WireGuardu se ale postupně zlepšuje a můžeme jej integrovat se systémovými správci síťových rozhraní. Ukážeme si použití s Network Managerem a poté se systemd-networkd.
Network Manager
Network Manager má integrovanou podporu WireGuardu od verze 1.16, která vyšla v březnu letošního roku. Podpora nevyžaduje žádnou instalaci modulu, jako je to u jiných VPN. Network Manager je démon ovládající rozhraní, který nabízí své konfigurační rozhraní pomocí D-Bus. Tato část je na WireGuard plně připravena a dovoluje konfigurovat vše potřebné.
Horší je to s utilitami, které rozhraní využívají. Ty jsou zatím s vývojem pozadu a textový konfigurátor ( nmtui
) i applet pro Gnome povýšeně přítomnost WireGuardu ignorují. Jednoduše dělají, že neexistuje. To nám ale vůbec nebrání v jeho nasazení, protože řádková utilita nmcli
s ním nemá problém.
Nejjednodušší je použít univerzální konfigurační soubor, který už máme vytvořený. Můžeme ho velmi jednoduše naimportovat:
# nmcli connection import type wireguard file wg0.conf Connection 'wg0' (ac6e7711-8684-4a2c-aba5-83c92f8bf4ca) successfully added.
Poté už uvidíme nové rozhraní:
# nmcli connection NAME UUID TYPE DEVICE enp0s3 7df6994e-091e-4465-9fca-f7c7495c2147 ethernet enp0s3 wg0 ac6e7711-8684-4a2c-aba5-83c92f8bf4ca wireguard wg0 Wired connection 1 8a7ea1e9-6fb2-3259-bcb0-8bc64bd7fe70 ethernet --
Můžeme si nechat vypsat detaily daného rozhraní. Pokud chceme vidět i privátní klíče, musíme přidat parametr --show-secrets
:
# nmcli --show-secrets connection show wg0 connection.id: wg0 connection.uuid: ac6e7711-8684-4a2c-aba5-83c92f8bf4ca connection.stable-id: -- connection.type: wireguard connection.interface-name: wg0 connection.autoconnect: yes connection.autoconnect-priority: 0 connection.autoconnect-retries: -1 (default) connection.multi-connect: 0 (default) connection.auth-retries: -1 connection.timestamp: 1573636242 connection.read-only: no connection.permissions: -- connection.zone: -- connection.master: -- connection.slave-type: -- connection.autoconnect-slaves: -1 (default) connection.secondaries: -- connection.gateway-ping-timeout: 0 connection.metered: unknown connection.lldp: default connection.mdns: -1 (default) connection.llmnr: -1 (default) connection.wait-device-timeout: -1 ipv4.method: manual ipv4.dns: -- ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: 192.168.100.1/24 ipv4.gateway: -- ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) ipv4.routing-rules: -- ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- ipv4.dhcp-timeout: 0 (default) ipv4.dhcp-send-hostname: yes ipv4.dhcp-hostname: -- ipv4.dhcp-fqdn: -- ipv4.never-default: no ipv4.may-fail: yes ipv4.dad-timeout: -1 (default) ipv6.method: disabled ipv6.dns: -- ipv6.dns-search: -- ipv6.dns-options: -- ipv6.dns-priority: 0 ipv6.addresses: -- ipv6.gateway: -- ipv6.routes: -- ipv6.route-metric: -1 ipv6.route-table: 0 (unspec) ipv6.routing-rules: -- ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no ipv6.may-fail: yes ipv6.ip6-privacy: -1 (unknown) ipv6.addr-gen-mode: stable-privacy ipv6.dhcp-duid: -- ipv6.dhcp-send-hostname: yes ipv6.dhcp-hostname: -- ipv6.token: -- wireguard.private-key: QD8zBS9nCwzhBrr6W9rEtcegvCwRk1SDFZFjSL3bMGQ= wireguard.private-key-flags: 0 (none) wireguard.listen-port: 0 wireguard.fwmark: 0x0 wireguard.peer-routes: yes wireguard.mtu: 0 wireguard.ip4-auto-default-route: -1 (default) wireguard.ip6-auto-default-route: -1 (default) proxy.method: none proxy.browser-only: no proxy.pac-url: -- proxy.pac-script: -- GENERAL.NAME: wg0 GENERAL.UUID: ac6e7711-8684-4a2c-aba5-83c92f8bf4ca GENERAL.DEVICES: wg0 GENERAL.STATE: activated GENERAL.DEFAULT: no GENERAL.DEFAULT6: no GENERAL.SPEC-OBJECT: -- GENERAL.VPN: no GENERAL.DBUS-PATH: /org/freedesktop/NetworkManager/ActiveConnection/4 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/Settings/4 GENERAL.ZONE: -- GENERAL.MASTER-PATH: -- IP4.ADDRESS[1]: 192.168.100.1/24 IP4.GATEWAY: -- IP4.ROUTE[1]: dst = 192.168.100.0/24, nh = 0.0.0.0, mt = 50 IP4.ROUTE[2]: dst = 192.168.100.2/32, nh = 0.0.0.0, mt = 50 IP6.GATEWAY: --
Network Manager si konfiguraci ukládá do adresáře /etc/NetworkManager/system-connections/
, kam se můžeme také podívat:
# cat /etc/NetworkManager/system-connections/wg0.nmconnection [connection] id=wg0 uuid=ac6e7711-8684-4a2c-aba5-83c92f8bf4ca type=wireguard interface-name=wg0 permissions= [wireguard] private-key=QD8zBS9nCwzhBrr6W9rEtcegvCwRk1SDFZFjSL3bMGQ= [wireguard-peer.TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw=] endpoint=192.0.2.123:51820 allowed-ips=192.168.100.2/32; [ipv4] address1=192.168.100.1/24 dns-search= method=manual [ipv6] addr-gen-mode=stable-privacy dns-search= method=disabled [proxy]
Pokud se nám nelíbí název rozhraní, můžeme jej jednoduše přejmenovat buď ve výše uvedeném souboru nebo (což je vždy rozumnější volba) použít standardní rozhraní:
# nmcli connection modify wg0 connection.id "WireGuard-doma"
V současném stavu už můžeme rovnou rozhraní ovládat a pokud není zapnuté, jednoduše jej nahodíme:
# nmcli connect up wg0 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
Přehled rozhraní pak získáme zavoláním utility bez parametrů:
# nmcli enp0s3: connected to enp0s3 "Intel 82540EM" ethernet (e1000), 08:00:27:2A:19:77, hw, mtu 1500 inet4 10.0.2.15/24 route4 0.0.0.0/0 route4 10.0.2.0/24 inet6 fe80::a00:27ff:fe2a:1977/64 route6 fe80::/64 route6 ff00::/8 wg0: connected to wg0 "wg0" wireguard, sw, mtu 1420 inet4 192.168.100.1/24 route4 192.168.100.0/24 route4 192.168.100.2/32 lo: unmanaged "lo" loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
Ve výchozím stavu je rozhraní ve stavu „autoconnect“ a bude spuštěno automaticky. Pokud to nechceme, stačí zavolat následující příkaz, který do konfiguračního souboru do sekce [connection]
přidá volbu autoconnect=false
.
# nmcli connection modify wg0 autoconnect no
systemd-networkd
Systemd podporuje WireGuard od verze 237, která vyšla už v lednu loňského roku. Podpora je součástí démona networkd, který se také umí starat o síťová rozhraní, včetně těch virtuálních. Pokud jej chcete používat, musíte spustit službu systemd-networkd.service
.
Veškerá konfigurace se nachází v adresáři /etc/systemd/network/
, kde nás konkrétně budou zajímat unit soubory s příponou .netdev
. Ty se starají o vytváření virtuálních síťových rozhraní. Vytvoříme si tedy ve zmíněném adresáři soubor s názvem wg0.netdev
a do něj vložíme například takovou konfiguraci:
[NetDev] Name=wg0 Kind=wireguard Description=Domaci WireGuard [WireGuard] PrivateKey=QD8zBS9nCwzhBrr6W9rEtcegvCwRk1SDFZFjSL3bMGQ= ListenPort=51820 [WireGuardPeer] PublicKey=TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw= AllowedIPs=192.168.100.2/32 Endpoint=192.0.2.123:51820
Vidíte, že konfigurační soubor je velmi podobný tomu, který používá samotný WireGuard. Nyní ještě potřebujeme vytvořit konfigurační soubor samotného síťového rozhraní, který umožní přidělit rozhraní IP adresu, masku a routy. Soubor musí mít příponu .network
a my jej nazveme třeba wg0.network
. Jeho obsah bude velmi stručný:
[Match] Name=wg0 [Network] Address=192.168.0.122/24
Nyní už stačí jen nechat démona, aby si načetl znovu svou konfiguraci:
# systemctl restart systemd-networkd
Stav linky pak zobrazíme zavoláním networkctl
bez dalších parametrů:
# networkctl IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 enp0s3 ether routable unmanaged 6 wg0 wireguard routable configured 3 links listed.
Toto nastavení je postačující pro spojení dvou stran. Pokud budeme chtít jednu z nich použít jako koncentrátor a tedy router, musíme se zabývat ještě routováním. To nastavíme v souboru .network
v samostatné sekci [Route]
. Více najdete v man systemd.network.