Nega ikkinchi VPN tunneli birinchisini buzadi?
Ikkinchi VPN mijozi ikkita yarim standart marshrut o'rnatadi va birinchi tunnel qorong'ilashadi: qaysi marshrut g'olib bo'lishini o'qing, so'ng profil, jadval yoki nomlar maydoni bo'yicha ajrating.
Bitta mijoz tarmog'iga yetib borish uchun ikkinchi VPN mijozini o'rnatish bu ishning odatdagi boshlanishi bo'lib, ikkala mijoz ham muvaffaqiyat xabar berayotganda birinchi tunnel qorong'ilashadi. Har bir mijoz standart marshrut o'rnatdi, ikkinchisi aniqroq edi, va yadro endi birinchi tunnelning o'z tashqi ulanishidan tashqari hamma narsa uchun unga ergashadi. Hech narsa qulab tushmadi va hech bir profil xato emas. Bir marshrut boshqasini almashtirdi, yechim esa standart marshrut qaysi tunnelga tegishli bo'lishini hal qilishdir.
Belgi: ikkinchi mijoz jimgina g'olib bo'ladi
OpenVPN: redirect-gateway def1 parametri 0.0.0.0/0 ni qayta yozmaydi. U 0.0.0.0/1 va 128.0.0.0/1 ni qo'shadi: ikkisi birgalikda har bir IPv4 manzilini qamrab oladi, va har bir prefiks uzunligi bo'yicha oddiy standartdan ustun. Asl standart jadvalda qoladi va oddiy trafik uchun ishlatilmaydi, VPN serveriga xost marshruti tunnelning o'z tashqi paketlarini ushlashiga yo'l qo'ymaydi. Ikkala mijoz ham shunday qiladi, ikkinchisi esa o'z juftini keyinroq o'rnatadi.
Shuning uchun birinchi tunnel uzilgan emas, o'lik ko'rinadi. Uning interfeysi ko'tarilgan, boshqaruv kanali tirik, va endi hech qanday dastur trafigi unga yetib bormaydi. Teskari shikoyat ham o'sha yo'qolgan pushdan keladi: ulanadigan, lekin hech narsa yubormaydigan telefon odatda redirect-gateway ni hech qachon e'lon qilmagan server bilan gaplashadi, shuning uchun qurilma o'z standartini saqlaydi va faqat hovuzga yetadi.
Ikkinchi mijoz ulanishidan oldin va keyin marshrutlar suratini oling. Jadvalda ko'rinadigan ikkita yarim marshrut butun o'zgarish bo'lib, ikkala shikoyatni ham tushuntiradi. Belgi ko'rinishi uchun jadvalda boshqa hech narsa qimirlamasligi kerak. Shuning uchun ikkinchi mijozni olib tashlash birinchisini darhol tiklaydi.
Qaysi tunnel haqiqatan g'olib bo'lishini o'qing
G'olibni mijozlar ishga tushgan tartibdan yoki tizim patnisidagi belgidan chiqarmang. Yadrodan ikkala xususiy tarmoqdan tashqaridagi manzil uchun qaysi marshrutni ishlatishini so'rang va qaytgan interfeysni o'qing.
ip route show
ip route get 198.51.100.24
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.24
Birinchi ikkitasi Linux javobi, oxirgi ikkitasi Windows ekvivalenti. Ikkala tunnel ham ko'tarilgan paytda ularni ishga tushiring, so'ng birini uzib yana ishga tushiring. Ikki chiqish orasidagi farq yechim tanlashdan oldin kerak bo'lgan fakt bo'lib, u har qanday mijozning jurnalini o'qishdan kamroq vaqt oladi.
Natijani yozib qo'ying, interfeys nomi va mos kelgan prefiks bilan birga. Ikkinchi VPN birinchisini buzdi degan chipta belgining tavsifi, hech kim amal qila oladigan marshrut bayonoti emas. Qidiruv uni keyingi muhandis bitta buyruq bilan takrorlay oladigan faktga aylantiradi.
Windows: bitta profil standart marshrutga ega bo'lishining oldini oling
Windows saqlangan profillarni saqlaydi, o'rnatilgan mijoz esa birining boshqasiga bog'liq bo'lishiga yo'l qo'yadi, shunda ikkinchisi ulanganda birinchisi avtomatik ko'tariladi. Eng oxirgi ulangan profil standart marshrutni saqlab qolishga moyil, shuning uchun amaliy egasi birinchi emas, oxirgi ulanishdir. Har bir profilga o'z push marshrutlarini bering va standart marshrutga ega bo'lmasligi kerak bo'lganiga split tunneling ni yoqing.
Set-VpnConnection -Name "Contoso" -SplitTunneling $true
rasdial Contoso
Split tunneling buni o'zgartiradi: jadvalga faqat server push qilgan prefikslar kiradi, bu standart marshrutni birinchi tunnelda qoldiradi. Ikkala server ham standart marshrut push qilsa, dizayn baribir muvaffaqiyatsiz bo'ladi, chunki unda oxirgi ulanish g'olib bo'ladi va mijoz tomonidagi hech qanday sozlama buni o'zgartirmaydi. Server tomonidagi push ni tuzating yoki bitta egasini qabul qiling.
Ilova bilan ishga tushadigan profillar boshqa xususiyat va bilib olishga arziydi: Windows profili nomlangan bajariluvchi fayl ishga tushganda boshlanishi mumkin, trafik filtrlari nima olib yurishini hal qiladi. Bu firewall qoidasi emas, profil sozlamasi, va standart marshrut mojarosidan boshqa muammoni hal qiladi.
Linux: ikkinchi tunnelni asosiy jadvaldan tashqarida saqlang
Bitta mashinada openvpn --config ning ikkita nusxasini ishga tushirish ikkala mijozni bir jadvalga qo'yadi, uchta variant ularni ortib boruvchi izolyatsiya bilan ajratadi. Eng yengili ikkinchi mijozga jadvalni umuman tahrirlashga yo'l qo'ymaslik: aniq marshrutlar bilan route-nopull yoki faqat niyat qilganingizni o'rnatadigan route-up skripti. Shunda ikkinchi tunnel aynan siz aytgan prefikslarni olib yuradi va boshqa hech narsani. Shunda qaysi prefiks qayerga borishini keyinroq kashf qilish o'rniga o'zingiz hal qilasiz.
Siyosat marshrutlash o'rta variant. Qoida bitta manba manzili yoki firewall belgisi uchun alohida jadval tanlaydi, va bu jadval ikkinchi tunnelning marshrutlarini olib yuradi. Bu yerda tuzoq teskari yo'l filtrlashdir, chunki jadval tanlagan interfeysdan boshqa interfeysga kelgan javob tashlab yuboriladi, shuning uchun tunnel buzilgan degan xulosaga kelishdan oldin rp_filter sozlamasini tekshiring.
ip rule add from 10.44.7.0/24 table 100
ip route add default dev tun1 table 100
sysctl net.ipv4.conf.all.rp_filter
Tarmoq nomlar maydonlari eng og'ir va eng toza variant. Ikkinchi mijozni ip netns ichida ishga tushiring, unga veth jufti bering va foydalanish uchun o'sha nomlar maydoniga kiring. Aralashuv yo'qoladi, chunki har bir nomlar maydoni bitta jadvalni bo'lishish o'rniga o'z jadvallariga ega, bu ikkala tunnel ham haftalab ko'tarilgan turishi kerak bo'lganda qo'shimcha sozlashga arziydi.
Ilova bo'yicha, va zanjirlash alohida muammo sifatida
Ba'zan faqat bitta dastur ikkinchi tunneldan foydalanishi kerak. Linuxda foydalanuvchi, cgroup yoki port bo'yicha siyosat marshrutlash shu natijaga erishadi, va bitta manzilni standartga umuman tegmasdan interfeysga bog'lash mumkin. O'z soketini bitta interfeysga bog'lagan ilova marshrut jadvaliga umuman murojaat qilmaydi, shuning uchun ishga tushiruvchi o'z sozlamalarida manzil tanlanguncha jismoniy adapterni ishlatishda davom etishi mumkin.
Zanjirlash ikkita tunnelni yonma-yon ishga tushirishdan boshqa amaldir. A ni B ustidan zanjirlash ichki server manzili tashqi tunnel ichidan yetib boriladigan bo'lishi kerakligini bildiradi. Tashqi mijoz ham ichki mijozning shifrlangan paketlarini oqish deb o'ylamasligi kerak. Virtual mashina ichidagi bitta mijoz qo'pol, lekin ishonchli variant; ikkisi bitta xostda bo'lsa, yuqoridagi marshrutlash ishi va ichki serverga qarab hech qachon ichki tunnelga kirmaydigan tashqi yo'l kerak.
Standartning egasini, har bir tunnel olib yuradigan prefikslar ro'yxatini va DNS yo'lini yozib qo'ying. O'sha uch fakt keyingi hodisani tekshiruv emas, qidiruvga aylantiradi.