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.
Ushbu bo‘lim mundarijasi
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.
Tarjima jadvali #
NAT ning butun ishi - jadval yuritish. Ichkaridan chiqqan har ulanish uchun u yangi tashqi port ajratadi va eslab qoladi.
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)
--- 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 - 3-qatlam qurilmasi, lekin u 4-qatlamdagi port raqamini o'zgartiradi.
Bu 2-bo'limda aytilgan qoidaning ochiq buzilishi. Va u bepul ketmadi:
| Nima buzildi | Sabab |
|---|---|
| IPsec | Paket ichini o'zgartirsa, imzo buziladi |
| FTP ning eski rejimi | IP manzilni ma'lumot ichida uzatadi |
| P2P ulanishlar | Ikkala 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:
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")
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 ortida turish "ichki tarmoq himoyalangan" degan taassurot beradi. Bu xavfli yolg'on tasalli.
| NAT qiladi | NAT qilmaydi |
|---|---|
| Kutilmagan kirishni tashlaydi | Trafikni tekshirmaydi |
| Manzillarni yashiradi | Zararli 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:
| Turi | Javobni kimdan qabul qiladi |
|---|---|
| To'liq konusli | Har kimdan |
| Manzil bilan cheklangan | Faqat o'sha IP dan |
| Port bilan cheklangan | Faqat o'sha IP va portdan |
| Simmetrik | Har 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.
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.
- NAT jadvali misolini ishga tushiring.
- To'rtinchi qurilma qo'shing va jadvalni kuzating.
- Bir qurilmani ikki xil manzilga ulang - nechta yozuv paydo bo'ldi?
- Jadvalga yozuvni o'chirish (vaqti tugashi) mexanizmini qo'shing.
- Port yo'naltirish misolini ishga tushiring.
- Uchinchi qoida qo'shing va uni sinang.
- O'z routeringizdagi tashqi IP ni toping.
- Uni "mening IP manzilim" saytidagi bilan solishtiring.
- NAT nima uchun xavfsizlik devori emasligini uch qatorda yozing.
- 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.