Tarmoqlarni bitta L2 tarmog'iga birlashtirish uchun OpenVPN-dan WireGuard-ga o'tish

Tarmoqlarni bitta L2 tarmog'iga birlashtirish uchun OpenVPN-dan WireGuard-ga o'tish

Men har biri OpenWRT routerlarini shlyuz sifatida ishlatadigan uchta geografik olis xonadonlardagi tarmoqlarni bitta umumiy tarmoqqa birlashtirish tajribam bilan o‘rtoqlashmoqchiman. Barcha tarmoq tugunlari bir xil quyi tarmoqda bo'lganda, L3 va L2 o'rtasidagi tarmoqlarni pastki tarmoq marshrutlash bilan birlashtirish usulini tanlashda, ikkinchi usulga ustunlik berildi, uni sozlash qiyinroq, lekin ko'proq imkoniyatlar beradi, chunki Wake-on-Lan va DLNA yaratilayotgan tarmoqda texnologiyalardan shaffof foydalanish rejalashtirilgan edi.

1-qism: Fon

OpenVPN dastlab ushbu vazifani amalga oshirish uchun protokol sifatida tanlangan, chunki birinchidan, u ko'prikka muammosiz qo'shilishi mumkin bo'lgan teginish moslamasini yaratishi mumkin, ikkinchidan, OpenVPN TCP protokoli orqali ishlashni qo'llab-quvvatlaydi, bu ham muhim edi, chunki hech kim Kvartiralarning birida maxsus IP-manzil bor edi va men STUN-dan foydalana olmadim, chunki mening provayderim negadir ularning tarmoqlaridan kiruvchi UDP ulanishlarini bloklaydi, TCP protokoli esa VPN-server portini SSH-dan foydalangan holda ijaraga olingan VPS-ga yo'naltirishga imkon berdi. Ha, bu yondashuv katta yuk beradi, chunki ma'lumotlar ikki marta shifrlangan, lekin men o'zimning shaxsiy tarmog'imga VPS-ni kiritishni xohlamadim, chunki uchinchi shaxslar uni nazorat qilish xavfi hali ham mavjud edi, shuning uchun bunday qurilmaga ega bo'lish. Mening uy tarmog'im juda istalmagan edi va xavfsizlik uchun katta xarajatlar bilan to'lashga qaror qilindi.

Serverni joylashtirish rejalashtirilgan marshrutizatordagi portni yo'naltirish uchun sshtunnel dasturi ishlatilgan. Men uning konfiguratsiyasining nozik tomonlarini tasvirlamayman - bu juda oson, shuni ta'kidlaymanki, uning vazifasi TCP port 1194-ni yo'riqnomadan VPS-ga yo'naltirish edi. Keyinchalik, OpenVPN serveri br-lan ko'prigiga ulangan tap0 qurilmasida sozlangan. Noutbukdan yangi yaratilgan serverga ulanishni tekshirgandan so'ng, portni yo'naltirish g'oyasi oqlanganligi va mening noutbukim jismonan bo'lmasa ham, router tarmog'iga a'zo bo'lganligi ma'lum bo'ldi.

Bitta kichik ish qoldi: IP-manzillarni turli kvartiralarda taqsimlash kerak edi, shunda ular bir-biriga zid bo'lmasligi va routerlarni OpenVPN mijozlari sifatida sozlashlari kerak edi.
Quyidagi router IP manzillari va DHCP server diapazonlari tanlangan:

  • 192.168.10.1 diapazon bilan 192.168.10.2 - 192.168.10.80 server uchun
  • 192.168.10.100 diapazon bilan 192.168.10.101 - 192.168.10.149 2-sonli kvartirada router uchun
  • 192.168.10.150 diapazon bilan 192.168.10.151 - 192.168.10.199 3-sonli kvartirada router uchun

Shuningdek, OpenVPN serverining mijoz routerlariga uning konfiguratsiyasiga qatorni qo'shish orqali aynan shu manzillarni belgilash kerak edi:

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

va /etc/openvpn/ipp.txt fayliga quyidagi qatorlarni qo'shing:

flat1_id 192.168.10.100
flat2_id 192.168.10.150

bu erda flat1_id va flat2_id OpenVPN-ga ulanish uchun sertifikatlar yaratishda ko'rsatilgan qurilma nomlari

Keyinchalik, OpenVPN mijozlari marshrutizatorlarda sozlandi, ikkalasida tap0 qurilmalari br-lan ko'prigiga qo'shildi. Ushbu bosqichda hamma narsa yaxshi bo'lib tuyuldi, chunki barcha uchta tarmoq bir-birini ko'rishi va birdek ishlashi mumkin edi. Biroq, unchalik yoqimli bo'lmagan tafsilot paydo bo'ldi: ba'zida qurilmalar o'zlarining routeridan emas, balki IP-manzilni olishlari mumkin edi, bu esa barcha oqibatlarga olib keladi. Ba'zi sabablarga ko'ra, kvartiralarning biridagi yo'riqnoma o'z vaqtida DHCPDISCOVER ga javob berishga ulgurmadi va qurilma mo'ljallanmagan manzilni oldi. Men har bir marshrutizatorda tap0-da bunday so'rovlarni filtrlashim kerakligini tushundim, ammo ma'lum bo'lishicha, iptables qurilma bilan ishlay olmaydi, agar u ko'prikning bir qismi bo'lsa va ebtables yordamga kelishi kerak. Afsuski, bu mening proshivkamda yo'q edi va men har bir qurilma uchun tasvirlarni qayta tiklashim kerak edi. Buni qilish va har bir routerning /etc/rc.local-ga ushbu qatorlarni qo'shish orqali muammo hal qilindi:

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

Ushbu konfiguratsiya uch yil davom etdi.

2-qism: WireGuard bilan tanishish

So'nggi paytlarda Internetdagi odamlar WireGuard haqida tobora ko'proq gapira boshladilar, uning konfiguratsiyasining soddaligi, yuqori uzatish tezligi, taqqoslanadigan xavfsizlik bilan past pingga qoyil qolishdi. Bu haqda qo'shimcha ma'lumot izlash, na ko'prik a'zosi sifatida ishlash, na TCP protokoli ustida ishlashni qo'llab-quvvatlamasligini aniq ko'rsatdi, bu meni OpenVPN-ga hali ham alternativa yo'q deb o'ylashga majbur qildi. Shuning uchun WireGuard bilan tanishishni keyinga qoldirdim.

Bir necha kun oldin WireGuard 5.6 versiyasidan boshlab, nihoyat Linux yadrosiga qo'shilishi haqida IT bilan bog'liq bo'lgan manbalar bo'ylab xabar tarqaldi. Yangilik maqolalari, har doimgidek, WireGuardni maqtadi. Men yana eski yaxshi OpenVPN-ni almashtirish yo'llarini qidirishga kirishdim. Bu safar men duch keldim Ushbu maqola. Bu GRE yordamida L3 orqali chekilgan tunnelini yaratish haqida gapirdi. Bu maqola menga umid baxsh etdi. UDP protokoli bilan nima qilish kerakligi noma'lum bo'lib qoldi. Qidiruv meni UDP portini yo'naltirish uchun SSH tunnel bilan birgalikda socat-dan foydalanish haqidagi maqolalarga olib keldi, ammo ular bu yondashuv faqat bitta ulanish rejimida ishlashini, ya'ni bir nechta VPN mijozlarining ishi imkonsiz bo'lishini ta'kidladilar. Men VPS-ga VPN serverini o'rnatish va mijozlar uchun GRE-ni o'rnatish g'oyasi bilan chiqdim, ammo ma'lum bo'lishicha, GRE shifrlashni qo'llab-quvvatlamaydi, bu esa uchinchi shaxslar serverga kirish huquqiga ega bo'lishiga olib keladi. , mening tarmoqlarim orasidagi barcha trafik ularning qo'lida bo'ladi, bu menga umuman to'g'ri kelmadi.

Yana bir bor qaror VPN orqali VPN orqali quyidagi sxema bo'yicha ortiqcha shifrlash foydasiga qabul qilindi:

XNUMX-darajali VPN:
VPS u server 192.168.30.1 ichki manzili bilan
MS u mijoz 192.168.30.2 ichki manzilli VPS
MK2 u mijoz 192.168.30.3 ichki manzilli VPS
MK3 u mijoz 192.168.30.4 ichki manzilli VPS

Ikkinchi darajali VPN:
MS u server tashqi manzil 192.168.30.2 va ichki 192.168.31.1 bilan
MK2 u mijoz MS 192.168.30.2 manzili va ichki IP 192.168.31.2
MK3 u mijoz MS 192.168.30.2 manzili va ichki IP 192.168.31.3

* MS - 1-kvartiradagi router-server, MK2 - 2-kvartiradagi router, MK3 - 3-kvartirada router
* Qurilma konfiguratsiyasi maqola oxiridagi spoylerda e'lon qilingan.

Shunday qilib, pinglar 192.168.31.0/24 tarmoq tugunlari o'rtasida ishlaydi, GRE tunnelini o'rnatishga o'tish vaqti keldi. Bundan oldin, marshrutizatorlarga kirish imkoniyatini yo'qotmaslik uchun, masalan, 22-kvartiradagi yo'riqnoma VPS-ning 10022-portida foydalanish mumkin bo'lishi uchun 2-portni VPS-ga yo'naltirish uchun SSH tunnellarini o'rnatish kerak. 11122-kvartiradan marshrutizatorga 3-portda XNUMX-kvartiradan yo'riqnoma kirish mumkin. Xuddi shu sshtunnel yordamida yo'naltirishni sozlagan ma'qul, chunki u muvaffaqiyatsiz bo'lsa tunnelni tiklaydi.

Tunnel sozlangan, siz SSH ga uzatilgan port orqali ulanishingiz mumkin:

ssh root@МОЙ_VPS -p 10022

Keyin OpenVPN-ni o'chirib qo'yishingiz kerak:

/etc/init.d/openvpn stop

Endi 2-kvartiradan marshrutizatorda GRE tunnelini o'rnatamiz:

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

Va yaratilgan interfeysni ko'prikka qo'shing:

brctl addif br-lan grelan0

Xuddi shunday protsedurani server routerida bajaramiz:

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

Shuningdek, yaratilgan interfeysni ko'prikka qo'shing:

brctl addif br-lan grelan0

Shu paytdan boshlab, pinglar yangi tarmoqqa muvaffaqiyatli o'ta boshlaydi va men mamnuniyat bilan qahva ichishga boraman. Keyin, tarmoqning boshqa uchida qanday ishlashini baholash uchun men 2-kvartiradagi kompyuterlardan biriga SSH ni o'tkazishga harakat qilaman, lekin ssh mijozi parol so'ramasdan muzlaydi. Men ushbu kompyuterga 22-portdagi telnet orqali ulanishga harakat qilyapman va men ulanish o'rnatilayotganini, SSH serveri javob berayotganini tushunishim mumkin bo'lgan qatorni ko'raman, lekin negadir u meni tizimga kirishni so'ramaydi. ichida.

$ telnet 192.168.10.110 22
SSH-2.0-OpenSSH_8.1

Men unga VNC orqali ulanishga harakat qilaman va qora ekranni ko'raman. Muammo uzoq kompyuterda ekanligiga o'zimni ishontiraman, chunki ichki manzildan foydalanib, ushbu kvartiradan routerga osongina ulanishim mumkin. Biroq, men ushbu kompyuterning SSH-ga marshrutizator orqali ulanishga qaror qildim va ulanish muvaffaqiyatli ekanligini va masofaviy kompyuterning normal ishlashini ko'rib hayronman, lekin u ham mening kompyuterimga ulana olmaydi.

Men grelan0 qurilmasini ko'prikdan olib tashlayman va 2-kvartiradagi routerda OpenVPN-ni ishga tushiraman va tarmoq yana kutilganidek ishlashiga va ulanishlar uzilmaganiga ishonch hosil qilaman. Qidiruv orqali men odamlar bir xil muammolar haqida shikoyat qiladigan forumlarni uchrataman, ularda MTUni ko'tarish tavsiya etiladi. Aytilgan gap otilgan o'q. Biroq, MTU etarlicha yuqori - gretap qurilmalari uchun 7000 o'rnatilgunga qadar, TCP ulanishlari pasaygan yoki past uzatish tezligi kuzatilgan. Gretap uchun yuqori MTU tufayli, Layer 8000 va Layer 7500 WireGuard ulanishlari uchun MTUlar mos ravishda XNUMX va XNUMX ga o'rnatildi.

Men 3-kvartiradagi yo'riqnomada shunga o'xshash sozlashni amalga oshirdim, yagona farq shundaki, grelan1 nomli ikkinchi gretap interfeysi server routerga qo'shildi, u ham br-lan ko'prigiga qo'shildi.

Hammasi ishlayapti. Endi siz gretap majmuasini ishga tushirishga qo'yishingiz mumkin. Buning uchun:

Men ushbu qatorlarni 2-kvartiradagi routerda /etc/rc.local-ga joylashtirdim:

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

Buni 3-kvartiradagi routerda /etc/rc.local-ga qo'shdi:

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

Va server routerida:

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

Mijoz marshrutizatorlarini qayta ishga tushirgandan so'ng, men negadir ular serverga ulanmayotganligini aniqladim. Ularning SSH-ga ulangandan so'ng (xayriyatki, men buning uchun sshtunnelni oldindan sozlagan edim), WireGuard negadir so'nggi nuqta uchun marshrut yaratayotgani aniqlandi, ammo bu noto'g'ri. Shunday qilib, 192.168.30.2 uchun marshrut jadvali pppoe-wan interfeysi, ya'ni Internet orqali marshrutni ko'rsatdi, garchi unga marshrut wg0 interfeysi orqali yo'naltirilgan bo'lishi kerak edi. Ushbu marshrutni o'chirib tashlaganingizdan so'ng, ulanish tiklandi. Men WireGuard-ni ushbu marshrutlarni yaratmaslikka majburlash bo'yicha ko'rsatmalarni hech qanday joyda topa olmadim. Bundan tashqari, men bu OpenWRT yoki WireGuardning o'ziga xos xususiyati ekanligini ham tushunmadim. Uzoq vaqt davomida ushbu muammoni hal qilmasdan, men ikkala marshrutizatorga ushbu marshrutni o'chirib tashlagan vaqtli skriptga bir qator qo'shdim:

route del 192.168.30.2

yasar ekan

Men hali OpenVPN-dan butunlay voz kechishga erishmadim, chunki men ba'zan noutbuk yoki telefondan yangi tarmoqqa ulanishim kerak bo'ladi va ularda ulanish moslamasini o'rnatish umuman mumkin emas, ammo shunga qaramay, men tezlikda ustunlikka ega bo'ldim. kvartiralar o'rtasida ma'lumotlarni uzatish va, masalan, VNC-dan foydalanish endi noqulay emas. Ping biroz pasaydi, lekin barqarorroq bo'ldi:

OpenVPN-dan foydalanganda:

[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

WireGuard-dan foydalanganda:

[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

Bunga ko'proq VPS-ga yuqori ping ta'sir qiladi, bu taxminan 61.5 ms

Biroq, tezlik sezilarli darajada oshdi. Shunday qilib, server routeri bo'lgan kvartirada menda Internetga ulanish tezligi 30 Mbit / sek, boshqa kvartiralarda esa 5 Mbit / sek. Shu bilan birga, OpenVPN-dan foydalanganda men iperf ko'rsatkichlari bo'yicha tarmoqlar o'rtasida 3,8 Mbit/sekunddan ortiq ma'lumotlarni uzatish tezligiga erisha olmadim, WireGuard esa uni xuddi shu 5 Mbit/sekundgacha "ko'tardi".

VPS-da WireGuard konfiguratsiyasi[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

MS da WireGuard konfiguratsiyasi (/etc/config/network ga qo'shilgan)

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

MK2 da WireGuard konfiguratsiyasi (/etc/config/network ga qo'shilgan)

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

MK3 da WireGuard konfiguratsiyasi (/etc/config/network ga qo'shilgan)

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

Ikkinchi darajali VPN uchun tavsiflangan konfiguratsiyalarda men WireGuard mijozlarini 51821 portiga yo'naltiraman. Nazariy jihatdan, bu shart emas, chunki mijoz har qanday bepul imtiyozsiz portdan ulanish o'rnatadi, lekin men buni taqiqlash mumkin bo'lgan tarzda qildim. 0 portiga kiruvchi UDP ulanishlaridan tashqari barcha routerlarning wg51821 interfeyslaridagi barcha kiruvchi ulanishlar.

Umid qilamanki, maqola kimgadir foydali bo'ladi.

PS Shuningdek, men tarmog'imda yangi qurilma paydo bo'lganda WirePusher ilovasida telefonimga PUSH bildirishnomasini yuboradigan skriptimni baham ko'rmoqchiman. Bu erda skriptga havola: github.com/r0ck3r/device_discover.

UPDATE: OpenVPN server va mijozlar konfiguratsiyasi

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

OpenVPN mijozi

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

Sertifikatlarni yaratish uchun easy-rsa dan foydalandim

Manba: www.habr.com

a Izoh qo'shish