
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
Ushbu vazifani amalga oshirish uchun tanlangan protokol dastlab OpenVPN, chunki, birinchidan, u ko'prikka hech qanday muammosiz qo'shilishi mumkin bo'lgan kran qurilmasini yaratishi mumkin, ikkinchidan, OpenVPN U TCP ni qo'llab-quvvatlaydi, bu ham muhim edi, chunki kvartiralarning hech birida alohida IP-manzil yo'q edi. Men STUN dan foydalana olmadim, chunki mening internet-provayderim, negadir, o'z tarmoqlaridan kiruvchi UDP ulanishlarini bloklaydi. TCP menga VPN server portini SSH yordamida ijaraga olingan VPS ga yo'naltirishga imkon berdi. Bu yondashuv ma'lumotlar ikki marta shifrlanganligi sababli katta xarajatlarni keltirib chiqarsa-da, men VPS ni shaxsiy tarmog'imga integratsiya qilishni xohlamadim, chunki uchinchi tomonlar uni nazorat qilish xavfi bor edi. Shuning uchun, uy tarmog'imda bunday qurilmaga ega bo'lish juda istalmagan edi, shuning uchun men xavfsizlik uchun katta xarajatlarni to'lashga qaror qildim.
Server joylashtirilishi rejalashtirilgan routerdagi portni yo'naltirish uchun men sshtunnel dasturidan foydalandim. Men uning konfiguratsiyasi tafsilotlariga to'xtalmayman — bu juda oson. Shunchaki uning maqsadi TCP portining 1194 ni routerdan VPS ga yo'naltirish ekanligini ta'kidlayman. Keyin, men serverni sozladim. OpenVPN br-lan ko'prigiga ulangan tap0 qurilmasida. Noutbukimdan yangi yaratilgan serverga ulanishni sinab ko'rgandan so'ng, portni yo'naltirish g'oyasi ish bergani va noutbukim router tarmog'ining a'zosiga aylangani ma'lum bo'ldi, garchi u jismonan uning bir qismi bo'lmasa ham.
Faqatgina IP-manzillarni turli kvartiralarda tarqatish kerak edi, shunda ular bir-biriga zid kelmasligi va marshrutizatorlarni quyidagicha sozlashlari kerak edi OpenVPN-mijozlar.
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, ushbu manzillarni mijoz routerlariga tayinlash kerak edi. OpenVPN-server, konfiguratsiyasiga quyidagi qatorni qo'shish orqali:
ifconfig-pool-persist /etc/openvpn/ipp.txt 0va /etc/openvpn/ipp.txt fayliga quyidagi qatorlarni qo'shing:
flat1_id 192.168.10.100
flat2_id 192.168.10.150
bu yerda flat1_id va flat2_id ulanish uchun sertifikatlar yaratishda ko'rsatilgan qurilma nomlari OpenVPN
Keyin, marshrutizatorlar sozlandi OpenVPN- mijozlar, ikkalasidagi tap0 qurilmalari br-lan ko'prigiga qo'shildi. Bu vaqtda hamma narsa yaxshi ko'rinardi, chunki uchta tarmoq ham bir-birini ko'ra olar va bitta birlik sifatida ishlay olardi. Biroq, juda yoqimsiz tafsilot paydo bo'ldi: ba'zida qurilmalar noto'g'ri routerdan IP-manzilni qabul qilar edi va buning oqibatlari ham bor edi. Nimagadir, kvartiralardan biridagi router DHCPDISCOVERga o'z vaqtida javob bermadi va qurilma noto'g'ri manzilni oldi. Men har bir routerda tap0 da bunday so'rovlarni filtrlashim kerakligini angladim, ammo ma'lum bo'lishicha, iptables ko'prikning bir qismi bo'lsa, qurilma bilan ishlay olmaydi, shuning uchun men ebtables dan foydalanishim kerak edi. Afsuski, mening dasturiy ta'minotimda u yo'q edi, shuning uchun men har bir qurilma uchun tasvirlarni qayta tiklashim kerak edi. Buni qilgandan va har bir routerda /etc/rc.local ga quyidagi qatorlarni qo'shgandan so'ng, 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: Tanishuv WireGuard
So'nggi paytlarda internetda bu haqda ko'proq gap-so'zlar bo'lmoqda WireGuard, konfiguratsiyaning qulayligi, yuqori uzatish tezligi, past ping va taqqoslanadigan xavfsizlikka qoyil qoldim. U haqida qo'shimcha ma'lumot qidirish natijasida u na ko'prik a'zosi, na TCP protokoli qo'llab-quvvatlashini qo'llab-quvvatlamasligi aniqlandi, bu esa menga boshqa alternativa yo'qligiga ishonishimga sabab bo'ldi. OpenVPN Men uchun u hali ham yo'q. Shuning uchun men tanishishni keyinga qoldirdim WireGuard.
Bir necha kun oldin, IT bilan bog'liq resurslar orqali yangiliklar u yoki bu tarzda tarqaldi WireGuard nihoyat yadroga kiritiladi Linux, 5.6 versiyasidan boshlab. Yangiliklar maqolalari, har doimgidek, maqtovga sazovor bo'ldi WireGuardMen yana bir bor eski yaxshi narsalarni almashtirish yo'llarini izlashga kirishdim OpenVPNBu safar men duch keldim . 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 10022Keyin o'chirib qo'yishingiz kerak OpenVPN:
/etc/init.d/openvpn stopEndi 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, uni ishga tushiraman OpenVPN 2-kvartiradagi routerda men tarmoq yana to'g'ri ishlayotganini va ulanishlar uzilmaganini tasdiqladim. Qidiruv davomida odamlar bir xil muammolar haqida shikoyat qilayotgan va ularga MTU ni oshirish tavsiya etilgan forumlarga duch keldim. Aytish kerakki, bu amalga oshdi. Biroq, MTU yetarlicha yuqori - gretap qurilmalari uchun 7000 - o'rnatilmaguncha, men TCP ulanishlarining uzilishi yoki past uzatish tezligini boshdan kechirdim. Gretap uchun yuqori MTU tufayli ulanishlar uchun MTU WireGuard Birinchi va ikkinchi darajalar mos ravishda 8000 va 7500 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 routerlarini qayta ishga tushirgandan so'ng, men biron sababga ko'ra ular serverga ulanmayotganini aniqladim. Ularning SSH-ga ulanganimdan so'ng (yaxshiyamki, men buning uchun avval sshtunnel-ni sozlagan edim), men buni aniqladim WireGuard Nimagadir, u oxirgi nuqta uchun marshrut yaratadi, lekin noto'g'ri. Masalan, 192.168.30.2 uchun marshrut jadvali pppoe-wan interfeysi orqali, ya'ni internet orqali marshrutni ko'rsatdi, garchi unga yo'nalish wg0 interfeysi orqali yo'naltirilishi kerak edi. Ushbu marshrutni o'chirib tashlagandan so'ng, ulanish tiklandi. Qanday qilib majburlash bo'yicha ko'rsatmalarni biron bir joydan topsam bo'ladimi? WireGuard Men bu marshrutlarni yaratishdan qochib qutula olmadim. Bundan tashqari, men bu OpenWRT yoki uning xususiyati ekanligini ham tushunmadim WireGuardMuammoni aniqlashga ko'p vaqt sarflamasdan, men shunchaki ikkala routerda ham taymerga asoslangan skriptga ushbu marshrutni o'chirib tashlagan qator qo'shdim:
route del 192.168.30.2
yasar ekan
To'liq rad etish OpenVPN Men hali bunga erisha olmadim, chunki vaqti-vaqti bilan noutbuk yoki telefondan yangi tarmoqqa ulanishim kerak bo'ladi va ularga gretap qurilmasini o'rnatish odatda imkonsiz. Biroq, shunga qaramay, men kvartiralar o'rtasida ma'lumotlar uzatish tezligida ustunlikka erishdim va masalan, VNC dan foydalanish endi muammosiz. Ping biroz kamaydi, lekin barqarorroq bo'ldi:
Foydalanishda 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
Foydalanishda 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
Bunga ko'proq VPS-ga yuqori ping ta'sir qiladi, bu taxminan 61.5 ms
Biroq, tezlik sezilarli darajada oshdi. Shunday qilib, router-serverga ega kvartirada internetga ulanish tezligim 30 Mbit/s ni tashkil qiladi, boshqa kvartiralarda esa 5 Mbit/s. Bundan tashqari, foydalanish paytida OpenVPN iperf ko'rsatkichlariga ko'ra, tarmoqlar o'rtasida 3,8 Mbit/s dan yuqori ma'lumotlar uzatish tezligiga erisha olmadim, shu bilan birga WireGuard uni xuddi shu 5 Mbit/soniyagacha "pompaladi".
Konfiguratsiya WireGuard VPS’da[Interface]
Address = 192.168.30.1/24
ListenPort = 51820
PrivateKey = <ЗАКРЫТЫЙ_КЛЮЧ_ДЛЯ_VPS>
[Tengdosh]
Ommaviy kalit = <VPN_1_MS_PUBLIC_KEY>
Ruxsat berilgan IPlar = 192.168.30.2/32
[Tengdosh]
Ommaviy kalit = <VPN_2_MK2_PUBLIC_KEY>
Ruxsat berilgan IPlar = 192.168.30.3/32
[Tengdosh]
Ommaviy kalit = <VPN_2_MK3_PUBLIC_KEY>
Ruxsat berilgan IPlar = 192.168.30.4/32
Konfiguratsiya WireGuard MS da (/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'
Konfiguratsiya WireGuard MK2 da (/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'
Konfiguratsiya WireGuard MK3 da (/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 mijozlarga ko'rsataman WireGuard 51821-port. Bu shart emas, chunki mijoz istalgan bepul, imtiyozsiz portdan ulanish o'rnatadi, lekin men buni shunday qildim, shunda 51821-portga kiruvchi UDP ulanishlaridan tashqari barcha routerlarning wg0 interfeyslaridagi barcha kiruvchi ulanishlarni rad etishim mumkin edi.
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: .
UPDATE: Konfiguratsiya OpenVPN- serverlar va mijozlar
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-mijoz
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
