Tunelujeme ethernet přes WireGuard pomocí protokolu Geneve

1. 12. 2022
Doba čtení: 6 minut

Sdílet

 Autor: Depositphotos
WireGuard je populární síťový protokol, který nám umožňuje tunelovat provoz na třetí síťové vrstvě (IP) a stavět tak běžné VPN. Někdy nám to ale nestačí a potřebujeme víc. Musíme pak postavit most v tunelu.

WireGuard na třetí vrstvě

Co se dozvíte v článku
  1. Druhá vrstva
  2. Geneve
  3. Geneve přes WireGuard
  4. Máme L2
  5. Odkazy

WireGuard je nový tunelovací protokol, který umožňuje jednoduše vytvářet bezpečné síťové tunely a propojovat tak vzdálené body či celé sítě. Má celou řadu praktických výhod, ale i některá omezení plynoucí z rozhodnutí zajišťujících jeho jednoduchost. Tuneluje například výhradně třetí síťovou vrstvu a posílá ji přes čtvrtou vrstvu (UDP).

Znamená to, že datový tok vstupující do jednoho konce tunelu je očištěn od všeho, co není Internet Protokol (IP). Provoz uvnitř VPN i okolo ní je pak směrován (routing) podle směrovacích tabulek a vytváříme tím samostatné sítě s různou adresací a různými pravidly. To je ovšem obvykle právě to, co bychom měli chtít, protože stavba velkých sítí na nižších vrstvách přináší řadu problémů.

Občas se setkávám s tím, že uživatelé tvrdošíjně prosazují VPN na druhé síťové vrstvě, přestože netuší, proč by něco takového měli potřebovat. Přijde jim, že když se toho přenáší víc, musí to být prostě lepší. Bohužel, jak už moudře řekl Albus Brumbál: Lidé mají sklon volit právě to, co je pro ně nejhorší.

Druhá vrstva

Přesto existují legitimní důvody, proč chtít tunelovat druhou síťovou vrstvu, tedy celý ethernet. Obvykle je to proto, že potřebujeme přenášet nějaký specifický protokol třetí vrstvy, který není IP. Dalším důvodem může být snaha propojit dvě sítě pomocí síťového mostu (bridge) a vytvořit z nich jeden síťový segment díky jednotnému éteru.

Takto zapojenými tunely probíhají celé ethernetové rámce a jednotlivé uzly jsou identifikovány adresami MAC. Konce tunelů musejí implementovat tabulku CAM a učit se adresy přicházející z jednotlivých síťových rozhraní. Tohle umí řada tunelovacích protokolů, včetně známé OpenVPN. WireGuard ale nic takového neumí a nelze ho k tomu nijak donutit.

Přesto existuje cesta, jak to zařídit: tunelovacími protokoly. Potřebujeme nejprve provoz na druhé vrstvě zabalit do IP tunelu, poté data běžným způsobem přenést přes IP síť a na druhé straně zase vybalit. Že nejde o nic šíleného ani experimentálního, dokazuje fakt, že to tak dělá i český peeringový uzel NIX.CZ, který před necelými dvěma lety přešel na tunelované řešení pomocí VXLAN.

Geneve

Existuje celá řada protokolů, které tohle umí zajistit: VXLAN (Virtual Extensible LAN), NVGRE (Network Virtualization using Generic Routing Encapsulation) a STT (Stateless Transport Tunneling). Na půdě Internet Engineering Task Force (IETF) však vznikl nový univerzální protokol Geneve (RFC 8926), který má za úkol všechny tyhle nekompatibilní a různorodé protokoly nahradit jedním univerzálním a především rozšiřitelným řešením.

Pakety vytvořené pomocí Geneve (Generic Network Virtualization Encapsulation) jsou běžnými IP pakety, které mohou putovat standardní směrovanou sítí. Aplikace ani koncový uzel nemusejí o tunelování vůbec nic vědět a vytvářejí svůj provoz běžným způsobem. Ten pak může dorazit na hranici virtuální sítě (tunelu), kde dojde k jeho zabalení do Geneve.

V zásadě jde především o přidání nové hlavičky, která obsahuje identifikátor tunelu a libovolný počet dalších voleb. Jejich množství ani podoba nejsou pevně dány, což je právě příslib budoucí rozšířitelnosti protokolu, která má podle autorů zabránit neustálému přílivu nových protokolů.

Schéma hlavičky protokolu Geneve

Autor: Benjamin Schmaus

Takto upravený paket je pak pomocí běžného protokolu UDP přenesen na druhý konec sítě pomocí IPv4 nebo IPv6. Síť může být skutečná, virtuální či tunelovaná, což neovlivňuje samotný protokol Geneve. Ten jen vyžaduje, aby se data dostala do správného cíle. V něm je hlavička odstraněna, interpretují se případné volby v ní a přenesený provoz je zaslán do sítě podle identifikátoru nebo jiným způsobem. Tím jsme vlastně přenesli ethernetové rámce po IP síti.

Podstatné pro nás je, že protokol Geneve neřeší šifrování. Jde o čistě tunelovací protokol, jehož cílem je překonat IP síť a přenést přes ni ethernetové rámce. Pokud k přenosu používáme veřejnou síť (internet), je žádoucí provoz zašifrovat a ověřovat autentičnost přenesených dat. Tady nám výborně poslouží WireGuard, který nám celou bezpečnost zajistí.

Tip: Pokud se chcete dozvědět více o protokolu WireGuard, můžete se zúčastnit prakticky orientovaného školení WireGuard: nasazujeme VPN rychle a jednoduše, které pořádá server Root.cz.

Geneve přes WireGuard

V linuxovém jádře je zajištěna podpora obou protokolů, Geneve je v něm dokonce ještě déle než WireGuard. V současných distribucích nám tedy v zásadě nic nebrání v nasazení. Budeme jen potřebovat utility pro správu tunelů pomocí WireGuardu, všechno ostatní už v systému máme.

# apt install wireguard-tools

Využijeme toho, že WireGuard umí v konfiguraci spouštět libovolné příkazy při nahazování a shazování tunelu, takže rovnou vytvoříme příslušné rozhraní pro Geneve a propojíme jím obě strany. Nejprve musíme samozřejmě vytvořit šifrovací klíče na obou stranách tunelu.

# cd /etc/wireguard/
# wg genkey | tee wg-private.key | wg pubkey > wg-public.key

Dalším krokem je příprava konfigurace pro WireGuard. Tu uložíme do /etc/wireguard/wg0.conf a bude vypadat nějak takto:

[Interface]
Address = 10.200.0.1/32
PrivateKey = QD8zBS9nCwzhBrr6W9rEtcegvCwRk1SDFZFjSL3bMGQ=

PostUp = ip link add gnv0 type geneve id 1234 remote 10.200.0.2
PostUp = ip link set gnv0 up
PreDown = ip link delete gnv0

[Peer]
AllowedIPs = 10.200.0.2/32
PublicKey = TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw=
Endpoint = 192.0.2.123:51820

Pochopitelně musíme vytvořit také podobnou konfiguraci na druhé straně, kde musíme změnit IP adresy a klíče. U místního rozhraní je vždy soukromý klíč, u vzdálené protistrany (peer) je pochopitelně vždy klíč veřejný.

Tímto postupem vytvoříme pomocí WireGuardu síťové rozhraní wg0, které dostane IP adresu z rozsahu VPN ( 10.200.0.1) a jehož provoz bude tunelován na skutečnou IP adresu zvolené protistrany ( Endpoint). Kromě toho ale využijeme volby PostUp, která bude spuštěna při každém nahození tunelu. Volbu je možné v konfiguraci uvést vícekrát, pak budou spuštěny všechny postupně za sebou.

V tomto konkrétním případě vytváříme voláním příkazu ip nové síťové rozhraní s názvem gnv0, které má za sebou tunel typu Geneve s identifikátorem 1234 a jeho provoz bude zasílán na IP adresu 10.200.0.2, což je adresa druhého konce našeho tunelu s WireGuardem.

Máme L2

Po spuštění WireGuardu na obou stranách se při správné konfiguraci vše spojí a objeví se síťové rozhraní wg0  pracující na třetí síťové vrstvě. Zároveň ale vznikne druhé rozhraní gnv0, které pracuje na druhé vrstvě a vytváří další propojení mezi oběma stranami. Ty jsou v tomto případě identifikovány MAC adresami.

# ip addr show dev gnv0
12: gnv0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1370 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 3a:5e:d0:eb:a2:b1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::880f:6ff:fef4:523e/64 scope link
       valid_lft forever preferred_lft forever

Toto rozhraní je možné propojit síťovým mostem s jinými rozhraními a tím si rozšiřovat virtuální ethernetovou síť. Využít k tomu lze další volby PostUp, které je možné v konfiguračním souboru uvést vícekrát. Je také možné přiřadit na obou stranách rozhraním IP adresy z dalšího rozsahu, přičemž se při pokusu o komunikaci obě strany standardně objevují protokolem ARP.

ict ve školství 24

Obecnou nevýhodou tunelů je fakt, že snižují MTU, což může působit některé nepříjemné problémy. Také je potřeba si uvědomit, že řada různých zařízení zatím protokol Geneve nepodporuje, ale v principu by mělo být možné nasadit i jiný tunelovací protokol. Pokud ovšem propojujete dva linuxové stroje a potřebujete mezi nimi natáhnout bezpečný virtuální ethernet, máte možnost.

Používáte L2 VPN? K čemu konkrétně se vám v produkci hodí?

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