Bitta Linux xostida ikkita OpenVPN mijozini fwmark bilan ulash
Ikkala mijoz ham standart marshrutni xohlaydi. Ichki serverni host-marshrut bilan mahkamlang, ikkinchi mijozning jadvallarni qayta yozishini to'xtating, so'ng oqimlarni fwmark bilan yo'naltiring.
Bitta Linux xostiga ikkinchi OpenVPN mijozini qo'shish ikki joydan birida muvaffaqiyatsiz tugaydi. Yoki ichki mijoz o'z serveriga yetib bora olmaydi, chunki tashqi tunnel bu transportni egallab olgan, yoki ikkinchi mijoz marshrut jadvalini qayta yozadi va birinchi tunnel ishlamay qoladi. Ikkala muammo ham marshrutlashda, shifrlashda emas, va ikkalasi ham yangi tunnel biron-bir ilova trafigini tashishdan oldin hal qilinadi. Bu yerdagi manzillar misol uchun: tun0 — tashqi tunnel, 203.0.113.9 — ichki server, TCP 9999 esa ichki yo'ldan foydalanishi kerak bo'lgan oqim.
Ikki nosozlik rejimi, bitta marshrut jadvali
Ichki mijoz o'z serveriga UDP soket ochadi va bu soket boshqalar kabi joriy marshrut jadvaliga ergashadi. Agar tashqi tunnel allaqachon standart marshrutni egallagan bo'lsa, qo'l berish paketlari tashqi tunnelga tushadi. Bu faqat tashqi server ichki serverga yeta olganda va qarshi tomon oqimni tashishga rozi bo'lganda ishlaydi; aks holda qo'l berish to'xtaydi va mijoz qayta urinadi.
Ikkinchi nosozlik serverning push xabaridan keladi. Odatiy push — redirect-gateway def1 bo'lib, u standart marshrutni almashtirish o'rniga 0.0.0.0/1 va 128.0.0.0/1 ni o'rnatadi. Shuning uchun o'zining /1 juftini o'rnatadigan ikki mijoz to'qnashadi va eng yangi juftlik deyarli har bir manzil uchun yutadi. Ikkinchisi ulangandan keyin tunnel o'lib qolsa, jadvaldan o'sha ikki prefiksni qidiring, chunki standart marshrutning o'zi hech qachon o'zgarmagan bo'lishi mumkin.
Oqimni belgilang va unga jadval bering
Tanlangan trafikni mangle jadvalida belgilab va siyosat qoidasida o'sha belgini moslashtirib yo'naltiring. Qoida standart marshruti ichki qurilma bo'lgan maxsus jadvalga ishora qiladi, shuning uchun faqat belgilangan paketlar ichki yo'ldan boradi.
iptables -t mangle -A PREROUTING -p tcp -m multiport --dport 9999 -j MARK --set-mark 0x9999
ip rule add fwmark 0x9999 table 200 pref 1000
ip route add default dev tun1 table 200Bu qoidalar to'plamidagi nosozliklarning ko'pchiligi ikki xatodan kelib chiqadi. Firewall o'rnatadigan belgi qiymati va qoida moslashtiradigan qiymat bir xil bo'lishi kerak, chunki farq na xato, na ta'sir beradi. Va PREROUTING faqat tashqaridan keladigan paketlarni ko'radi, shuning uchun bu xostda boshlangan ulanish belgilanishidan oldin bir xil moslikdagi OUTPUT qoidasini talab qiladi.
Marshrut egaligini ikkinchi mijozdan oling
Ikki variant ikkinchi mijozning jadvalni tahrirlashiga to'sqinlik qiladi va ular turli nuqtalarda ishlaydi. route-nopull push qilingan marshrut variantlarini e'tiborsiz qoldiradi, shuning uchun hech narsa o'rnatilmaydi. route-noexec push qilingan variantlarni mijoz muhitiga qabul qiladi, lekin jadval o'zgarishini hookka qoldiradi, va server nima taklif qilganini ko'rish kerak bo'lganda aynan shu kerak.
Hook push qilingan qiymatlar bilan o'z muhitida ishlaydi va faqat siz tasdiqlagan yozuvlarni qo'shishi kerak. Uni idempotent qiling: qayta qurishdan oldin o'zi egalik qiladigan jadvalni bo'shating va oldingi ishga tushirish toza holat qoldirgan deb o'ylamang. Qayta ulanish hookni yana chaqiradi, tozalamasdan qo'shadigan hook esa takroriy marshrutlarni to'playdi.
Bitta egasini tanlang va uni yozib qo'ying. Ikkala variantni ham o'rnatadigan profil yoki qo'lda yozilgan skript bilan raqobatlashadigan hook keyinchalik hech kim tushuntira olmaydigan jadval yaratadi.
Ikkala server manzilini mahkamlang
Ichki mijoz ulanishidan oldin ichki serverga tashqi qurilma orqali host-marshrut kerak. Aynan shu yozuv ichki transportni standart marshrutga ergashishiga yo'l qo'ymay, tashqi tunnel ichida ushlab turadi.
ip route add 203.0.113.9/32 dev tun0
ip route get 203.0.113.9Asosiy jadvalga tashqi server uchun ham mos host-marshrut qo'shing, aks holda qayta ulanish tashqi mijozning o'z transportini uning o'z tunneliga yo'naltirishi mumkin. Tartib majburiy: bu yozuvlarni tegishli interfeys paydo bo'lgandan keyin qo'shing, ya'ni ulanishdan keyin ishlaydigan hook yoki skript. O'chirilgan qurilmaga ishora qiluvchi marshrut olib tashlanadi yoki e'tiborsiz qoldiriladi, shuning uchun yuklanish vaqtida yozilgan yozuv siz taxmin qilgan ketma-ketlikdan o'tmaydi.
Butun jadvalni o'qish o'rniga qidiruvni tekshiring. Marshrut qidiruvining chiqishi kernel ishlatadigan qurilma va manba manzilini ko'rsatadi, va mijoz soketini ochganda aynan shuni oladi.
Zanjirni sinab ko'ring va nosozlikni ko'rinadigan qiling
Ichki mijoz ulanayotganda tashqi interfeysda ushlang. Ichki qo'l berish tashqi tunnel ichida shifrlangan yuk sifatida ko'rinishi kerak; agar u 203.0.113.9 tomon oddiy UDP bo'lib ko'rinsa, host-marshrut yo'q va zanjir hech qachon qurilmagan.
Jismoniy uplinkka jimgina qaytadigan zanjir eng yomon natija, chunki interfeys holati hech narsa e'lon qilmaydi va ichki trafik noto'g'ri manba manzilidan chiqadi. Agar tashqi tunnel yiqilganda ikkinchi mijoz to'g'ridan-to'g'ri qayta ulana olsa, o'sha yo'lni o'chiring yoki nosozlik ko'rinadigan bo'lishi uchun uni tashqi interfeysga bog'lang.
Ikki oqim va bitta qoida dumpi bilan yakunlang: belgilangan va belgilanmagan ulanish turli yo'llardan borishi kerak, ip rule show esa siz nazarda tutgan ustuvorlikni ko'rsatishi kerak. Agar ikkala oqim ham bir yo'ldan borsa, belgi siz o'ylagan joyda qo'llanmayapti.