Wireguard, ako spojiť 3 LAN siete cez internet

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
Topológia siete

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

Firewall

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
Nová Gateway

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

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *