Veguheztina ji OpenVPN berbi WireGuard-ê da ku toran di yek tora L2 de bicivîne

Veguheztina ji OpenVPN berbi WireGuard-ê da ku toran di yek tora L2 de bicivîne

Ez dixwazim ezmûna xwe ya berhevkirina toran di sê apartmanên erdnîgarî yên dûr de, ku her yek ji wan routerên OpenWRT-ê wekî dergehek bikar tîne, di yek tora hevpar de parve bikim. Dema ku rêbazek ji bo berhevkirina torên di navbera L3 bi rêvekirina jêrtorê û L2 bi pirê ve, gava ku hemî girêkên torê dê di heman jêrtorê de bi cih bibin, tercîh ji rêbaza duyemîn re hate dayîn, ku mîhengkirina wê dijwartir e, lê derfetên mezintir peyda dike, ji ber ku karanîna zelal a teknolojiyên di tora ku Wake-on-Lan û DLNA hatî afirandin de hate plan kirin.

Beş 1: Paşnav

OpenVPN di destpêkê de wekî protokola pêkanîna vê peywirê hate hilbijartin, ji ber ku, yekem, ew dikare amûrek tapek biafirîne ku bêyî pirsgirêk li pirê were zêdekirin, û ya duyemîn jî, OpenVPN piştgirî dide operasyona li ser protokola TCP, ku ev jî girîng bû, ji ber ku yek tune. ji apartmanan navnîşanek IP-ya diyarkirî hebû, û min nekarî STUN bikar bînim, ji ber ku pêşkêşvanê min ji ber hin sedeman girêdanên UDP-ê yên ji torên wan asteng dike, di heman demê de protokola TCP-ê hişt ku ez porta servera VPN-ê bişînim VPS-a kirêkirî bi karanîna SSH. Erê, ev nêzîkatî barek mezin dide, ji ber ku dane du caran têne şîfre kirin, lê min nexwest VPS-ê têxim nav tora xweya taybet, ji ber ku hîn jî xetera ku aliyên sêyemîn li ser wê bi dest bixin, ji ber vê yekê, xwedan amûrek wusa bû. li ser tora mala min pir nexwestî bû û biryar hat dayîn ku ji bo ewlehiyê bi sermayek mezin bidin.

Ji bo şandina porta li ser routerê ya ku tê plan kirin ku serverê lê were bicîh kirin, bernameya sshtunnel hate bikar anîn. Ez ê tevliheviyên veavakirina wê venabêjim - ew bi hêsanî pêk tê, ez ê tenê bi bîr bixim ku peywira wê ew bû ku porta TCP 1194 ji routerê berbi VPS-ê ve bişîne. Dûv re, servera OpenVPN li ser cîhaza tap0, ku bi pira br-lan ve girêdayî bû, hate mîheng kirin. Piştî ku girêdana bi servera nû hatî afirandin ji laptopê ve hatî kontrol kirin, eşkere bû ku ramana şandina portê rastdar bû û laptopa min bû endamê tora routerê, her çend ew bi fizîkî ne tê de bû.

Tenê tiştek piçûk mabû ku were kirin: pêdivî bû ku navnîşanên IP-ê li apartmanên cihêreng werin belavkirin da ku ew nakokî nebin û rêweran wekî xerîdarên OpenVPN-ê mîheng bikin.
Navnîşanên IP-ya routerê û rêzikên servera DHCP yên jêrîn hatin hilbijartin:

  • 192.168.10.1 bi range 192.168.10.2 - 192.168.10.80 ji bo serverê
  • 192.168.10.100 bi range 192.168.10.101 - 192.168.10.149 ji bo routerê li apartmana jimare 2
  • 192.168.10.150 bi range 192.168.10.151 - 192.168.10.199 ji bo routerê li apartmana jimare 3

Di heman demê de pêdivî bû ku bi lêzêdekirina rêzê li mîhengê wê, van navnîşan tam ji rêwerzên xerîdar ên servera OpenVPN re were veqetandin:

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

û rêzikên jêrîn li pelê /etc/openvpn/ipp.txt zêde bikin:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

ku flat1_id û flat2_id navên cîhazê ne ku dema afirandina sertîfîkayên ji bo girêdana bi OpenVPN-ê ve têne destnîşan kirin

Dûv re, xerîdarên OpenVPN li ser rêgezan hatin mîheng kirin, amûrên tap0 li ser herduyan li pira br-lan hatin zêdekirin. Di vê qonaxê de, her tişt baş xuya bû ji ber ku her sê toran dikarin hevûdu bibînin û wekî yek bixebitin. Lêbelê, hûrguliyek ne pir xweş derket holê: carinan cîhaz dikaribûn navnîşanek IP-yê ne ji routerê xwe bistînin, digel hemî encamên wê. Ji ber hin sedeman, routerê di yek ji apartmanan de wext tunebû ku di wextê de bersivê bide DHCPDISCOVER û cîhaz navnîşek ku ne armanc bû wergirt. Min fêm kir ku pêdivî ye ku ez daxwazên weha di tap0-ê de li ser her yek ji routeran fîlter bikim, lê wekî ku derket holê, iptables nikare bi cîhazê re bixebite heke ew beşek pirek be û ebtables divê werin alîkariya min. Bi xemgîniya min, ew ne di firmware min de bû û min neçar ma ku ji bo her cîhazê wêneyan ji nû ve ava bikim. Bi kirina vê yekê û lê zêdekirina van rêzan li /etc/rc.local her routerê pirsgirêk çareser bû:

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

Vê veavakirinê sê salan domand.

Beş 2: Danasîna WireGuard

Di van demên dawî de, mirovên li ser Înternetê her ku diçe zêde dest bi axaftinê li ser WireGuard kirine, heyranê sadebûna veavakirina wê, leza bilind a veguheztinê, ping kêm bi ewlekariya berawirdî. Lêgerîna bêtir agahdarî di derbarê wê de eşkere kir ku ne wekî endamek pirek xebitîn û ne jî li ser protokola TCP-ê xebitîn ji hêla wê ve nehat piştgirî kirin, ku ez difikirim ku hîn jî ji min re alternatîfên OpenVPN tune. Ji ber vê yekê min nasîna WireGuard paş xist.

Çend roj berê, nûçeyek li ser çavkaniyan bi rengekî an yekî din bi IT-ê ve girêdayî belav bû ku WireGuard dê di dawiyê de di nav kernel Linux de, bi guhertoya 5.6-ê dest pê bike. Gotarên nûçeyan, wekî her gav, pesnê WireGuard dan. Ez dîsa ketim nav lêgerîna awayên ku li şûna OpenVPN-ya kevnar a baş biguhezînim. Vê carê ez ketim nav vê gotarê. Ew li ser afirandina tunelek Ethernet li ser L3 bi karanîna GRE re axivî. Vê gotarê hêvî da min. Ne diyar ma ku bi protokola UDP re çi bike. Lêgerînê min birin gotarên di derbarê karanîna socat bi tunelek SSH re ji bo pêşdebirina portek UDP, lêbelê, wan destnîşan kir ku ev nêzîkatî tenê di moda girêdana yekane de dixebite, ango, karê çend xerîdarên VPN dê ne mumkun be. Min ramana sazkirina serverek VPN li ser VPS-ê û sazkirina GRE-yê ji bo xerîdaran hat, lê wekî ku derket holê, GRE piştgirî nade şîfrekirinê, ku dê bibe sedema vê yekê ku ger aliyên sêyemîn bigihîjin serverê , hemî seyrûsefera di navbera torên min de dê di destên wan de be, ku qet li min nedihat.

Carek din, biryar di berjewendiya şîfrekirina zêde de, bi karanîna VPN-ê li ser VPN-ê bi karanîna pilana jêrîn hate girtin:

Asta XNUMX VPN:
VPS Ev e server bi navnîşana navxweyî 192.168.30.1
MS Ev e kirrîxwaz VPS bi navnîşana navxweyî 192.168.30.2
MK2 Ev e kirrîxwaz VPS bi navnîşana navxweyî 192.168.30.3
MK3 Ev e kirrîxwaz VPS bi navnîşana navxweyî 192.168.30.4

VPN asta duyemîn:
MS Ev e server bi navnîşana derveyî 192.168.30.2 û navxweyî 192.168.31.1
MK2 Ev e kirrîxwaz MS bi navnîşana 192.168.30.2 û IP-ya navxweyî 192.168.31.2 heye
MK3 Ev e kirrîxwaz MS bi navnîşana 192.168.30.2 û IP-ya navxweyî 192.168.31.3 heye

* MS - router-server di apartmana 1 de, MK2 - router di apartmana 2 de, MK3 - router di apartmana 3 de
* Veavakirinên cîhazê di dawiya gotarê de di spoiler de têne weşandin.

Bi vî rengî, ping di navbera girêkên torê 192.168.31.0/24 de dimeşin, ew dem e ku em biçin sazkirina tunelek GRE. Berî vê yekê, ji bo ku gihîştina routeran winda nebe, hêja ye ku hûn tunelên SSH-ê saz bikin da ku porta 22-ê ji VPS-ê re bişînin, da ku, mînakî, routerê ji daîreya 10022-ê li porta 2 ya VPS-ê bigihîje, û router ji apartmana 11122-ê dê li ser porta 3 routerê ji apartmana XNUMX-ê bigihîje. Baştir e ku meriv şandinê bi karanîna heman sshtunnelê mîheng bike, ji ber ku heke têk biçe ew ê tunelê sererast bike.

Tunel hatiye mîheng kirin, hûn dikarin bi riya porta şandinê ve bi SSH-ê ve girêdin:

ssh root@МОЙ_VPS -p 10022

Piştre divê hûn OpenVPN neçalak bikin:

/etc/init.d/openvpn stop

Naha em werin tunelek GRE li ser routerê ji daîreya 2 saz bikin:

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

Û pêveka çêkirî li pirê zêde bikin:

brctl addif br-lan grelan0

Ka em li ser routerê serverê pêvajoyek wusa pêk bînin:

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

Û her weha navbeynkariya çêkirî li pirê zêde bikin:

brctl addif br-lan grelan0

ji vê gavê dest pê dike, ping dest pê dike ku bi serfirazî biçin tora nû û ez, bi dilxweşî, diçim qehweyê vexwim. Dûv re, ji bo ku binirxînim ka torê çawa li dawiya rêzê dixebite, ez hewl didim ku SSH-ê li yek ji komputerên apartmana 2-ê bikim, lê xerîdar ssh bêyî ku şîfreyek bixwaze dicemidîne. Ez hewl didim ku bi rêya telnetê ya li ser porta 22-ê bi vê komputerê ve girêbidim û ez rêzek dibînim ku ez jê fam dikim ku pêwendiyek tê saz kirin, servera SSH bersivê dide, lê ji ber hin sedeman ew tenê ji min napirse ku têkevim li.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Ez hewl didim ku bi VNC ve pê ve girêbidim û ekranek reş bibînim. Ez xwe îqna dikim ku pirsgirêk bi komputera dûr ve ye, ji ber ku ez dikarim bi hêsanî bi navnîşana hundurîn ve ji vê apartmanê ve bi routerê ve girêbidim. Lêbelê, ez biryar da ku ez bi riya routerê ve bi SSH-ya vê komputerê ve girêbidim û ez şaş dimînim ku pêwendiyek serketî ye, û komputera ji dûr ve pir normal dixebite, lê ew jî nikare bi komputera min ve were girêdan.

Ez cîhaza grelan0 ji pirê derdixim û OpenVPN-ê li ser routerê di apartmana 2-ê de dimeşînim û pê ewle dibim ku tor dîsa wekî ku tê hêvî kirin dixebite û têkilî neyên avêtin. Bi lêgerînê re ez rastî foruman têm ku mirov li ser heman pirsgirêkan gilî dikin, li wir ji wan re tê şîret kirin ku MTU bilind bikin. Ne zû got. Lêbelê, heya ku MTU têra xwe bilind hate danîn - 7000 ji bo cîhazên gretap, an girêdanên TCP daketin an jî rêjeyên veguhastinê yên kêm hatin dîtin. Ji ber MTU-ya bilind a ji bo gretap, MTU-yên ji bo pêwendiyên Layer 8000 û Layer 7500 WireGuard bi rêzdarî XNUMX û XNUMX hatine danîn.

Min li ser routerê ji apartmana 3-ê vesaziyek wusa pêk anî, bi tenê cûdahiya wê ev e ku navgînek duyemîn a gretap a bi navê grelan1 li routerê serverê hate zêdekirin, ku ew jî li pira br-lan hate zêdekirin.

Her tişt dixebite. Naha hûn dikarin meclîsa gretap têxin destpêkê. Ji bo vê:

Min van rêzan li /etc/rc.local li ser routerê di apartmana 2 de danîn:

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

Ev li /etc/rc.local li ser routerê li apartmana 3 zêde kir:

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

Û li ser routerê serverê:

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

Piştî ku rêwerzên xerîdar ji nû ve dest pê kir, min kifş kir ku ji ber hin sedeman ew bi serverê ve nayên girêdan. Piştî ku bi SSH-ya wan ve girêdayî bû (bextane, min berê sshtunnel ji bo vê yekê mîheng kiribû), hate kifş kirin ku WireGuard ji ber hin sedeman rêyek ji bo xala dawiyê diafirîne, lê ew xelet bû. Ji ber vê yekê, ji bo 192.168.30.2, tabloya rêgezê rêyek bi navgîniya pppoe-wan, ango bi navgîniya Înternetê ve destnîşan kir, her çend rêwîtiya ber bi wê ve diviyabû ku bi navgîniya wg0 ve were rêve kirin. Piştî jêbirina vê rêyê, pêwendî hate vegerandin. Min nekarî li her deverê rêwerzan bibînim ka meriv çawa zorê bide WireGuard ku van rêgezan neafirîne. Wekî din, min tewra fam nekir gelo ev taybetmendiyek OpenWRT an WireGuard bixwe ye. Bêyî ku ez ji bo demek dirêj bi vê pirsgirêkê re mijûl bibim, min bi tenê rêzek li her du rêgezan di skrîptek demdar de zêde kir ku ev rê jêbirin:

route del 192.168.30.2

Hilberîn

Min hîn negihîştiye tam dev ji OpenVPN, ji ber ku ez carinan hewce dikim ku ji laptop an têlefonê bi tora nû ve girêbidim, û sazkirina amûrek gretap li ser wan bi gelemperî ne gengaz e, lê digel vê yekê, min di lezê de avantajek girt. veguheztina daneyê di navbera apartmanan de û, mînakî, karanîna VNC êdî ne nerehet e. Ping hinekî kêm bû, lê aramtir bû:

Dema ku OpenVPN bikar bînin:

[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

Dema ku WireGuard bikar bînin:

[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

Ew ji hêla ping-a bilind a VPS-ê, ku bi qasî 61.5 ms-ê ye, bêtir bandor dike

Lêbelê, lezgeh pir zêde bûye. Ji ber vê yekê, di apartmanek bi routerek serverê de leza pêwendiya înternetê ya min 30 Mbit / sec heye, û di apartmanên din de ew 5 Mbit / sec e. Di heman demê de, dema ku OpenVPN bikar tîne, min nekaribû leza veguheztina daneyê di navbera torên ji 3,8 Mbit / sec de li gorî xwendinên iperf-ê bi dest bixim, dema ku WireGuard ew bi heman 5 Mbit / sec "zêde kir".

Veavakirina WireGuard li ser VPS[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

Veavakirina WireGuard li ser MS (li /etc/config/torê hate zêdekirin)

#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'

Veavakirina WireGuard li MK2 (li /etc/config/torê hate zêdekirin)

#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'

Veavakirina WireGuard li MK3 (li /etc/config/torê hate zêdekirin)

#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'

Di veavakirinên diyarkirî yên ji bo VPN-a asta duyemîn de, ez xerîdarên WireGuard destnîşan dikim porta 51821. Di teoriyê de, ev ne hewce ye, ji ber ku xerîdar dê ji her porta bêdestûr a belaş têkiliyek saz bike, lê min ew wusa çêkir ku qedexekirina gengaz bû hemî girêdanên gihîştinê yên li ser navgînên wg0 yên hemî routeran ji bilî girêdanên UDP yên hatina porta 51821.

Ez hêvî dikim ku gotar dê ji bo kesek kêrhatî be.

PS Di heman demê de, ez dixwazim skrîpta xwe ya ku di serîlêdana WirePusher de agahdariyek PUSH ji têlefona min re dişîne dema ku amûrek nû li ser tora min xuya dibe parve bikim. Li vir lînka skrîptê ye: github.com/r0ck3r/device_discover.

Keskîn: Veavakirina server û xerîdar OpenVPN

Pêşkêşkara OpenVPN

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

Xerîdar OpenVPN

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

Min hêsan-rsa bikar anî da ku sertîfîkayan çêbikin

Source: www.habr.com

Add a comment