Siirtyminen OpenVPN:stä WireGuardiin verkkojen yhdistämiseksi yhdeksi L2-verkoksi

Siirtyminen OpenVPN:stä WireGuardiin verkkojen yhdistämiseksi yhdeksi L2-verkoksi

Haluaisin jakaa kokemukseni verkkojen yhdistämisestä kolmessa maantieteellisesti erillään olevassa asunnossa, joista jokainen käyttää reitittimiä OpenWRT-yhdyskäytävänä, yhdeksi yhteiseksi verkkoksi. Valittaessa menetelmää verkkojen yhdistämiseksi aliverkon reitityksellä varustetun L3:n ja siltauksen L2:n välillä, kun kaikki verkkosolmut ovat samassa aliverkossa, etusija annettiin toiselle menetelmälle, joka on vaikeampi konfiguroida, mutta tarjoaa enemmän mahdollisuuksia, koska läpinäkyvä. Teknologioiden käyttö suunniteltiin luodussa Wake-on-Lan- ja DLNA-verkossa.

Osa 1: Tausta

OpenVPN valittiin alun perin tämän tehtävän toteuttamisprotokollaksi, koska ensinnäkin se voi luoda sillalle ilman ongelmia lisättävän kosketuslaitteen ja toiseksi OpenVPN tukee toimintaa TCP-protokollan yli, mikä oli myös tärkeää, koska Yhdelläkään asunnolla ei ollut omaa IP-osoitetta, enkä voinut käyttää STUNia, koska Internet-palveluntarjoajani jostain syystä estää saapuvat UDP-yhteydet heidän verkoistaan, kun taas TCP-protokolla antoi minulle mahdollisuuden välittää VPN-palvelinportin vuokralle VPS:lle SSH:n avulla. Kyllä, tämä lähestymistapa antaa suuren kuorman, koska tiedot salataan kahdesti, mutta en halunnut tuoda VPS:ää yksityiseen verkkooni, koska oli silti olemassa vaara, että kolmannet osapuolet saavat sen hallintaansa, joten tällaisella laite kotiverkossa oli äärimmäisen ei-toivottu ja päätettiin maksaa turvallisuudesta suurilla kustannuksilla.

Sen reitittimen portin välittämiseen, johon palvelin oli tarkoitus ottaa käyttöön, käytettiin sshtunnel-ohjelmaa. En kuvaile sen konfiguroinnin monimutkaisuutta - tämä tehdään melko helposti, huomaan vain, että sen tehtävänä oli välittää TCP-portti 1194 reitittimestä VPS:ään. Seuraavaksi OpenVPN-palvelin määritettiin tap0-laitteeseen, joka oli yhdistetty br-lan-sillalle. Kun oli tarkistettu yhteys äskettäin luotuun palvelimeen kannettavasta tietokoneesta, kävi selväksi, että portin edelleenlähetyksen idea oikeuttai itsensä ja kannettavastani tuli reitittimen verkon jäsen, vaikka se ei ollut fyysisesti siinä.

Asia jäi pieneksi: oli tarpeen jakaa IP-osoitteet eri asuntoihin, jotta ne eivät ole ristiriidassa, ja konfiguroida reitittimet OpenVPN-asiakkaiksi.
Seuraavat reitittimen IP-osoitteet ja DHCP-palvelinalueet valittiin:

  • 192.168.10.1 kantaman kanssa 192.168.10.2 - 192.168.10.80 palvelimelle
  • 192.168.10.100 kantaman kanssa 192.168.10.101 - 192.168.10.149 reitittimelle asunnossa nro 2
  • 192.168.10.150 kantaman kanssa 192.168.10.151 - 192.168.10.199 reitittimelle asunnossa nro 3

Oli myös tarpeen määrittää täsmälleen nämä osoitteet OpenVPN-palvelimen asiakasreitittimille lisäämällä rivi sen kokoonpanoon:

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

ja lisäämällä seuraavat rivit /etc/openvpn/ipp.txt-tiedostoon:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

missä flat1_id ja flat2_id ovat laitenimet, jotka määritetään luotaessa varmenteita OpenVPN-yhteyttä varten

Seuraavaksi reitittimille määritettiin OpenVPN-asiakkaat, molempien tap0-laitteet lisättiin br-lan-sillalle. Tässä vaiheessa kaikki näytti olevan kunnossa, koska kaikki kolme verkostoa näkevät toisensa ja toimivat kokonaisuutena. Ei kuitenkaan kovin miellyttävä yksityiskohta paljastui: joskus laitteet saattoivat saada IP-osoitteen muulla kuin reitittimestään kaikilla seurauksilla. Jostain syystä yhden asunnon reititin ei ehtinyt vastata DHCPDISCOVERiin ajoissa ja laite sai väärän osoitteen. Ymmärsin, että minun on suodatettava tällaiset pyynnöt jokaisen reitittimen tap0:ssa, mutta kuten kävi ilmi, iptables ei voi toimia laitteen kanssa, jos se on osa siltaa ja ebtablesin pitäisi tulla apuuni. Valitettavasti sitä ei ollut laiteohjelmistossani, ja minun piti rakentaa kuvat uudelleen jokaiselle laitteelle. Tekemällä tämän ja lisäämällä nämä rivit kunkin reitittimen /etc/rc.local-kansioon ongelma ratkesi:

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

Tämä kokoonpano kesti kolme vuotta.

Osa 2: Esittelyssä WireGuard

Viime aikoina Internet on puhunut yhä enemmän WireGuardista, ihaillen sen kokoonpanon yksinkertaisuutta, suurta siirtonopeutta, alhaista ping-arvoa ja vastaavaa turvallisuutta. Siitä lisätietojen etsiminen teki selväksi, että se ei tue työskentelyä siltajäsenenä tai TCP-protokollan yli, mikä sai minut ajattelemaan, ettei OpenVPN:lle ole edelleenkään vaihtoehtoja minulle. Joten lykkäsin WireGuardiin tutustumista.

Muutama päivä sitten tietotekniikkaan liittyvien resurssien kautta levisi tieto, että WireGuard tulee vihdoin mukaan Linux-ytimeen versiosta 5.6 alkaen. Uutisartikkelit, kuten aina, ylistivät WireGuardia. Syöksyin jälleen etsimään tapoja korvata vanha kunnon OpenVPN. Tällä kertaa törmäsin Tässä artikkelissa. Siinä puhuttiin Ethernet-tunnelin luomisesta L3:n yli GRE:n avulla. Tämä artikkeli antoi minulle toivoa. Jäi epäselväksi, mitä tehdä UDP-protokollan kanssa. Haku johti artikkeleihin socatin käyttämisestä yhdessä SSH-tunnelin kanssa UDP-portin välittämiseen, mutta he huomasivat, että tämä lähestymistapa toimii vain yhden yhteyden tilassa, mikä tarkoittaa, että useita VPN-asiakkaita olisi mahdotonta. Keksin idean perustaa VPN-palvelin VPS:ään ja asettaa GRE asiakkaille, mutta kuten kävi ilmi, GRE ei tue salausta, mikä johtaa siihen, että jos kolmannet osapuolet pääsevät palvelimelle , kaikki verkkojeni välinen liikenne on heidän käsissään, mikä ei sopinut minulle ollenkaan.

Jälleen päätettiin käyttää redundanttia salausta käyttämällä VPN:n yli VPN:ää seuraavan kaavan mukaan:

Layer XNUMX VPN:
VPS on palvelin sisäisellä osoitteella 192.168.30.1
MS on asiakas VPS, jonka sisäinen osoite on 192.168.30.2
MK2 on asiakas VPS, jonka sisäinen osoite on 192.168.30.3
MK3 on asiakas VPS, jonka sisäinen osoite on 192.168.30.4

Layer XNUMX VPN:
MS on palvelin ulkoisella osoitteella 192.168.30.2 ja sisäisellä 192.168.31.1
MK2 on asiakas MS jonka osoite on 192.168.30.2 ja sen sisäinen IP on 192.168.31.2
MK3 on asiakas MS jonka osoite on 192.168.30.2 ja sen sisäinen IP on 192.168.31.3

* MS - reititin-palvelin huoneistossa 1, MK2 - reititin huoneistossa 2, MK3 - reititin huoneistossa 3
* Laitekokoonpanot julkaistaan ​​artikkelin lopussa olevassa spoilerissa.

Ja niin, pingit verkon 192.168.31.0/24 solmujen välillä menevät, on aika siirtyä GRE-tunnelin asettamiseen. Ennen sitä, jotta pääsy reitittimiin ei menetä, kannattaa perustaa SSH-tunneleita portin 22 välittämiseksi VPS:lle, jotta esimerkiksi asunnon 10022 reititin on käytettävissä VPS:n portissa 2 ja reititin asunnosta 11122 on käytettävissä VPS:n portissa 3. reititin asunnosta XNUMX. On parasta konfiguroida edelleenlähetys samalla sshtunnelilla, koska se palauttaa tunnelin putoamisen varalta.

Tunneli on määritetty, voit muodostaa yhteyden SSH:hon edelleenlähetetyn portin kautta:

ssh root@МОЙ_VPS -p 10022

Poista seuraavaksi OpenVPN käytöstä:

/etc/init.d/openvpn stop

Perustetaan nyt GRE-tunneli asunnon 2 reitittimeen:

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

Ja lisää luotu käyttöliittymä siltaan:

brctl addif br-lan grelan0

Suoritetaan samanlainen toimenpide palvelimen reitittimessä:

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

Ja lisää myös luotu käyttöliittymä siltaan:

brctl addif br-lan grelan0

tästä hetkestä lähtien pingit alkavat mennä onnistuneesti uuteen verkkoon ja tyytyväisenä menen juomaan kahvia. Sitten nähdäkseni kuinka verkko toimii johdon toisessa päässä, yritän SSH:ta yhteen asunnon 2 tietokoneista, mutta ssh-asiakas jumiutuu pyytämättä minua salasanaa. Yritän muodostaa yhteyden tähän tietokoneeseen telnetin kautta portissa 22 ja näen rivin, josta voit ymmärtää, että yhteyttä muodostetaan, SSH-palvelin vastaa, mutta jostain syystä se ei tarjoa minulle pääsyä.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Yritän muodostaa yhteyden siihen VNC:n kautta ja näen mustan näytön. Vakuutan itseni, että asia on etätietokoneessa, koska voin helposti muodostaa yhteyden reitittimeen tästä asunnosta sisäisen osoitteen avulla. Päätän kuitenkin SSH:ta tähän tietokoneeseen reitittimen kautta ja olen yllättynyt siitä, että yhteys onnistuu ja etätietokone toimii hyvin, mutta ei myöskään saa yhteyttä tietokoneeseeni.

Otan grelan0-laitteen pois sillasta ja käynnistän OpenVPN:n asunnon 2 reitittimessä ja varmistan, että verkko toimii taas kunnolla ja yhteydet eivät katkea. Etsimällä törmään foorumeihin, joissa ihmiset valittavat samoista ongelmista, joissa heitä neuvotaan nostamaan MTU:ta. Ei ennemmin sanottu kuin tehty. Kuitenkin, kunnes MTU asetettiin riittävän suureksi arvoksi 7000 gretap-laitteille, joko TCP-yhteyksien katkeamista tai hidasta lähetystä havaittiin. Gretapin korkean MTU:n vuoksi ensimmäisen ja toisen tason WireGuard-yhteyksien MTU:t asetettiin arvoon 8000 ja 7500.

Tein samanlaisen asennuksen asunnon 3 reitittimelle, sillä ainoa ero on, että palvelinreitittimeen lisättiin toinen grelan1-niminen gretap-liitäntä, joka lisättiin myös br-lan-sillalle.

Kaikki toimii. Nyt voit laittaa gretap-kokoonpanon automaattiseen lataustilaan. Tätä varten:

Sijoitti nämä rivit asunnon 2 reitittimen kansioon /etc/rc.local:

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

Lisäsi tämän asunnon 3 reitittimen /etc/rc.local-kansioon:

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

Ja palvelimen reitittimessä:

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

Kun olin käynnistänyt asiakasreitittimet uudelleen, huomasin, että ne eivät jostain syystä muodostaneet yhteyttä palvelimeen. Yhdistämällä heidän SSH:han (onneksi olin aiemmin määrittänyt sshtunnelin tätä varten), havaittiin, että WireGuard jostain syystä luo reitin päätepisteelle, vaikka se on virheellinen. Joten 192.168.30.2:lle reittitaulukko määritettiin reittitaulukossa pppoe-wan-rajapinnan kautta eli Internetin kautta, vaikka reitti siihen olisi pitänyt ohjata wg0-rajapinnan kautta. Tämän reitin poistamisen jälkeen yhteys palautettiin. En löytänyt mistään ohjeita WireGuardin pakottamiseksi luomatta näitä reittejä. Lisäksi en edes ymmärtänyt, onko tämä OpenWRT:n vai WireGuardin ominaisuus. Ilman, että minun piti käsitellä tätä ongelmaa pitkään aikaan, lisäsin yksinkertaisesti molempiin reitittimiin ajastimen silmukoimaan skriptiin rivin, joka poisti tämän reitin:

route del 192.168.30.2

Yhteenveto

En ole vielä saavuttanut OpenVPN:n täydellistä hylkäämistä, koska minun täytyy joskus muodostaa yhteys uuteen verkkoon kannettavasta tietokoneesta tai puhelimesta, ja gretap-laitteen asentaminen niihin on yleensä mahdotonta, mutta tästä huolimatta sain tiedonsiirrossa etua. nopeus asuntojen välillä ja esimerkiksi VNC:n käyttö ei ole enää hankalaa. Ping laski hieman, mutta muuttui vakaammaksi:

Kun käytät 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

Kun käytät WireGuardia:

[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

Siihen vaikuttaa eniten korkea ping VPS:ään, joka on noin 61.5 ms

Nopeus on kuitenkin lisääntynyt huomattavasti. Joten asunnossa, jossa on reititin-palvelin, minulla on Internet-yhteyden nopeus 30 Mbps ja muissa asunnoissa 5 Mbps. Samaan aikaan OpenVPN:ää käytettäessä en pystynyt saavuttamaan yli 3,8 Mbps:n tiedonsiirtonopeutta verkkojen välillä iperfin mukaan, kun taas WireGuard "pumppasi" sen samaan 5 Mbps:iin.

WireGuard-kokoonpano VPS:ssä[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-kokoonpano MS:ssä (lisätty kansioon /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-kokoonpano MK2:ssa (lisätty kansioon /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-kokoonpano MK3:ssa (lisätty kansioon /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'

Kuvatuissa toisen tason VPN:n kokoonpanoissa määritän WireGuard-asiakkaille portin 51821. Teoriassa tämä ei ole välttämätöntä, koska asiakas muodostaa yhteyden mistä tahansa vapaasta ei-etuoikeutetusta portista, mutta tein sen niin, että kaikki saapuvat yhteydet voidaan estää kaikkien reitittimien wg0-liitännöissä, paitsi portin 51821 saapuvissa UDP-yhteyksissä.

Toivon, että artikkelista on hyötyä jollekin.

PS. Haluan myös jakaa skriptini, joka lähettää minulle PUSH-ilmoituksen puhelimeeni WirePusher-sovelluksessa, kun verkkooni ilmestyy uusi laite. Tässä linkki käsikirjoitukseen: github.com/r0ck3r/device_discover.

PÄIVITTÄÄ: OpenVPN-palvelimen ja asiakkaiden määritykset

OpenVPN-palvelin

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-asiakas

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

Käytin easy-rsaa varmenteiden luomiseen.

Lähde: will.com

Lisää kommentti