10-bo‘lim

NAT va xususiy tarmoqlar

Nima uchun NAT paydo bo'ldi, tarjima jadvali qanday ishlaydi, port yo'naltirish, NAT ning xavfsizlikka ta'siri va u buzgan narsalar.

🕑 7 daqiqa o‘qish 📄 745 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Muammo: manzillar yetmaydi
  2. Tarjima jadvali
  3. Ichkariga kirish: port yo'naltirish
  4. NAT turlari
  5. Xulosa

Uyingizdagi har bir qurilmada 192.168.1.x ko'rinishidagi manzil bor. Bu manzillar internetda ishlamaydi - ular butun dunyoda takrorlanadi.

Shunday bo'lsa ham, hammasi bemalol internetga chiqadi. Buni NAT ta'minlaydi.

Muammo: manzillar yetmaydi #

1990-yillar o'rtalarida IPv4 manzillari tugayotgani ayon bo'ldi. IPv6 ishlab chiqilayotgan edi, lekin unga o'tish sekin kechardi.

Vaqtinchalik yechim sifatida NAT taklif qilindi: butun tarmoqni bitta ommaviy manzil ortiga yashirish.

"Vaqtinchalik" yechim o'ttiz yildan beri ishlab turibdi.

Bitta ommaviy manzil ortidagi tarmoq Ichki tarmoq 192.168.1.10:51000 192.168.1.20:51000 192.168.1.30:60123 manzillar takrorlanadi NAT jadval yuritadi portni almashtiradi Internet ko'radigan manzar 84.54.72.19:40000 84.54.72.19:40001 84.54.72.19:40002 bitta IP, har xil portlar Server uchun uchalasi ham bitta kompyuterdek ko'rinadi Ularni faqat NAT jadvali ajrata oladi Jadval yo'qolsa - barcha ulanishlar uziladi
NAT bir necha ming qurilmani bitta manzil ortiga sig'dira oladi

Tarjima jadvali #

NAT ning butun ishi - jadval yuritish. Ichkaridan chiqqan har ulanish uchun u yangi tashqi port ajratadi va eslab qoladi.

Python
class Nat:
    """Eng sodda NAT: ichki (IP, port) -> tashqi port."""

    def __init__(self, tashqi_ip):
        self.tashqi_ip = tashqi_ip
        self.jadval = {}          # tashqi port -> ichki (ip, port)
        self.teskari = {}         # ichki (ip, port) -> tashqi port
        self.keyingi_port = 40000

    def chiqish(self, ichki_ip, ichki_port, manzil):
        kalit = (ichki_ip, ichki_port)
        if kalit not in self.teskari:
            self.teskari[kalit] = self.keyingi_port
            self.jadval[self.keyingi_port] = kalit
            self.keyingi_port += 1
        tashqi_port = self.teskari[kalit]
        print(f"  chiqish: {ichki_ip}:{ichki_port} -> "
              f"{self.tashqi_ip}:{tashqi_port} -> {manzil}")
        return tashqi_port

    def kirish(self, tashqi_port):
        kalit = self.jadval.get(tashqi_port)
        if kalit is None:
            print(f"  kirish : {self.tashqi_ip}:{tashqi_port} -> "
                  f"jadvalda yo'q, TASHLANDI")
            return None
        print(f"  kirish : {self.tashqi_ip}:{tashqi_port} -> "
              f"{kalit[0]}:{kalit[1]}")
        return kalit


nat = Nat("84.54.72.19")

print("--- uch qurilma tashqariga chiqadi")
p1 = nat.chiqish("192.168.1.10", 51000, "93.184.216.34:443")
p2 = nat.chiqish("192.168.1.20", 51000, "93.184.216.34:443")
p3 = nat.chiqish("192.168.1.10", 51001, "8.8.8.8:53")

print()
print("--- javoblar qaytadi")
nat.kirish(p2)
nat.kirish(p1)
nat.kirish(p3)

print()
print("--- tashqaridan kutilmagan ulanish")
nat.kirish(45000)

print()
print("jadvaldagi yozuvlar soni:", len(nat.jadval))
print("ikki qurilma bir xil ichki portdan chiqdi, lekin")
print("tashqi portlari har xil:", p1 != p2)
Natija
--- uch qurilma tashqariga chiqadi
  chiqish: 192.168.1.10:51000 -> 84.54.72.19:40000 -> 93.184.216.34:443
  chiqish: 192.168.1.20:51000 -> 84.54.72.19:40001 -> 93.184.216.34:443
  chiqish: 192.168.1.10:51001 -> 84.54.72.19:40002 -> 8.8.8.8:53

--- javoblar qaytadi
  kirish : 84.54.72.19:40001 -> 192.168.1.20:51000
  kirish : 84.54.72.19:40000 -> 192.168.1.10:51000
  kirish : 84.54.72.19:40002 -> 192.168.1.10:51001

--- tashqaridan kutilmagan ulanish
  kirish : 84.54.72.19:45000 -> jadvalda yo'q, TASHLANDI

jadvaldagi yozuvlar soni: 3
ikki qurilma bir xil ichki portdan chiqdi, lekin
tashqi portlari har xil: True

Ikkita qurilma bir xil ichki portdan (51000) chiqdi, lekin NAT ularga turli tashqi portlar berdi. Shuning uchun javoblar aralashmaydi.

NAT qatlamlar chegarasini buzadi

NAT - 3-qatlam qurilmasi, lekin u 4-qatlamdagi port raqamini o'zgartiradi.

Bu 2-bo'limda aytilgan qoidaning ochiq buzilishi. Va u bepul ketmadi:

Nima buzildiSabab
IPsecPaket ichini o'zgartirsa, imzo buziladi
FTP ning eski rejimiIP manzilni ma'lumot ichida uzatadi
P2P ulanishlarIkkala tomon ham NAT ortida
SIP (IP telefoniya)Manzilni xabar ichida yozadi

Har biri uchun alohida "yamoq" ixtiro qilishga to'g'ri keldi: ALG, STUN, TURN, hole punching.

Bu - qatlamlar chegarasini buzishning narxi qanday bo'lishini ko'rsatadigan eng yaxshi misol.

Ichkariga kirish: port yo'naltirish #

Jadvalga qarab ish ko'radigan NAT da bitta muhim oqibat bor: tashqaridan o'zi boshlangan ulanish o'ta olmaydi. Jadvalda unga mos yozuv yo'q.

Uy serveringizga tashqaridan kirish uchun qoida qo'lda qo'shiladi:

Python
class NatPortYonaltirish:
    def __init__(self, tashqi_ip):
        self.tashqi_ip = tashqi_ip
        self.qoidalar = {}    # tashqi port -> (ichki ip, ichki port)

    def qoida_qosh(self, tashqi_port, ichki_ip, ichki_port):
        self.qoidalar[tashqi_port] = (ichki_ip, ichki_port)
        print(f"  qoida: {self.tashqi_ip}:{tashqi_port} => "
              f"{ichki_ip}:{ichki_port}")

    def kirish(self, tashqi_port):
        joy = self.qoidalar.get(tashqi_port)
        holat = "o'tkazildi" if joy else "TASHLANDI"
        manzil = f"{joy[0]}:{joy[1]}" if joy else "-"
        print(f"  {tashqi_port:<6} {holat:<12} {manzil}")
        return joy


nat = NatPortYonaltirish("84.54.72.19")

print("administrator ikkita qoida qo'shdi:")
nat.qoida_qosh(80, "192.168.1.50", 8080)
nat.qoida_qosh(2222, "192.168.1.50", 22)

print()
print("tashqaridan kelgan ulanishlar:")
for port in [80, 2222, 443, 3306]:
    nat.kirish(port)

print()
print("ochilmagan portlar tashqaridan ko'rinmaydi - bu NAT ning")
print("asosiy xavfsizlik yon ta'siri")
Natija
administrator ikkita qoida qo'shdi:
  qoida: 84.54.72.19:80 => 192.168.1.50:8080
  qoida: 84.54.72.19:2222 => 192.168.1.50:22

tashqaridan kelgan ulanishlar:
  80     o'tkazildi   192.168.1.50:8080
  2222   o'tkazildi   192.168.1.50:22
  443    TASHLANDI    -
  3306   TASHLANDI    -

ochilmagan portlar tashqaridan ko'rinmaydi - bu NAT ning
asosiy xavfsizlik yon ta'siri

E'tibor bering: tashqi port 80, ichki port esa 8080. Ular bir xil bo'lishi shart emas - bu yo'naltirishning qulay tomoni.

NAT - bu xavfsizlik devori emas

NAT ortida turish "ichki tarmoq himoyalangan" degan taassurot beradi. Bu xavfli yolg'on tasalli.

NAT qiladiNAT qilmaydi
Kutilmagan kirishni tashlaydiTrafikni tekshirmaydi
Manzillarni yashiradiZararli faylni to'xtatmaydi
-Ichkaridan chiqqan hujumni ko'rmaydi
-Ochilgan portni himoya qilmaydi

Eng muhimi: hujumlarning katta qismi ichkaridan boshlanadi - xodim zararli havolani bosadi va ulanish ichkaridan tashqariga ochiladi. NAT bunga umuman to'siq emas.

Haqiqiy himoya uchun xavfsizlik devori, yangilanishlar va segmentatsiya kerak. Bu mavzular "Kiberxavfsizlik asoslari" darsligida batafsil ko'rilgan.

NAT turlari #

Barcha NAT bir xil ishlamaydi. Farq tashqaridan kelgan paketni qanchalik qattiq tekshirishida:

TuriJavobni kimdan qabul qiladi
To'liq konusliHar kimdan
Manzil bilan cheklanganFaqat o'sha IP dan
Port bilan cheklanganFaqat o'sha IP va portdan
SimmetrikHar manzil uchun yangi tashqi port

Simmetrik NAT eng qattiq va eng xavfsiz, lekin u P2P ulanishlarni deyarli imkonsiz qiladi. Video qo'ng'iroqlar shuning uchun ba'zan sifatsiz ishlaydi: to'g'ridan-to'g'ri ulana olmay, trafik oraliq server orqali o'tadi.

CGNAT - provayder darajasidagi NAT

Manzillar shunchalik tugab ketdiki, ko'p provayderlar endi mijozlariga ommaviy manzil bermaydi ham.

Sizning routeringiz 100.64.x.x diapazonidan manzil oladi va provayder yana bir marta NAT qiladi. Bunga CGNAT deyiladi.

Oqibati:

  • port yo'naltirish umuman ishlamaydi;
  • uy serveri ochib bo'lmaydi;
  • ba'zi o'yinlar va ilovalar shikoyat qiladi.

Tekshirish oson: routeringizdagi tashqi manzilni biror "mening IP manzilim" saytidagi manzil bilan solishtiring. Ular farq qilsa - siz CGNAT ortidasiz.

Amaliy topshiriq
  1. NAT jadvali misolini ishga tushiring.
  2. To'rtinchi qurilma qo'shing va jadvalni kuzating.
  3. Bir qurilmani ikki xil manzilga ulang - nechta yozuv paydo bo'ldi?
  4. Jadvalga yozuvni o'chirish (vaqti tugashi) mexanizmini qo'shing.
  5. Port yo'naltirish misolini ishga tushiring.
  6. Uchinchi qoida qo'shing va uni sinang.
  7. O'z routeringizdagi tashqi IP ni toping.
  8. Uni "mening IP manzilim" saytidagi bilan solishtiring.
  9. NAT nima uchun xavfsizlik devori emasligini uch qatorda yozing.
  10. NAT buzgan uchta protokolni sanang.

Xulosa #

  • NAT IPv4 manzillari tugab qolganidan keyin vaqtinchalik yechim sifatida paydo bo'lgan.
  • U butun ichki tarmoqni bitta ommaviy manzil ortiga yashiradi.
  • Ishlash tamoyili - tarjima jadvali: ichki (IP, port) uchun tashqi port ajratiladi.
  • Shuning uchun ikki qurilma bir xil ichki portdan chiqsa ham aralashmaydi.
  • Tashqaridan boshlangan ulanish jadvalda yo'q - u tashlanadi.
  • Ichkariga kirish uchun port yo'naltirish qoidasi qo'lda qo'shiladi.
  • NAT 3-qatlamda turib 4-qatlam maydonini o'zgartiradi - bu ko'p protokolni buzdi.
  • IPsec, FTP, SIP va P2P uchun alohida yamoqlar ixtiro qilishga to'g'ri keldi.
  • NAT xavfsizlik devori emas: u trafikni tekshirmaydi va ichki hujumga to'siq emas.
  • CGNAT ostida port yo'naltirish umuman ishlamaydi.

Keyingi bo'limda nomlarni manzilga aylantiradigan tizimni - DNS ni o'rganamiz va haqiqiy DNS so'rovini qo'lda yasaymiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.