Migracija s OpenVPN-a na WireGuard radi konsolidacije mreža u jednu L2 mrežu

Migracija s OpenVPN-a na WireGuard radi konsolidacije mreža u jednu L2 mrežu

Želio bih podijeliti svoje iskustvo spajanja mreža u tri geografski udaljena stana, od kojih svaki koristi routere s OpenWRT-om kao pristupnikom, u jednu zajedničku mrežu. Prilikom odabira metode kombiniranja mreža između L3 s usmjeravanjem podmreže i L2 s premošćivanjem, kada će svi mrežni čvorovi biti u istoj podmreži, prednost je dana drugoj metodi, koju je teže konfigurirati, ali pruža više mogućnosti, budući da je transparentan korištenje tehnologija planirano je u stvorenoj mreži Wake-on-Lan i DLNA.

1. dio: Pozadina

OpenVPN je inicijalno odabran kao protokol za implementaciju ovog zadatka, jer, prvo, može kreirati priključni uređaj koji se bez problema može dodati u most, i drugo, OpenVPN podržava rad preko TCP protokola, što je također bilo važno, jer niti jedan stan nije imao namjensku IP adresu, a nisam mogao koristiti STUN, jer iz nekog razloga moj ISP blokira dolazne UDP veze s njihovih mreža, dok mi je TCP protokol omogućio prosljeđivanje porta VPN poslužitelja na iznajmljenom VPS-u koristeći SSH. Da, ovaj pristup predstavlja veliko opterećenje, budući da su podaci dvaput šifrirani, ali nisam želio uvesti VPS u svoju privatnu mrežu, budući da je još uvijek postojao rizik da treće strane preuzmu kontrolu nad njim, dakle, imati takav uređaj na kućnoj mreži bio je krajnje nepoželjan i odlučeno je platiti sigurnost s velikim režijskim troškovima.

Za prosljeđivanje porta na usmjerivaču na kojem je planirano postavljanje poslužitelja korišten je program sshtunnel. Neću opisivati ​​zamršenost njegove konfiguracije - to se radi prilično jednostavno, samo napominjem da je njegov zadatak bio proslijediti TCP priključak 1194 s usmjerivača na VPS. Zatim je OpenVPN poslužitelj konfiguriran na tap0 uređaju koji je bio spojen na br-lan most. Nakon provjere veze s novostvorenim serverom s prijenosnog računala, postalo je jasno da se ideja o port forwardingu opravdala i moj laptop je postao član mreže rutera, iako fizički nije bio u njoj.

Stvar je ostala mala: bilo je potrebno distribuirati IP adrese u različitim stanovima tako da se ne sukobljavaju i konfigurirati usmjerivače kao OpenVPN klijente.
Odabrane su sljedeće IP adrese usmjerivača i rasponi DHCP poslužitelja:

  • 192.168.10.1 s rasponom 192.168.10.2 - 192.168.10.80 za poslužitelj
  • 192.168.10.100 s rasponom 192.168.10.101 - 192.168.10.149 za ruter u stanu br.2
  • 192.168.10.150 s rasponom 192.168.10.151 - 192.168.10.199 za ruter u stanu br.3

Također je bilo potrebno dodijeliti točno ove adrese klijentskim usmjerivačima OpenVPN poslužitelja dodavanjem retka u njegovu konfiguraciju:

ifconfig-pool-persist /etc/openvpn/ipp.txt 0

i dodavanjem sljedećih redaka u datoteku /etc/openvpn/ipp.txt:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

gdje su flat1_id i flat2_id nazivi uređaja navedeni prilikom generiranja certifikata za povezivanje na OpenVPN

Zatim su OpenVPN klijenti konfigurirani na ruterima, tap0 uređaji na oba dodani su br-lan mostu. U ovoj fazi sve je izgledalo u redu jer se sve tri mreže međusobno vide i rade kao cjelina. Međutim, pokazao se ne baš ugodan detalj: ponekad uređaji mogu dobiti IP adresu ne od svog usmjerivača, sa svim posljedicama. Iz nekog razloga, usmjerivač u jednom od stanova nije imao vremena odgovoriti na DHCPDISCOVER na vrijeme i uređaj je primio pogrešnu adresu. Shvatio sam da trebam filtrirati takve zahtjeve u tap0 na svakom od rutera, ali kako se pokazalo, iptables ne može raditi s uređajem ako je dio mosta i ebtables bi mi trebao priskočiti u pomoć. Na moju žalost, to nije bilo u mom firmware-u i morao sam ponovno izgraditi slike za svaki uređaj. Učinivši ovo i dodavši ove redove u /etc/rc.local svakog usmjerivača, problem je riješen:

ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A INPUT --in-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-destination-port 67:68 -j DROP
ebtables -A FORWARD --out-interface tap0 --protocol ipv4 --ip-protocol udp --ip-source-port 67:68 -j DROP

Ova konfiguracija trajala je tri godine.

2. dio: Predstavljanje WireGuarda

U posljednje vrijeme internet sve više govori o WireGuardu, diveći se jednostavnosti njegove konfiguracije, velikoj brzini prijenosa, niskom pingu uz usporedivu sigurnost. Traženjem više informacija o njemu postalo je jasno da on ne podržava niti rad kao član mosta niti rad preko TCP protokola, zbog čega sam pomislio da za mene još uvijek nema alternative OpenVPN-u. Stoga sam odgodio upoznavanje s WireGuardom.

Prije nekoliko dana se kroz resurse na ovaj ili onaj način vezane za IT proširila vijest da će WireGuard konačno biti uključen u Linux kernel, počevši od verzije 5.6. Novinski članci, kao i uvijek, hvale WireGuard. Ponovno sam uronio u potragu za načinima kako zamijeniti dobri stari OpenVPN. Ovaj put sam naletio ovaj članak. Govorilo se o stvaranju Ethernet tunela preko L3 koristeći GRE. Ovaj mi je članak dao nadu. Ostalo je nejasno što učiniti s UDP protokolom. Pretraživanje me dovelo do članaka o korištenju socat-a u kombinaciji sa SSH tunelom za prosljeđivanje UDP porta, međutim, primijetili su da ovaj pristup radi samo u načinu rada s jednom vezom, što znači da bi više VPN klijenata bilo nemoguće. Došao sam na ideju da postavim VPN poslužitelj na VPS i konfiguriram GRE za klijente, ali kako se pokazalo, GRE ne podržava enkripciju, što će dovesti do činjenice da ako treće strane dobiju pristup poslužitelju, sav promet između mojih mreža je u njihovim rukama što mi nikako nije odgovaralo.

Ponovno je donesena odluka u korist redundantne enkripcije, korištenjem VPN-a preko VPN-a prema sljedećoj shemi:

VPN razine XNUMX:
VPS je poslužitelja s internom adresom 192.168.30.1
MS je klijent VPS s internom adresom 192.168.30.2
MK2 je klijent VPS s internom adresom 192.168.30.3
MK3 je klijent VPS s internom adresom 192.168.30.4

VPN razine XNUMX:
MS je poslužitelja s vanjskom adresom 192.168.30.2 i internom 192.168.31.1
MK2 je klijent MS s adresom 192.168.30.2 i ima interni IP 192.168.31.2
MK3 je klijent MS s adresom 192.168.30.2 i ima interni IP 192.168.31.3

* MS - router-server u apartmanu 1, MK2 - ruter u apartmanu 2, MK3 - ruter u stanu 3
* Konfiguracije uređaja objavljene su u spojleru na kraju članka.

I tako, pingovi između čvorova mreže 192.168.31.0/24 idu, vrijeme je da prijeđemo na postavljanje GRE tunela. Prije toga, kako ne biste izgubili pristup usmjerivačima, vrijedi postaviti SSH tunele za prosljeđivanje porta 22 na VPS, tako da će npr. ruter iz apartmana 10022 biti dostupan na portu 2 VPS-a, a usmjerivač iz apartmana 11122 bit će dostupan na portu 3 VPS-a.usmjerivač iz apartmana XNUMX. Najbolje je konfigurirati prosljeđivanje s istim sshtunnelom, jer će on vratiti tunel u slučaju da padne.

Tunel je konfiguriran, možete se spojiti na SSH preko proslijeđenog porta:

ssh root@МОЙ_VPS -p 10022

Zatim onemogućite OpenVPN:

/etc/init.d/openvpn stop

Postavimo sada GRE tunel na usmjerivaču iz stana 2:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up

I dodajte kreirano sučelje u most:

brctl addif br-lan grelan0

Izvedimo sličan postupak na usmjerivaču poslužitelja:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set grelan0 up

I, također, dodajte kreirano sučelje mostu:

brctl addif br-lan grelan0

od ovog trenutka pingovi počinju uspješno ići na novu mrežu i ja zadovoljan odlazim popiti kavu. Zatim, da vidim kako mreža na drugom kraju žice radi, pokušavam se povezati s SSH-om na jedno od računala u apartmanu 2, ali ssh klijent se smrzava bez traženja lozinke. Pokušavam se spojiti na ovo računalo preko telneta na portu 22 i vidim liniju iz koje se vidi da se veza uspostavlja, SSH server odgovara, ali mi iz nekog razloga ne nudi ulazak.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Pokušavam se spojiti na njega putem VNC-a i vidim crni ekran. Uvjeravam se da je stvar u udaljenom računalu, jer se iz ovog stana lako mogu spojiti na router preko interne adrese. Međutim, odlučujem se za SSH u ovo računalo putem usmjerivača i iznenađen sam kada vidim da je veza uspjela i da udaljeno računalo radi dobro, ali se ne uspijeva povezati ni s mojim računalom.

Izvadim grelan0 uređaj iz mosta i pokrenem OpenVPN na ruteru u apartmanu 2 i provjerim radi li mreža ponovno ispravno i veze ne padaju. Pretražujući nailazim na forume gdje se ljudi žale na iste probleme, gdje im se savjetuje da povise MTU. Rečeno, učinjeno. Međutim, sve dok MTU nije postavljen na dovoljno veliku vrijednost od 7000 za gretap uređaje, opažene su ili prekinute TCP veze ili spori prijenosi. Zbog visokog MTU-a za gretap, MTU-ovi za WireGuard veze prve i druge razine postavljeni su na 8000 odnosno 7500.

Napravio sam sličnu postavku na usmjerivaču iz apartmana 3, s jedinom razlikom što je drugo gretap sučelje pod nazivom grelan1 dodano poslužiteljskom usmjerivaču, koji je također dodan br-lan mostu.

Sve radi. Sada možete staviti gretap sklop u automatsko učitavanje. Za ovo:

Stavili ove retke u /etc/rc.local na ruteru u apartmanu 2:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

Ovo je dodano u /etc/rc.local na ruteru u apartmanu 3:

ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

I na usmjerivaču poslužitelja:

ip link add grelan0 type gretap remote 192.168.31.2 local 192.168.31.1
ip link set dev grelan0 mtu 7000
ip link set grelan0 up
brctl addif br-lan grelan0

ip link add grelan1 type gretap remote 192.168.31.3 local 192.168.31.1
ip link set dev grelan1 mtu 7000
ip link set grelan1 up
brctl addif br-lan grelan1

Nakon ponovnog pokretanja klijentskih usmjerivača, ustanovio sam da se iz nekog razloga nisu povezali s poslužiteljem. Spajajući se na njihov SSH (srećom, prethodno sam konfigurirao sshtunnel za to), otkriveno je da WireGuard iz nekog razloga stvara rutu za krajnju točku, ali je netočna. Dakle, za 192.168.30.2 tablica ruta je navedena u tablici ruta kroz sučelje pppoe-wan, odnosno preko interneta, iako je ruta do njega trebala biti usmjerena preko sučelja wg0. Nakon brisanja ove rute veza je ponovno uspostavljena. Nigdje nisam mogao pronaći upute kako prisiliti WireGuard da ne stvara te rute. Štoviše, nisam ni razumio je li to značajka OpenWRT-a ili samog WireGuarda. Bez da sam se dugo bavio ovim problemom, jednostavno sam dodao na oba usmjerivača u skripti koja se ponavlja timerom, redak koji je izbrisao ovu rutu:

route del 192.168.30.2

Rezimirajući

Još nisam postigao potpuno odbacivanje OpenVPN-a, jer se ponekad moram spojiti na novu mrežu s prijenosnog računala ili telefona, a postavljanje gretap uređaja na njih je općenito nemoguće, ali unatoč tome dobio sam prednost u prijenosu podataka brzina između stanova i npr. korištenje VNC-a više nije nezgodno. Ping se malo smanjio, ali je postao stabilniji:

Kada koristite OpenVPN:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=133 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=125 ms

--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19006ms
rtt min/avg/max/mdev = 124.722/126.152/136.907/3.065 ms

Kada koristite WireGuard:

[r0ck3r@desktop ~]$ ping -c 20 192.168.10.110
PING 192.168.10.110 (192.168.10.110) 56(84) bytes of data.
64 bytes from 192.168.10.110: icmp_seq=1 ttl=64 time=124 ms
...
64 bytes from 192.168.10.110: icmp_seq=20 ttl=64 time=124 ms
--- 192.168.10.110 ping statistics ---
20 packets transmitted, 20 received, 0% packet loss, time 19003ms
rtt min/avg/max/mdev = 123.954/124.423/126.708/0.675 ms

Na njega najviše utječe visok ping do VPS-a koji iznosi približno 61.5 ms

Međutim, brzina se značajno povećala. Dakle, u stanu s routerom-serverom imam brzinu internetske veze 30 Mbps, a u ostalim stanovima 5 Mbps. Istovremeno, koristeći OpenVPN nisam mogao postići brzinu prijenosa podataka između mreža veću od 3,8 Mbps prema iperfu, dok ju je WireGuard “napumpao” na istih 5 Mbps.

WireGuard konfiguracija na VPS-u[Interface] Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_1_МС>
AllowedIPs = 192.168.30.2/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2>
AllowedIPs = 192.168.30.3/32

[Peer] PublicKey = <ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3>
AllowedIPs = 192.168.30.4/32

WireGuard konfiguracija na MS-u (dodano u /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.2/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МС'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option route_allowed_ips '1'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - сервер
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option listen_port '51821'
        list addresses '192.168.31.1/24'
        option auto '1'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list allowed_ips '192.168.31.2'

config wireguard_wg1ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.3

        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list allowed_ips '192.168.31.3'

WireGuard konfiguracija na MK2 (dodano u /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.3/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК2'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК2'
        list addresses '192.168.31.2/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

WireGuard konfiguracija na MK3 (dodano u /etc/config/network)

#VPN первого уровня - клиент
config interface 'wg0'
        option proto 'wireguard'
        list addresses '192.168.30.4/24'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_1_МК3'
        option auto '1'
        option mtu '8000'

config wireguard_wg0
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_1_VPS'
        option endpoint_port '51820'
        option persistent_keepalive '25'
        list allowed_ips '192.168.30.0/24'
        option endpoint_host 'IP_АДРЕС_VPS'

#VPN второго уровня - клиент
config interface 'wg1'
        option proto 'wireguard'
        option private_key 'ЗАКРЫТЫЙ_КЛЮЧ_VPN_2_МК3'
        list addresses '192.168.31.3/24'
        option auto '1'
        option listen_port '51821'
        option mtu '7500'

config wireguard_wg1
        option public_key 'ОТКРЫТЫЙ_КЛЮЧ_VPN_2_МС'
        option endpoint_host '192.168.30.2'
        option endpoint_port '51821'
        option persistent_keepalive '25'
        list allowed_ips '192.168.31.0/24'

U opisanim konfiguracijama za drugu razinu VPN-a WireGuard klijentima navodim port 51821. U teoriji to nije potrebno jer će klijent uspostaviti vezu s bilo kojeg slobodnog neprivilegiranog porta, ali napravio sam tako da sve dolazne veze može se odbiti na wg0 sučeljima svih usmjerivača, osim dolaznih UDP veza na portu 51821.

Nadam se da će članak nekome biti od koristi.

PS Također, želim podijeliti svoju skriptu koja mi šalje PUSH obavijest na moj telefon u aplikaciji WirePusher kada se novi uređaj pojavi na mojoj mreži. Evo poveznice na skriptu: github.com/r0ck3r/device_discover.

AŽURIRAJ: Konfiguracija OpenVPN poslužitelja i klijenata

OpenVPN poslužitelj

client-to-client

ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
dh /etc/openvpn/server/dh.pem
key /etc/openvpn/server/vpn-server.key

dev tap
ifconfig-pool-persist /etc/openvpn/ipp.txt 0
keepalive 10 60
proto tcp4
server-bridge 192.168.10.1 255.255.255.0 192.168.10.80 192.168.10.254
status /var/log/openvpn-status.log
verb 3
comp-lzo

OpenVPN klijent

client
tls-client
dev tap
proto tcp
remote VPS_IP 1194 # Change to your router's External IP
resolv-retry infinite
nobind

ca client/ca.crt
cert client/client.crt
key client/client.key
dh client/dh.pem

comp-lzo
persist-tun
persist-key
verb 3

Koristio sam easy-rsa za generiranje certifikata.

Izvor: www.habr.com

Dodajte komentar