Prijelaz iz OpenVPN na WireGuard kombinirati mreže u jednu L2 mrežu

Prijelaz iz OpenVPN na WireGuard kombinirati mreže 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

Protokol odabran za provedbu ovog zadatka u početku je bio OpenVPN, jer, prvo, može stvoriti uređaj za slavinu koji se može dodati mostu bez ikakvih problema, i drugo, OpenVPN Podržava TCP, što je također bilo važno, jer nijedan od apartmana nije imao namjensku IP adresu. Nisam mogao koristiti STUN jer moj ISP, iz nekog razloga, blokira dolazne UDP veze iz svojih mreža. TCP mi je omogućio prosljeđivanje VPN serverskog porta na unajmljeni VPS pomoću SSH-a. Iako ovaj pristup stvara značajno opterećenje, budući da su podaci dvostruko šifrirani, nisam htio integrirati VPS u svoju privatnu mrežu, jer je postojao rizik da treće strane preuzmu kontrolu nad njim. Stoga je bilo vrlo nepoželjno imati takav uređaj u svojoj kućnoj mreži, pa sam odlučio platiti značajno opterećenje za sigurnost.

Za prosljeđivanje porta na ruteru na kojem je planirano postavljanje poslužitelja, koristio sam program sshtunnel. Neću ulaziti u detalje njegove konfiguracije - prilično je jednostavna. Samo ću napomenuti da mu je svrha bila prosljeđivanje TCP porta 1194 s rutera na VPS. Zatim sam konfigurirao poslužitelj. OpenVPN Na tap0 uređaju, koji je bio spojen na br-lan most. Nakon testiranja veze s novostvorenim poslužiteljem s mog prijenosnog računala, postalo je jasno da je ideja prosljeđivanja portova uspjela i da je moje prijenosno računalo postalo član mreže usmjerivača, iako fizički nije bio njezin dio.

Jedino što je preostalo bilo je raspodijeliti IP adrese u različitim stanovima kako se ne bi sukobljavale i konfigurirati rutere kako slijedi OpenVPN-klijenti.
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 ove adrese klijentskim usmjerivačima. OpenVPN-server, dodavanjem sljedećeg 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 izrade certifikata za povezivanje s OpenVPN

Zatim su konfigurirani usmjerivači OpenVPN- klijenti, tap0 uređaji na oba su dodani na br-lan most. U ovom trenutku, sve se činilo u redu, jer su se sve tri mreže mogle vidjeti i funkcionirati kao jedna cjelina. Međutim, pojavio se prilično neugodan detalj: ponekad bi uređaji primali IP adresu s pogrešnog usmjerivača, sa svim posljedicama koje su iz toga proizašle. Iz nekog razloga, usmjerivač u jednom od stanova nije na vrijeme odgovorio na DHCPDISCOVER, pa je uređaj primio pogrešnu adresu. Shvatio sam da trebam filtrirati takve zahtjeve u tap0 na svakom usmjerivaču, ali kako se ispostavilo, iptables ne može raditi s uređajem ako je dio mosta, pa sam morao koristiti ebtables. Nažalost, moj firmware to nije uključivao, pa sam morao ponovno izgraditi slike za svaki uređaj. Nakon što sam to učinio i dodao sljedeće retke u /etc/rc.local na svakom usmjerivaču, 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: Upoznavanje WireGuard

U posljednje vrijeme na internetu se sve više govori o WireGuard, diveći se jednostavnosti konfiguracije, velikoj brzini prijenosa, niskom pingu i usporedivoj sigurnosti. Potraga za dodatnim informacijama o njemu otkrila je da ne podržava ni članove mosta ni TCP protokol, što me navelo na pomisao da nema alternative. OpenVPN za mene to još uvijek nije tamo. Zato odgađam upoznavanje WireGuard.

Prije nekoliko dana, vijest se proširila resursima vezanim uz IT na ovaj ili onaj način da WireGuard konačno će biti uključen u kernel Linux, počevši od verzije 5.6. Vijesti su, kao i uvijek, bile pohvaljene WireGuardPonovno sam se upustio u potragu za načinima da zamijenim dobro staro OpenVPNOvaj put sam naletio/la na 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 biste trebali onemogućiti 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 ga. OpenVPN Na ruteru u stanu 2 potvrdio sam da mreža ponovno ispravno radi i da veze ne prekidaju. Pretražujući, naišao sam na forume gdje su se ljudi žalili na iste probleme i gdje im je savjetovano da povećaju MTU. Rečeno, učinjeno. Međutim, sve dok MTU nije bio postavljen dovoljno visoko - 7000 za gretap uređaje - imao sam ili prekide TCP veza ili niske brzine prijenosa. Zbog visokog MTU-a za gretap, MTU za veze... WireGuard Prva i druga razina postavljene 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, otkrio sam da se iz nekog razloga ne spajaju na poslužitelj. Nakon spajanja na njihov SSH (srećom, prethodno sam konfigurirao sshtunnel za ovo), otkrio sam da WireGuard Iz nekog razloga, stvara rutu za krajnju točku, ali je netočna. Na primjer, za 192.168.30.2, tablica ruta je specificirala rutu kroz pppoe-wan sučelje, tj. kroz internet, iako je ruta do njega trebala biti usmjerena kroz wg0 sučelje. Nakon brisanja ove rute, veza je obnovljena. Mogu li negdje pronaći upute kako prisiliti... WireGuard Nisam mogao izbjeći stvaranje ovih ruta. Štoviše, nisam ni razumio je li to značajka OpenWRT-a ili... WireGuardBez trošenja puno vremena na rješavanje problema, jednostavno sam dodao redak u skriptu temeljenu na timeru na oba rutera koja je izbrisala ovu rutu:

route del 192.168.30.2

Rezimirajući

Potpuno odbijanje OpenVPN To još nisam postigao, jer povremeno trebam spojiti se na novu mrežu s prijenosnog računala ili telefona, a postavljanje gretap uređaja na njima je uglavnom nemoguće. Međutim, unatoč tome, stekao sam prednost u brzini prijenosa podataka između stanova, a korištenje VNC-a, na primjer, sada je bez problema. 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 router-serverom imam brzinu internetske veze od 30 Mbps, a u ostalim stanovima je 5 Mbps. Štoviše, tijekom korištenja OpenVPN Nisam uspio postići brzinu prijenosa podataka između mreža veću od 3,8 Mbps prema očitanjima iperfa, dok WireGuard "napumpao" ga na istih 5 Mbit/sec.

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

[Vršnjak]
JavniKljuč = <VPN_1_MS_PUBLIC_KEY>
Dopušteni IP-ovi = 192.168.30.2/32

[Vršnjak]
JavniKljuč = <VPN_2_MK2_JAVNI_KLJUČ>
Dopušteni IP-ovi = 192.168.30.3/32

[Vršnjak]
JavniKljuč = <VPN_2_MK3_JAVNI_KLJUČ>
Dopušteni IP-ovi = 192.168.30.4/32

Konfiguracija WireGuard 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'

Konfiguracija WireGuard 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'

Konfiguracija WireGuard 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 VPN druge razine, klijentima ukazujem WireGuard Port 51821. Ovo ne bi trebalo biti potrebno, jer će klijent uspostaviti vezu s bilo kojeg slobodnog, neprivilegiranog porta, ali ja sam to učinio na ovaj način kako bih mogao uskratiti sve dolazne veze na wg0 sučeljima svih usmjerivača, osim dolaznih UDP veza na port 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žitelji i klijenti

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

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster