Tunnel orqali uzoqdagi /24 ga yetib borish: NETMAP, DNAT yoki marshrut?
Butun prefiksni NETMAP bilan xaritalang, har bir xost uchun DNAT qoidalarini qo'shing yoki haqiqiy diapazonni marshrutlang, va uzoq tomon nimani ko'rishi va kim trafikni boshlashi mumkinligi asosida qaror qiling.
Tunnel oxirgi nuqtasi orqasidagi quyi tarmoqqa uch yo'l bilan yetib borishingiz mumkin, va bir daqiqalik fakt yig'ish odatda ikkitasini inkor etadi. Faktlar: u yerdagi serverlar foydalanuvchilarni ajratishi kerakmi, u yerdan kimdir qachondir sizning diapazoningizga ulanadimi, va uzoq tomondagi routerni kim tahrirlay oladi. Shu uchtasiga javob bering, dizayn o'zi tanlanadi. Qolgani siz oxirgi nuqtani boshqarasiz va uning xavfsizlik devorini tahrirlay olasiz deb faraz qiladi.
Uch variant va har biri aslida nimani o'zgartiradi
Prefiksni xaritalash, har bir xost uchun DNAT va marshrutlangan prefiks barchasi bir xil ikki diapazon orasida paketlarni ko'chiradi, lekin turli narsalarni o'zgartiradi. Xaritalash alias diapazonini o'ylab topadi va yo'lda manzillarni arifmetik tarzda qayta yozadi. Har bir xost qoidalari ham qayta yozadi, faqat har bir manzil qo'lda nomlanadi. Marshrutlangan prefiks hech narsani qayta yozmaydi: paketlar haqiqiy manzillarni saqlaydi va ikki tomon bu manzillar qayerda yashashini kelishadi.
| What the far side needs | Prefix mapping | Per-host DNAT | Routed prefix |
|---|---|---|---|
| Users visible to its logs | Only without source NAT | Same condition | Yes, unchanged |
| To start a connection toward you | No, alias is local | No, same reason | Yes, both ends route |
| To absorb a new host | Yes, arithmetic only | No, one rule per address | Yes, it simply routes |
| To require no config change | Yes, with source NAT | Yes, same condition | No, it needs a route back |
Olib tashlashni uzoq tomondan boshlang, cheklovlarni o'zgartirish eng qiyin joy o'sha yerda. Agar u yerdagi server mijoz manzillarini jurnallarga yozsa, ularni ruxsat ro'yxati bilan tekshirsa yoki boshqa tizimga topshirsa, manbani tarjima qilish uning yagona identifikatorini yo'q qiladi. Agar uzoq tomon ham ichkariga ulanishi kerak bo'lsa, tarjima butunlay istisno, chunki u yerda hech kim alias borligini bilmaydi. Uzoq tomon faqat so'rovlarga javob berganida arzon variantlar xavfsiz bo'ladi.
Prefiks juftlari va nima uchun o'lchamlar mos kelishi kerak
NETMAP — bu bir xil uzunlikdagi prefikslar juftida ishlaydigan nat jadvalining maqsadi. Ichida har bir manzil uchun jadval yo'q: u prefiksni olib tashlaydi, xost bitlarini saqlaydi va ularni yangi prefiksga qayta bog'laydi, shuning uchun /24 /24 ga xaritalanadi va hech qachon /25 ga emas. Joylashuv yo'nalishni belgilaydi: PREROUTING dagi manzil mosligi paket qayerga ketishini qayta yozadi, POSTROUTING dagi manba mosligi u qayerdan kelganini qayta yozadi.
192.168.2.17 dagi xost sizning mijozlaringizga 10.50.1.17 bo'lib ko'rinadi, oxirgi oktet bezak emas — u ikki tomonda bir xil raqam. Ertaga 192.168.2.40 ga xost qo'shing, uning aliasi 10.50.1.40 bo'ladi, tahrirlanadigan qoida yo'q.
Mijozlarga alias diapazoni uchun sizning qutingizga ko'rsatuvchi marshrut hali kerak, agar alias ular allaqachon yetib boradigan quyi tarmoq ichida bo'lmasa. Shlyuzga alias uchun marshrut kerak emas, chunki manzil tarjimasi marshrut qidiruvidan oldin PREROUTING da bajariladi. Forwarding ham yoqilgan bo'lishi kerak, aks holda yadro qayta yozgandan keyin paketni tashlaydi. Quyidagi uch buyruq mijozlar br0 da, alias 10.50.1.0/24 da va tunnel tun0 da bo'lgan Debian uslubidagi shlyuzdagi butun konfiguratsiya.
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -i br0 -d 10.50.1.0/24 -j NETMAP --to 192.168.2.0/24
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADEJavob qaytish yo'lini o'zi topishi kerak
Manzilni qayta yozish faqat paket qayerga yetkazilishini hal qiladi. Uzoqdagi server hali ham o'zi yetib boradigan manzilga javob berishi kerak, va buni ikki usulda tashkil qilish mumkin. Javoblar qutingizga qaytishi uchun manbani tarjima qiling, yoki manbani qoldirib, uzoq tomonga mijoz diapazoni uchun marshrut bering.
Chiqish tomonidagi masquerade qisqaroq yo'l: POSTROUTING da bitta qoida va uzoq tomon sizning tunnel manzilingizni ko'radi, shuning uchun o'z marshrutiga ehtiyoj yo'q. Narxi — har bir foydalanuvchi bitta manzilga siqiladi va foydalanuvchi bo'yicha jurnallar ma'nosini yo'qotadi. Manbani butun qoldirish bu ma'lumotni saqlaydi, lekin unda uzoqdagi sayt mijoz diapazoni javoblarini tunnel orqali qaytarishi kerak.OpenVPN serverida bu push qilingan push "route 10.50.9.0 255.255.255.0", shuningdek route 192.168.2.0 255.255.255.0 qator.
Qimmat muvaffaqiyatsizlik — har birining yarmini qilish. Agar trafikning bir qismini masquerade qilsangiz, uzoq tomon boshqa trafik uchun qaytish marshrutini ham olib yursa, javoblar ulanish kuzatuvi yozuvi hech qachon ko'rilmagan interfeysga keladi. Mijoz server xizmat ko'rsatilgan deb yozgan so'rov uchun timeout haqida xabar beradi. Oqimning ikkala yo'nalishi ham bir xil netfilter nusxasidan o'tishi kerak: bitta shlyuz tarjima qiladi, ketma-ket ikkita xavfsizlik devori emas.
conntrack -L -d 10.50.1.17
iptables -t nat -L PREROUTING -v -nYozuvni ikkala yo'nalishda o'qing: asl tuple manzilda sizning aliasni saqlaydi, javob tuple haqiqiy manzilni olib yuradi. Agar javob tuple yo'q bo'lsa, muammo qoidada emas, qaytish yo'lida. Agar PREROUTING hisoblagichlari hech qachon qimirlamasa, paket bu hook ga hech qachon yetmagan.
To'qnashuvlar va birinchi ishlaydigan qidiruv
Ikki xil diapazon to'qnashishi mumkin, va ikkala nosozlik yomon qoida emas, buzilgan tunnel kabi ko'rinadi. Siz o'ylab topgan alias butun yo'lda ishlatilmagan bo'lishi kerak, va haqiqiy uzoq diapazon sizning tarmog'ingizda allaqachon mavjud bo'lmasligi kerak. Dublikat vaqti-vaqti bilan noto'g'ri xostga trafik keltiradi, uni rad etilgan ulanishdan diagnostika qilish qiyinroq. Qoida qo'shishdan oldin marshrut jadvalidan so'rang.
Shlyuzda, ip route get 192.168.2.17 tunnel qurilmasini nomlashi kerak; mahalliy bridge uzoq diapazon soyada qolganini bildiradi va hech qanday nat qoidasi uni tuzatmaydi. Agar tarmog'ingiz allaqachon 192.168.2.0/24 dan foydalansa, to'qnashuv ustiga xaritalash qo'yish o'rniga uzoqdagi saytni qayta raqamlang.
Haqiqiy mijozdan sinash, so'ng saqlash
Aliasni haqiqatan ishlatadigan mashinadan sinang, shlyuzdan emas, chunki mahalliy yaratilgan trafik PREROUTING dan hech qachon bir xil o'tmaydi. Aliasli bitta xostga ulanish ochib, hisoblagichlar va conntrack yozuvi birga paydo bo'lishini kuzating, so'ng yoping va yozuv ketishini tasdiqlang. Eskirgan yozuv yarim ochiq ulanishni ko'rsatadi, bu odatda javob hech qachon qaytmaganini bildiradi.
curl -sv http://10.50.1.17/ -o /dev/null
ss -tn dst 10.50.1.17
conntrack -L -d 10.50.1.17Ikki yoki uch muvaffaqiyatli ulanish arifmetikani isbotlaydi, lekin barqarorlik yoki keyingi injener haqida hech narsa demaydi. Qoidalarni yuklash jarayoni o'qiydigan joyda saqlang, bu Debian va Ubuntu da iptables-save > /etc/iptables/rules.v4 netfilter-persistent yoqilgan holda degani. Qayta yuklashda yo'qoladigan xaritalash yo'qdan yomonroq, chunki uzilish ayblash mumkin bo'lgan yaqin o'zgarishsiz keladi.
Qoidalar yonida eslatma qoldiring: alias diapazoni, haqiqiy diapazon, juftlik sababi va qaysi tomon boshlashi mumkin. Bu eslatma dizaynni hech kim o'chirishga jur'at etmaydigan qoidalar uyumidan ajratadi. U keyingi savolni ham hal qiladi: uzoqdagi sayt xost qo'shganda, hech kim sozlamagan manzil allaqachon javob beradi. Agar eslatmada uzoq tomonga qaytish marshruti kerak deb yozilgan bo'lsa, keyingi odam masquerade qoidasini olib tashlash ulanishni uzishini biladi. Bu yerda hujjatlashtirish arzon; tun o'rtasida NAT bog'liqligini qayta kashf qilish arzon emas.