WireGuard: integrace s nástroji Network Manager a systemd

19. 11. 2019
Doba čtení: 6 minut

Sdílet

V minulém článku jsme se naučili vytvořit VPN pomocí nástroje WireGuard a dnes si jej lépe integrujeme do systému. Použijeme k tomu správce síťových rozhraní Network Manager nebo systemd-networkd.

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:

bitcoin_skoleni

# 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.

Odkazy

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.