Wireguard (WG) je výborný nástroj na vytváranie virtuálnych privátnych sieti (VPN). O WG som sa zmienil na blogu už viac krát. Pred nedávnom som otestoval spojenie troch LAN sieti, ktoré sa nachádzajú kdekoľvek v sieti internet. Nevyhnutnou podmienkou pre tento účel je vlastnenie verejnej IPv4 adresy.
Obsah
Cieľ projektu
Vezmime si jednoduchý príklad. Majme 3 firemné pobočky v rôznych krajinách a každá pobočka má svoju vlastnú LAN sieť /24. Ja som zvolil pre siete tieto IP adresy (pozri aj nasledujúci obrázok).
- Pobočka Slovensko – 192.168.1.0/24
- Pobočka Nemecko – 192.168.130.0/24
- Pobočka Taliansko – 192.168.140.0/24

Pri spojení LAN sieti je veľmi dôležité, aby mal každý subnet inú IP adresu, lebo inak by pakety neopustili svoju lokálnu sieť a je možné, že by vznikol aj IP konflikt. Ak LAN siete majú rovnaké IP adresy, tak ich musíme jednoducho preadresovať. Každý si môže zvoliť IP adresy aké chce, ale odporúča sa voliť IP adresy v rámci RFC1918 aby sa predišlo zbytočným komplikáciám.
Ako som spomenul v úvode, musíme mať kontrolu aspoň nad jedným bodom s verejnou IPv4 adresou (v mojom prípade sa jedná o sieťové zariadenie, označené čislom 1). Ostatné LAN siete sa môžu nachádzať kdekoľvek v sieti internet, za niekoľkými NATmi dokonca aj v IPv6 sieti, pretože každý ISP musí používať nejaký prechodový mechanizmus IPv6 to IPv4. Ja mám výhodu v tom, že môj ISP poskytuje (zatiaľ) IPv4 adresy zdarma. Aj keď sa nejedná o statickú verejnú IPv4 adresu, tak v mojom prípade zmenu IPv4 adresy rieši verejný free DNS server.
V tejto topológii nás budú zaujímať 3 resp. 4 zariadenia, ktoré budeme konfigurovať. Na obrázku sú znázornené ako body 1, 2, 3
- LXC Debian 11 – IP 192.168.1.111 (1)
- pfSense 2.6.0 – IP 192.168.1.1 (1)
- OpenWRT – IP 192.168.130.1 (2)
- OpenWRT – IP 192.168.140.1 (3)
Debian 11 a firewall/router pfSense 2.6.0 sú na jednom fyzickom zariadení (to samozrejme nie je podmienkou), ale logicky sú to 2 zariadenia. V ďalších sieťach sú smerovače s operačným systémom OpenWRT. Aby som sa dlho nezdržiaval a aby som sa neopakoval, tak inštalácia a nastavenie WireGuard servera je popísaná v tomto blogu. Ako rozbehať WireGuard na OpenWRT je zase v tejto časti. Pre wireguard sieť som zvolil IP 10.10.1.0/24. Predpokladajme, že privátne a verejné kľúče máme vygenerované pre každé zariadenie.
Chceme dosiahnuť stavu, aby bolo možne pingať z každej do každej siete vrátane WG siete, viď následujúca tabuľka.
192.168.130.0/24 <--> 192.168.140.0/24 192.168.130.0/24 <--> 192.168.1.0/24 192.168.130.0/24 <--> 10.10.1.0/24 192.168.140.0/24 <--> 192.168.1.0/24 192.168.140.0/24 <--> 10.10.1.0/24 192.168.1.0/24 <--> 10.10.1.0/24
Wireguard na LXC Debien 11
Najprv nastavíme Wireguard na LXC s IP adresou 192.168.1.111. Tento stroj môžeme nazývať aj server (aj keď sú všetky zariadenia vo wireguard rovnocenne), pretože cez neho bude prechádzať traffic z ďalších sieti.
[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
Address = 10.10.1.1/32
ListenPort = 51821
PreUp = iptables -I FORWARD -i wg1 -d 0.0.0.0/0 -j REJECT
PostDown = iptables -D FORWARD -i wg1 -d 0.0.0.0/0 -j REJECT
PreUp = iptables -I FORWARD -i wg1 -d 192.168.1.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i wg1 -d 192.168.1.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -i wg1 -d 192.168.130.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i wg1 -d 192.168.130.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -i wg1 -d 192.168.140.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i wg1 -d 192.168.140.0/24 -j ACCEPT
PreUp = iptables -I FORWARD -i wg1 -d 10.10.1.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i wg1 -d 10.10.1.0/24 -j ACCEPT
[Peer]
PublicKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy=
AllowedIPs = 10.10.1.3/32,192.168.130.0/24
[Peer]
PublicKey = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=
AllowedIPs = 10.10.1.4/32,192.168.140.0/24
Takto potom vyzerá výpis iptables, ktorá hovorí. presmeruj všetky pakety cez rozhranie wg1 do inkriminovaných cieľových sieti a ostatné pakety, ktoré nevyhovujú predpisu odmietni s icmp správou.
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
154 13076 ACCEPT all -- wg1 any anywhere 10.10.1.0/24
1151 465K ACCEPT all -- wg1 any anywhere 192.168.140.0/24
1262 206K ACCEPT all -- wg1 any anywhere 192.168.130.0/24
11908 915K ACCEPT all -- wg1 any anywhere 192.168.1.0/24
0 0 REJECT all -- wg1 any anywhere anywhere reject-with icmp-port-unreachable
Routovacia resp. smerovacia tabuľka je vygenerovaná automaticky, takže nemusíme riešiť routy ručne.
default via 192.168.1.1 dev eth0 onlink
10.10.1.3 dev wg1 scope link
10.10.1.4 dev wg1 scope link
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.111
192.168.130.0/24 dev wg1 scope link
192.168.140.0/24 dev wg1 scope link
Pochopiteľne nesmieme zabudnúť na nastavenie forwardingu paketov v jadre
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1
Wireguard na OpenWRT
Čo sa týka nastavenia klientov OpenWRT, tak postupujme ako už bolo spomenuté v tejto časti. Konfigurácia je možná cez webové rozhranie tzv. LuCi, prianím kopírovaním do konfiguračných súborov, alebo použitím príkazov uci. Pre mňa bolo najjednoduchšie nakopírovať parametre priamo do konfiguračných súborov, pomocou editora vi. To znamená, že sa prihlásime cez SSH do routera
ssh root@192.168.130.1
vi /etc/config/network
config interface 'wg0'
option proto 'wireguard'
option private_key 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy='
option listen_port '51821'
list addresses '10.10.1.3'
config wireguard_wg0
option description 'server'
option public_key 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx='
option route_allowed_ips '1'
option endpoint_host 'example.net'
option endpoint_port '51821'
option persistent_keepalive '25'
list allowed_ips '10.10.1.0/24'
list allowed_ips '192.168.1.0/24'
list allowed_ips '192.168.140.0/24'
Tak isto musíme nastaviť firewall. Prejdeme do konfiguračného súboru pre firewall a do zóny pridáme pravidlo aby sa pakety preposielali z LAN do WG a tiež opačne.
vi /etc/config/firewall
config forwarding
option src 'lan'
option dest 'wg0'
config forwarding
option src 'wg0'
option dest 'lan'
Po konfigurácii firewallu by to vo webovom rozhraní mohlo vyzerať následovne

Tu je smerovacia tabuľka (iptables)
default via 192.168.43.1 dev wlan0 src 192.168.43.109
10.10.1.0/24 dev wg0 scope link
1xx.xx.55.164 via 192.168.43.1 dev wlan0
192.168.1.0/24 dev wg0 scope link
192.168.43.0/24 dev wlan0 scope link src 192.168.43.109
192.168.130.0/24 dev br-lan scope link src 192.168.130.1
192.168.140.0/24 dev wg0 scope link
To isté spravíme aj v druhom zariadení OpenWRT. Samozrejme použijeme správne kľúče a IP adresy, resp. rozsahy IP adries.
ssh root@192.168.140.1
vi /etc/config/network
config interface 'wg0'
option proto 'wireguard'
option private_key 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz='
option listen_port '51821'
list addresses '10.10.1.4'
config wireguard_wg0
option description 'server'
option public_key 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx='
option route_allowed_ips '1'
option endpoint_host 'example.net'
option endpoint_port '51821'
option persistent_keepalive '25'
list allowed_ips '10.10.1.0/24'
list allowed_ips '192.168.1.0/24'
list allowed_ips '192.168.130.0/24'
vi /etc/config/firewall
config forwarding
option src 'lan'
option dest 'wg0'
config forwarding
option src 'wg0'
option dest 'lan'
V tomto prípade by sa už mali vidieť a mali by sme bez problémov pingať siete 192.168.130.0/24 a 192.168.140.0/24. Teraz príde ďalšia dôležitá časť a to je pripojenie tretej siete 192.168.1.0/24. Tu vidím trocha problém, ale nie neriešiteľný.
Statické routy na pfSense
Pozrime sa na úvodný obrázok. Ja potrebujem z LAN 192.168.1.0/24, kontaktovať stroj v LAN 192.168.130.0/24, alebo 192.168.140.0/24. Keď dam napr. z PC 192.168.1.5 ping na 192.168.130.5, tak lokálny router zistí, že paket obsahujúci hlavičku s cieľovou IP adresou 192.168.130.5 sa nenachádza v jeho dosahu. Preto paket posiela na default GW 192.168.1.1 avšak takáto IP adresa sa nenachádza nikde na internete a paket bude zahodený. Z toho vyplíva, že paket musí byť nasmerovaný do stroja s IP adresou 192.168.1.111. To bude vlastne default GW pre pakety smerované do siete 192.168.130.0/24. Čiže na pfSense vytvoríme ďalšiu GW s IP adresou 192.168.1.111
System --> Routing --> Gateways --> +Add

Ak sme vytvorili novú GW, tak klikneme na link Static Routes +Add a pridáme novú routu, kde uvedieme ako cieľovú sieť 192.168.130.0/24. Ako Gateway vyberieme našu novovytvorenú GW. Táto routa hovorí, že pakety, ktoré budú smerovať do siete 192.168.130.0/24 pošli cez GW 192.168.1.111. Takéto statické routy vytvoríme aj pre sieť 192.168.140.0/24 a môžeme aj pre 10.10.1.0/24

Teraz sme dosiahli, že všetky siete resp. všetky sieťové zariadenia sa navzájom vidia. Osobne som testoval zo siete 192.168.130.0/24 sieťovú tlačiareň v sieti 192.168.1.0/24 a dokument sa bez problémov vytlačil. taktiež som skúsil stream s DVB-S2 boxu a bez problémov sa stream prehrával.
Záver
Na záver by som ešte uviedol, že nevidím problém v tom aby bola k týmto trom sieťam pridaná ďalšia sieť, resp. ďalšie siete. Takto môžeme získať rozsiahlu šifrovanú virtuálnu sieť a klienti fungujú ako keby boli v jednej lokálnej, resp. routovanej sieti. Musíme však dávať pozor pri konfigurácii wireguard rozhraní a pri nastavovaní pravidiel aby nedošlo k omylu, pretože niekedy povolíme aj to čo sme nechceli povoliť.