
Želeo bih da podelim svoje iskustvo kombinovanja mreža u tri geografski udaljena stana, od kojih svaki koristi rutere sa OpenWRT kao gateway, u jednu zajedničku mrežu. Prilikom odabira metode za kombinovanje mreža između L3 sa usmjeravanjem podmreže i L2 s premošćavanjem, kada će svi mrežni čvorovi biti u istoj podmreži, prednost je data drugoj metodi, koja je teže konfigurirati, ali pruža više mogućnosti, jer je transparentna. korištenje tehnologija planirano je u kreiranoj mreži Wake-on-Lan i DLNA.
Dio 1: Pozadina
Protokol odabran za implementaciju ovog zadatka prvobitno je bio OpenVPN, jer, prvo, može stvoriti uređaj za tapkanje koji se može dodati na most bez ikakvih problema, i drugo, OpenVPN Podržava TCP, što je također bilo važno, jer nijedan od stanova nije imao namjensku IP adresu. Nisam mogao koristiti STUN jer moj internet provajder, iz nekog razloga, blokira dolazne UDP veze sa svojih mreža. TCP mi je omogućio da proslijedim port VPN servera na iznajmljeni VPS koristeći SSH. Iako ovaj pristup stvara značajno opterećenje, jer su podaci dvostruko šifrirani, nisam želio integrirati VPS u svoju privatnu mrežu, jer je postojao rizik da treće strane dobiju kontrolu nad njim. Stoga je bilo krajnje nepoželjno imati takav uređaj u svojoj kućnoj mreži, pa sam odlučio platiti značajno dodatno za sigurnost.
Za prosljedivanje porta na ruteru na kojem je server trebao biti instaliran, koristio sam program sshtunnel. Neću ulaziti u detalje njegove konfiguracije - prilično je jednostavna. Samo ću napomenuti da je njegova svrha bila proslijediti TCP port 1194 sa rutera na VPS. Zatim sam konfigurirao server. OpenVPN Na tap0 uređaju, koji je bio povezan na br-lan most. Nakon testiranja veze s novokreiranim serverom s mog laptopa, postalo je jasno da je ideja o prosljeđivanju portova uspjela i da je moj laptop postao član mreže rutera, iako fizički nije bio dio nje.
Jedino što je preostalo bilo je distribuirati IP adrese u različitim stanovima kako se ne bi sukobljavale i konfigurirati rutere kako slijedi. OpenVPN-klijenti.
Odabrane su sljedeće IP adrese rutera i rasponi DHCP servera:
- 192.168.10.1 sa dometom 192.168.10.2 - 192.168.10.80 za server
- 192.168.10.100 sa dometom 192.168.10.101 - 192.168.10.149 za ruter u stanu br.2
- 192.168.10.150 sa dometom 192.168.10.151 - 192.168.10.199 za ruter u stanu br.3
Također je bilo potrebno dodijeliti ove adrese klijentskim ruterima. OpenVPN-server, dodavanjem sljedeće linije u njegovu konfiguraciju:
ifconfig-pool-persist /etc/openvpn/ipp.txt 0i dodavanjem sljedećih redova u /etc/openvpn/ipp.txt datoteku:
flat1_id 192.168.10.100
flat2_id 192.168.10.150
gdje su flat1_id i flat2_id nazivi uređaja navedeni prilikom kreiranja certifikata za povezivanje sa OpenVPN
Zatim su ruteri konfigurirani OpenVPN- klijenti, tap0 uređaji na oba su dodani na br-lan most. U ovom trenutku, sve je izgledalo 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 dobili IP adresu s pogrešnog rutera, sa svim posljedicama koje iz toga proizlaze. Iz nekog razloga, ruter u jednom od stanova nije uspio na vrijeme odgovoriti na DHCPDISCOVER, i uređaj je primio pogrešnu adresu. Shvatio sam da trebam filtrirati takve zahtjeve u tap0 na svakom ruteru, 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 ponovo izgraditi slike za svaki uređaj. Nakon što sam to učinio i dodao sljedeće linije u /etc/rc.local na svakom ruteru, 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 je trajala tri godine.
Dio 2: Upoznavanje WireGuard
U posljednje vrijeme se na internetu sve češć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 je navelo na pomisao da nema alternative. OpenVPN Za mene to još uvijek nije tu. Zato odgađam upoznavanje WireGuard.
Prije nekoliko dana, vijest se proširila kroz resurse vezane za IT na ovaj ili onaj način da WireGuard će konačno biti uključen u kernel Linux, počevši od verzije 5.6. Vijesti su, kao i uvijek, bile pohvaljene. WireGuardPonovo sam se upustio u potragu za načinima da zamijenim ono dobro staro OpenVPNOvog puta sam naletio/la na . Govorilo se o stvaranju Ethernet tunela preko L3 koristeći GRE. Ovaj članak mi je dao nadu. Ostalo je nejasno šta učiniti sa UDP protokolom. Pretraživanje me je dovelo do članaka o korištenju socata u kombinaciji sa SSH tunelom za prosljeđivanje UDP porta, međutim, primijetili su da ovaj pristup radi samo u načinu jedne veze, što znači da bi više VPN klijenata bilo nemoguće. Došao sam na ideju da postavim VPN server na VPS, i postavim GRE za klijente, ali kako se ispostavilo, GRE ne podržava enkripciju, što će dovesti do toga da ako treća lica dobiju pristup serveru , sav promet između mojih mreža je u njihovim rukama što mi nikako nije odgovaralo.
Ponovo je donesena odluka u korist redundantne enkripcije, korištenjem VPN-a preko VPN-a prema sljedećoj shemi:
Layer XNUMX VPN:
VPS To je server sa internom adresom 192.168.30.1
MS To je klijent VPS sa internom adresom 192.168.30.2
MK2 To je klijent VPS sa internom adresom 192.168.30.3
MK3 To je klijent VPS sa internom adresom 192.168.30.4
Layer XNUMX VPN:
MS To je server sa eksternom adresom 192.168.30.2 i internom 192.168.31.1
MK2 To je klijent MS sa adresom 192.168.30.2 i ima internu IP adresu 192.168.31.2
MK3 To je klijent MS sa adresom 192.168.30.2 i ima internu IP adresu 192.168.31.3
* MS - ruter-server u apartmanu 1, MK2 - ruter u apartmanu 2, MK3 - ruter u apartmanu 3
* Konfiguracije uređaja su objavljene u spojleru na kraju članka.
I tako, pingovi između čvorova mreže 192.168.31.0/24 idu, vrijeme je da pređemo na postavljanje GRE tunela. Prije toga, kako se ne bi izgubio pristup ruterima, 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 Ruter iz apartmana 11122 će biti dostupan na portu 3 VPS-a ruter iz apartmana XNUMX. Najbolje je konfigurirati prosljeđivanje sa istim sshtunelom, jer će vratiti tunel u slučaju da padne.
Tunel je konfigurisan, možete se povezati na SSH preko proslijeđenog porta:
ssh root@МОЙ_VPS -p 10022Zatim biste trebali onemogućiti OpenVPN:
/etc/init.d/openvpn stopSada postavimo GRE tunel na ruteru iz apartmana 2:
ip link add grelan0 type gretap remote 192.168.31.1 local 192.168.31.2
ip link set grelan0 up
I dodajte kreirani interfejs na most:
brctl addif br-lan grelan0
Izradimo sličnu proceduru na serverskom ruteru:
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 kreirani interfejs na most:
brctl addif br-lan grelan0
počevši od ovog trenutka, pingovi počinju uspješno da idu na novu mrežu i ja sa zadovoljstvom odlazim na kafu. Zatim, da vidim kako radi mreža na drugom kraju žice, pokušavam da uđem SSH u jedan od računara u stanu 2, ali ssh klijent se zamrzava bez traženja lozinke. Pokušavam da se povežem sa ovim računarom preko telneta na portu 22 i vidim liniju iz koje možete da razumete da se konekcija uspostavlja, SSH server se javlja, ali mi iz nekog razloga ne nudi da uđem.
$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1
Pokušavam da se povežem na njega preko VNC-a i vidim crni ekran. Uvjeravam se da je stvar u udaljenom kompjuteru, jer se iz ovog stana lako mogu spojiti na ruter koristeći internu adresu. Međutim, odlučujem da uđem SSH u ovaj računar preko rutera i iznenađen sam kada otkrijem da je veza uspjela i da udaljeni računar radi dobro, ali se ne može 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 ponovo 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, to 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 Prvi i drugi nivo su postavljeni na 8000, odnosno 7500.
Napravio sam slično podešavanje na ruteru iz apartmana 3, sa jedinom razlikom što je drugi gretap interfejs pod imenom grelan1 dodat na serverski ruter, koji je takođe dodat na br-lan most.
Sve radi. Sada možete staviti gretap sklop u autoload. Za ovo:
Stavite ove linije 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 dodato u /etc/rc.local na ruteru u stanu 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 serverskom ruteru:
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 rutera, otkrio sam da se iz nekog razloga ne povezuju sa serverom. Nakon povezivanja na njihov SSH (srećom, prethodno sam konfigurirao sshtunnel za ovo), otkrio sam da WireGuard Iz nekog razloga, kreira rutu za krajnju tačku, ali je ona netačna. Na primjer, za 192.168.30.2, tabela ruta je specificirala rutu kroz pppoe-wan interfejs, tj. kroz internet, iako je ruta do nje trebala biti usmjerena kroz wg0 interfejs. Nakon brisanja ove rute, veza je obnovljena. Mogu li negdje pronaći upute kako prisiliti... WireGuard Nisam mogao izbjeći kreiranje ovih ruta. Štaviše, nisam čak ni razumio da li je ovo karakteristika OpenWRT-a ili... WireGuardBez trošenja mnogo vremena na rješavanje problema, jednostavno sam dodao liniju u skriptu zasnovanu na tajmeru na oba rutera koja je izbrisala ovu rutu:
route del 192.168.30.2
Sumiranje
Potpuno odbacivanje OpenVPN Nisam to još postigao, jer povremeno trebam da se povežem na novu mrežu sa laptopa ili telefona, a podešavanje gretap uređaja na njima je uglavnom nemoguće. Međutim, uprkos tome, stekao sam prednost u brzini prenosa 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
Najviše je pogođen visokim pingom prema VPS-u koji iznosi otprilike 61.5 ms
Međutim, brzina se značajno povećala. Tako u stanu sa ruter-serverom imam brzinu internet veze od 30 Mbps, a u ostalim stanovima je 5 Mbps. Štaviše, tokom korištenja OpenVPN Nisam uspio postići brzinu prijenosa podataka između mreža veću od 3,8 Mbps prema iperf očitanjima, dok WireGuard "pumpao" ga je 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>
Dozvoljeni IP-ovi = 192.168.30.2/32
[Vršnjak]
JavniKljuč = <VPN_2_MK2_JAVNI_KLJUČ>
Dozvoljeni IP-ovi = 192.168.30.3/32
[Vršnjak]
JavniKljuč = <VPN_2_MK3_JAVNI_KLJUČ>
Dozvoljeni 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 drugog nivoa, klijentima ukazujem WireGuard Port 51821. Ovo ne bi trebalo biti potrebno, jer će klijent uspostaviti vezu s bilo kojeg slobodnog, neprivilegiranog porta, ali sam to uradio na ovaj način kako bih mogao zabraniti sve dolazne veze na wg0 interfejsima svih rutera, 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 linka do skripte: .
UPDATE: Konfiguracija OpenVPN- serveri i klijenti
OpenVPN-server
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-lzoOpenVPN- 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
