Men tashqaridan boshladim, foydalanuvchi qiladigandek: nomni mobil internetdagi telefon brauzeriga yozdim va ulanish vaqt tugaguncha osilib turganini kuzatdim. Nom yechilardi, demak DNS joyida edi. Uy routerining port yo‘naltirish sahifasi ham boshi berk ko‘cha bo‘ldi, chunki uning WAN manzili 100.64.31.42 ko‘rsatdi, va bu provayder meni internetdan yo‘naltiradigan manzil emas. Bu raqam butun nosozlikni tushuntiradi: liniya carrier-grade NAT orqasida, ya‘ni tunnelning mening tomonimdagi ommaviy manzili provayderga tegishli. Quyida o‘sha ilinib qolgan varaqdan javob beradigan xizmatgacha bosib o‘tgan yo‘lim keltiriladi.

Mijozdan boshla va ichkariga qarab yur

Har qanday qoidani o‘zgartirishdan oldin zanjirning qayerda to‘xtashini isbotla. Noutbukda dig +short files.example.net buyrug‘ini ishga tushirdim va VPS manzilini qaytarib oldim, bu mashinamdagi eskirgan DNSni istisno qildi. Keyin curl -v --connect-timeout 5 files.example.net:5022 rad etilish o‘rniga vaqt tugashiga uchradi. Bu farq muhim: vaqt tugashi odatda paketlarning yo‘lda tashlanishini bildiradi, rad etish esa biror narsa javob berib yo‘q deganini bildiradi.

Ichkariga qarab keyingi qadam VPSning o‘zi edi. ss -ltnp 5022da tinglayotgan hech narsa ko‘rsatmadi, bu DNAT qoidasi paydo bo‘lishidan oldin kutilgan holat edi. Xuddi shu mashinada wg show (yoki OpenVPN uchun ip -br a show tun0) uy peer'i ishlayotganini va yangi handshake borligini tasdiqladi. Peer ishlamasa, hech qanday NAT qoidasi yordam bermaydi, va uy routerining VPN sahifasidagi yashil chiroq hech narsani bildirmaydi.

Uy liniyasi haqiqatan CGNAT orqasida ekanini tasdiqla

Router WAN interfeysida e'lon qilgan manzilni tashqi xizmat ko‘radigan manzil bilan solishtir. 100.64.0.0/10 ichidagi hamma narsa, ya'ni 100.64.x.x dan 100.127.x.x gacha, RFC 6598 dagi umumiy manzillar diapazoni va internetdan yetib bo‘lmaydi. Router oddiy shaxsiy manzil bor deb da'vo qilib, ommaviy so‘rov aloqasiz narsa qaytarganda ham xuddi shu xulosaga kelasan. CGNAT liniyasi keyingi lease gacha amal qiladigan ommaviy manzil bilan ham kelishi mumkin, shuning uchun port yo‘naltirish bir soat ishlayotgandek ko‘rinadi va keyin jimgina o‘ladi.

Ba'zi provayderlar haqiqatan haqiqiy ommaviy manzil beradi, lekin turar-joy hisoblarida kiruvchi 80 va 443 portlarini bloklaydi. Xizmating faqat veb bo‘lsa va WAN manzili haqiqatan ommaviy bo‘lsa, relay qurishdan oldin qo‘llab-quvvatlashdan so‘ra. Aks holda, quyidagi loyiha har bir portga birdek tegishli, va tajribani router tomonida to‘xtatishga arziydi: provayder tarmog‘idagi tarjimon ulanishni sening WAN interfeysingga yetmasdan turib tugatadi.

Nomni VPS manziliga yo‘naltir

DNS trafikni uzatmaydi, shuning uchun xizmatning A yozuvida VPSning ommaviy manzili bo‘lishi kerak. 192.168.1.20 ga yo‘naltirilgan A yozuvi faqat VPN ichidagi mijozlar uchun foydali yechiladi; internetdan hech kim yo‘naltira olmaydigan manzilga yechiladi. VPSning o‘z ma'muriy kirishi uchun alohida nom saqlayman, yozuv qaysi hostga tegishli ekanini hech qachon chalkashtirmaslik uchun.

Agar ham VPS, ham uy mashinasi HTTP xizmat qilsa, har biriga o‘z nomini ber va kim javob berishini VPS hal qilsin. Ularni bitta nomga qo‘shib, proksi to‘g‘ri backend tanlaydi deb umid qilish — aynan noto‘g‘ri hostda yarim kun xato izlashga olib keladi.

Bitta port DNAT, SSH 22da qolsin

To‘g‘ridan-to‘g‘ri variant — VPSda manzil NAT. Ishlab turgan yadro uchun forwardingni yoq va qoidada uy serverining tunnel manzilini saqla, LAN manzilini emas:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d 198.51.100.10 --dport 5022 -j DNAT --to-destination 10.8.0.2

VPSning o‘ziga SSHni 22da qoldir va boshqa portni, masalan 5022ni, uy mashinasiga yo‘naltir. 22ni o‘chirilgan mashinaga yo‘naltirsang, uni tuzata oladigan yagona yo‘lni yo‘qotasan. Xuddi shu mantiq proksi uchun ham amal qiladi: VPSning boshqaruv portini relay qoidalaridan tashqarida saqla.

Qoidalar ishlay boshlaganda ularni doimiy qil. Debian yoki Ubuntuda apt install iptables-persistent va keyin netfilter-persistent save ularni /etc/iptables/rules.v4 fayliga yozadi. firewalld bor hostda ekvivalenti — zonada doimiy port yo‘naltirish, u qo‘llanishdan oldin firewall-cmd --reload talab qiladi. Faqat xotirada yashaydigan qoidalar provayderning birinchi texnik xizmat qayta yuklanishida yo‘qoladi, odatda yomon soatda.

Qaytish yo‘lini tuzat yoki unga ehtiyojdan qoch

DNAT faqat manzilni qayta yozadi. Uy serveri ulanishni asl mijoz manzilidan ko‘radi, va agar uning standart marshruti uy routeriga ketsa, javob uy WANidan chiqadi, u yerda provayderning tarjimoni uni tashlaydi. Bu asimmetriya DNAT qoidasi butunlay to‘g‘ri ko‘ringandan keyin uchragan ikkinchi nosozlik edi.

Ikki tuzatish ishlaydi. Uy mashinasiga siyosat marshruti ber, tunneldan kelgan trafik tunnel orqali qaytsin:

ip rule add from 10.8.0.2 table 100
ip route add default dev wg0 table 100

Yoki VPS manbani qayta yozsin, javobning yeta oladigan manzili bo‘lsin, va conntrack uni chiqishda teskari aylantirsin:

iptables -t nat -A POSTROUTING -d 10.8.0.2 -p tcp --dport 5022 -j SNAT --to-source 10.8.0.1

SNAT versiyasi haqiqiy mijoz manzilini uy serveridan yashiradi, shuning uchun ilova jurnallari peer sifatida 10.8.0.1 ko‘rsatadi. Asl manzilni ilova darajasida uzat yoki mijoz bo‘yicha jurnal yo‘qolishini qabul qil, lekin buni hodisa paytida aniqlash o‘rniga ongli ravishda hal qil.

Butun yo‘lni tashqaridan tekshir

Na VPS, na uy bo‘lmagan tarmoqdan tekshir: mobil internetdagi telefon yoki boshqa joydagi arzon shell. nc -vz files.example.net 5022 muvaffaqiyatli ulanish haqida xabar berishi kerak, openssl s_client -connect files.example.net:443 -servername files.example.net esa ommaviy nom uchun sertifikatni ko‘rsatishi kerak. Keyin provayderning xavfsizlik guruhini yoki bulut firewallini tekshir. Hech qachon paket ko‘rmaydigan DNAT qoidasi odatda hostdan bir qatlam yuqorida bloklanadi.

Nihoyat, tunnel yiqilganda nima bo‘lishini hal qil. DNAT qoidasi ulanishlarni qabul qilishda davom etadi va ularni jimgina o‘lik tunnelga uzatadi, bu esa aynan buzilgan xizmatga o‘xshaydi. VPSda peer ishlamaguncha portni rad etadigan salomatlik tekshiruvi bir necha satrga tushadi va bir soat taxminni tejaydi. Shundan keyin qoidalarni tahrirlashni to‘xtat va unga ishonishdan oldin bir kun kuzat.

O'xshash maqolalar