15-bo‘lim

Tarmoq - IP, portlar va DNS

Manzillar, tinglanayotgan portlar, nom yechish va "sayt ochilmayapti" muammosini bosqichma-bosqich topish.

🕑 23 daqiqa o‘qish 📄 1 855 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. So'rov qanday yo'l bosadi
  2. Interfeyslar va manzillar
  3. Kim qaysi portni tinglayapti
  4. 127.0.0.1 va 0.0.0.0 - eng ko'p uchraydigan xato
  5. Ulanishni sinash
  6. HTTP javobini o'qish
  7. DNS - nom qanday yechiladi
  8. Portlar va xizmatlar
  9. Ulanishlar statistikasi
  10. "Sayt ochilmayapti" - tartib bilan
  11. Xulosa

"Sayt ochilmayapti" - bu bitta muammo emas, oltita mumkin bo'lgan muammo. Ularni bir-biridan ajratish uchun tarmoq qatlamlarini bilish kerak.

So'rov qanday yo'l bosadi #

Oltita uzilish nuqtasi - qaysi biri sizniki? 1. DNS nom -> IP 2. Marshrut paket yetib boradimi 3. Firewall port ochiqmi (16-bo'lim) 4. Tinglash xizmat portda turibdimi 5. Manzil 127.0.0.1 mi, 0.0.0.0 mi 6. Ilova 500 qaytaryaptimi Har nuqta uchun bitta buyruq 1. dig +short sayt.uz IP qaytdimi? 2. ping -c 3 IP paket yetib boradimi? 3. nc -zv IP 443 port tashqaridan ochiqmi? 4. ss -tlnp | grep :443 SERVERDA kim tinglayapti? 5. ss -tln | awk '{print $4}' 0.0.0.0 mi yoki 127.0.0.1? 6. curl -I localhost ilova nima javob beryapti?
Tepadan pastga emas, ketma-ket tekshiring - har qadam keyingisini rad etadi

Interfeyslar va manzillar #

Terminal
ip -o link show | awk '{print $2}' | tr -d ':' | sort | head -2
Natija
eth0
lo
InterfeysNima
loLoopback - 127.0.0.1, faqat serverning o'zi
eth0, ens3Fizik yoki virtual tarmoq kartasi
docker0Docker ko'prigi
wg0, tun0VPN tunnellari
Terminal
ip -4 -o addr show lo | awk '{print $2, $4}'
Natija
lo 127.0.0.1/8
BuyruqVazifa
ip aBarcha manzillar
ip -4 aFaqat IPv4
ip rMarshrut jadvali
ip r get 8.8.8.8Qaysi yo'l bilan boradi
ip -s linkStatistika (xatolar, paketlar)
ifconfig va netstat - eski vositalar

Ular net-tools paketida edi va yangi serverlarda umuman o'rnatilmagan bo'lishi mumkin.

EskiYangi
ifconfigip addr
route -nip route
netstat -tlnpss -tlnp
arp -aip neigh

ss netstat dan sezilarli tezroq: u /proc/net/tcp ni o'qish o'rniga yadro bilan to'g'ridan-to'g'ri netlink orqali gaplashadi. Minglab ulanishi bor serverda bu farq sezilarli.

Yangi buyruqlarni o'rganing - eskilari yo'q bo'lgan serverda qolib ketmaysiz.

Kim qaysi portni tinglayapti #

Bu serverdagi eng ko'p ishlatiladigan tarmoq buyrug'i.

Terminal
echo "<h1>Salom</h1>" > index.html
Terminal
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
SRV=$!
sleep 1
ss -tln 'sport = :8099' | tail -1 | awk '{print $1, $4}'
kill "$SRV"
Natija
LISTEN 127.0.0.1:8099
BayroqMa'no
-tTCP
-uUDP
-lFaqat tinglayotganlar
-nNomlarni yechmaslik (tezroq)
-pQaysi jarayon (root kerak)
-aHammasi
-sUmumiy statistika

Eslab qolish uchun: ss -tlnp - "TCP, tinglayotgan, raqamli, jarayon bilan".

127.0.0.1 va 0.0.0.0 - eng ko'p uchraydigan xato #

Terminal
python3 -m http.server 8097 --bind 0.0.0.0 >/dev/null 2>&1 & A=$!
python3 -m http.server 8096 --bind 127.0.0.1 >/dev/null 2>&1 & B=$!
sleep 1
ss -tln 'sport = :8097 or sport = :8096' | tail -n +2 | awk '{print $4}' | sort
kill "$A" "$B" 2>/dev/null
Natija
0.0.0.0:8097
127.0.0.1:8096
"Xizmat ishlayapti, lekin ochilmayapti"

Bu belgilar bilan keladi: systemctl status yashil, jurnalda xato yo'q, curl localhost serverda ishlaydi - lekin tashqaridan hech nima ochilmaydi.

Sabab deyarli har doim shu: ilova 127.0.0.1 ga bog'langan.

ManzilKim ulana oladi
127.0.0.1:8080Faqat serverning o'zi
0.0.0.0:8080Hamma - barcha interfeyslardan
10.0.0.5:8080Faqat o'sha tarmoqdan
[::]:8080IPv6 (va odatda IPv4 ham)

Qaysi biri to'g'ri? Bu maqsadga bog'liq:

VaziyatTo'g'ri manzil
Nginx orqasidagi ilova127.0.0.1 - shunday bo'lishi kerak
Nginx ning o'zi0.0.0.0:80 va :443
Ma'lumotlar bazasi127.0.0.1 - hech qachon 0.0.0.0

Ya'ni 127.0.0.1 xato emas - u ko'pincha aynan to'g'ri tanlov. Xato - Nginx sozlanmaganda ilovaga to'g'ridan-to'g'ri murojaat qilishga urinish.

Eng xavflisi - ma'lumotlar bazasini 0.0.0.0 ga qo'yish. Buni tekshiring:

Terminal
sudo ss -tlnp | grep -E ':(3306|5432|6379|27017)'

Natijada 0.0.0.0 ko'rsangiz - bazangiz internetga ochiq.

Ulanishni sinash #

Terminal
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
SRV=$!
sleep 1
nc -z -w 2 127.0.0.1 8099 && echo "8099 ochiq"
nc -z -w 2 127.0.0.1 8098 || echo "8098 yopiq"
kill "$SRV"
Natija
8099 ochiq
8098 yopiq
VositaNimani tekshiradi
ping IPXost javob beradimi (ICMP)
nc -zv IP portTCP port ochiqmi
curl -I URLHTTP javob keladimi
traceroute IPPaket qayerda to'xtaydi
mtr IPping + traceroute birga
dig nomDNS javobi
ping javob bermasligi "server o'lgan" degani emas

Ko'p provayderlar va xavfsizlik devorlari ICMP ni butunlay bloklaydi. Server ishlayotgan bo'lsa ham ping javob bermaydi.

Shuning uchun serverni tekshirishda ping emas, portni tekshiring:

Terminal
nc -zv sayt.uz 443

ping faqat bitta narsani foydali aytadi: kechikish (latency). Ulanish bor-yo'qligini esa nc yoki curl aytadi.

HTTP javobini o'qish #

Terminal
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
SRV=$!
sleep 1
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8099/index.html
curl -s http://127.0.0.1:8099/index.html
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8099/mavjud-emas
kill "$SRV"
Natija
200
<h1>Salom</h1>
404

Xizmat umuman yo'q bo'lsa, curl HTTP kod bermaydi:

Terminal
curl -s -o /dev/null -w '%{http_code}\n' --max-time 2 http://127.0.0.1:8098/
echo "curl chiqish kodi: $?"
Natija
000
curl chiqish kodi: 7
curl chiqish kodlari - aniq tashxis

000 va chiqish kodi - bular ikki xil ma'lumot:

KodMa'no
0Muvaffaqiyat
6Nom yechilmadi - DNS muammosi
7Ulanib bo'lmadi - port yopiq yoki xizmat yo'q
28Taymaut - odatda xavfsizlik devori paketni yutmoqda
35TLS qo'l siqishi buzildi
60Sertifikat tekshiruvdan o'tmadi

Farqni sezing: 7 "eshik yopiq" (darhol rad javobi keladi), 28 esa "eshik yo'q" (javob umuman kelmaydi).

Xavfsizlik devori REJECT qilsa - 7, DROP qilsa - 28 (16-bo'lim). Shu bitta raqam sizga qaysi qoida ishlayotganini aytadi.

Foydali curl bayroqlari:

BayroqVazifa
-IFaqat sarlavhalar
-vBatafsil - TLS va sarlavhalar bilan
-w '%{http_code}'Aniq maydonni chiqarish
-o /dev/null -sMazmunni ko'rsatmaslik
--max-time 5Taymaut
--resolve sayt.uz:443:1.2.3.4DNS ni chetlab o'tish
-H 'Host: sayt.uz'Sarlavhani qo'lda qo'yish
--resolve - DNS o'zgarishidan oldin sinash

Saytni yangi serverga ko'chirayotganingizda, DNS hali eski IP ni ko'rsatib turadi. Yangi server ishlayotganini qanday tekshirasiz?

Terminal
curl -I --resolve sayt.uz:443:203.0.113.99 https://sayt.uz/

curl DNS ga umuman murojaat qilmaydi va to'g'ridan-to'g'ri ko'rsatilgan IP ga ulanadi - lekin Host sarlavhasi va TLS SNI to'g'ri nom bilan ketadi.

Bu ko'chirishni tekshirishning eng toza usuli: DNS ni o'zgartirishdan oldin yangi server to'g'ri javob berayotganiga ishonch hosil qilasiz.

DNS - nom qanday yechiladi #

Terminal
getent hosts localhost | awk '{print $2}'
Natija
localhost

Yechish tartibi /etc/nsswitch.conf da belgilanadi:

Natija
hosts: files dns
ManbaQayerda
files/etc/hosts - birinchi qaraladi
dns/etc/resolv.conf dagi serverlar
myhostnameServerning o'z nomi
/etc/hosts DNS dan ustun turadi

Bu ikki tomonlama xususiyat.

Foydali tomoni: saytni DNS o'zgarishidan oldin sinash uchun ish kompyuteringizga qator qo'shasiz:

Natija
203.0.113.99  sayt.uz www.sayt.uz

Xavfli tomoni: eski yozuv unutilib qolsa, siz oylab "eski" saytni ko'rasiz va nima uchun ekanini tushunmaysiz. Hamkasblaringiz yangi saytni ko'radi, siz esa yo'q.

Shuning uchun:

QoidaSabab
Sinovdan keyin darhol o'chiringUnutilgan yozuv soatlab vaqt yo'qotadi
--resolve ni afzal ko'ringU faqat bitta buyruq uchun ishlaydi
Serverda /etc/hosts ni tekshiringMigratsiyadan keyin qolib ketishi mumkin

"Menda ishlayapti, sizda yo'q" muammosining klassik sababi aynan shu fayl.

BuyruqVazifa
dig +short sayt.uzFaqat IP
dig sayt.uz MXPochta yozuvlari
dig @8.8.8.8 sayt.uzAniq serverdan so'rash
dig +trace sayt.uzTo'liq yechish zanjiri
getent hosts nomTizim qanday yechishini (hosts + DNS)
resolvectl statusQaysi DNS serverlar ishlatilmoqda
dig va getent boshqa javob berishi mumkin

dig to'g'ridan-to'g'ri DNS serverga murojaat qiladi va /etc/hosts ni ko'rmaydi.

getent hosts esa nsswitch.conf tartibiga amal qiladi - ya'ni ilovalar qanday ko'rsa, shunday.

Shuning uchun tashxis qo'yishda ikkalasini ham bajaring:

NatijaXulosa
Ikkalasi bir xilDNS to'g'ri ishlayapti
dig to'g'ri, getent boshqa/etc/hosts da yozuv bor
dig bo'sh, getent to'g'riFaqat /etc/hosts da yashayapti
Ikkalasi bo'shDomen yozuvi yo'q yoki muddati o'tgan

Portlar va xizmatlar #

Terminal
getent services ssh https
Natija
ssh                   22/tcp
https                 443/tcp
PortXizmatServerda
22SSHOchiq bo'lishi kerak
80HTTPOchiq - HTTPS ga yo'naltirish uchun
443HTTPSOchiq
3306MySQLFaqat 127.0.0.1
5432PostgreSQLFaqat 127.0.0.1
6379RedisFaqat 127.0.0.1
25, 587SMTPKerak bo'lsa
Parolsiz Redis va MongoDB - internetdagi klassik qurbon

Redis standart holatda parolsiz ishlaydi. Agar u 0.0.0.0:6379 da tursa va xavfsizlik devori yopmagan bo'lsa, istalgan odam unga ulanib, ma'lumotni o'qiy va o'zgartira oladi.

Bundan ham yomoni: Redis orqali serverga fayl yozish va authorized_keys ni almashtirish hujumi ma'lum.

Uchta qatlam himoya:

QatlamChora
Ilovabind 127.0.0.1
Autentifikatsiyarequirepass yoki ACL
TarmoqXavfsizlik devori (16-bo'lim)

Har uchtasini ham qo'ying. Bittasi yetarli emas, chunki har biri boshqa xato turidan himoya qiladi.

Ulanishlar statistikasi #

Terminal
ss -s | head -1 | grep -c 'Total:'
Natija
1
Terminal
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
SRV=$!
sleep 1
curl -s -o /dev/null http://127.0.0.1:8099/
ss -tan 'sport = :8099 or dport = :8099' | tail -n +2 | awk '{print $1}' | sort -u
kill "$SRV"
Natija
LISTEN
TIME-WAIT

Bitta curl so'rovidan keyin ikkita holat qoldi: port hali ham tinglayapti, va yopilgan ulanish TIME-WAIT da turibdi.

TIME-WAIT holati - nosozlik emas

ss -tan da minglab TIME-WAIT ulanish ko'rsangiz, xavotirlanmang. Bu TCP protokolining normal qismi: ulanish yopilgach, kechikkan paketlar chalkashtirmasligi uchun soket 60 soniya "karantin" da turadi.

HolatMa'no
LISTENPort ochiq, kutmoqda
ESTABFaol ulanish
TIME-WAITYopilgan, karantinda - normal
CLOSE-WAITIlova soketni yopmagan - kod xatosi
SYN-SENTUlanishga urinmoqda, javob yo'q

Ko'p CLOSE-WAIT - haqiqiy muammo belgisi: bu ilova ulanishlarni yopmayotganini bildiradi va oxir-oqibat fayl deskriptorlari tugaydi (11-bo'limdagi LimitNOFILE).

Ko'p SYN-SENT esa - masofadagi xost javob bermayotganini.

"Sayt ochilmayapti" - tartib bilan #

QadamBuyruqNatija nima deydi
1dig +short sayt.uzBo'sh - DNS muammosi
2getent hosts sayt.uzdig dan farqli - /etc/hosts
3nc -zv IP 443Yopiq - firewall yoki xizmat yo'q
4Serverda: ss -tlnp | grep :443Bo'sh - Nginx ishlamayapti
5Serverda: systemctl status nginxfailed - jurnalga qarang
6Serverda: curl -I localhost502 - ilova o'lgan
7journalctl -u ilova -n 50Aniq sabab
Har qadam keyingisini rad etadi

Bu ro'yxatning kuchi tartibda: har bir muvaffaqiyatli qadam undan oldingi barcha sabablarni chiqarib tashlaydi.

Agar 3-qadam ishlasa, DNS va marshrut bilan muammo yo'q - ularni boshqa tekshirmaysiz.

Eng ko'p vaqt yo'qotiladigan xato - tasodifiy tartibda tekshirish: avval Nginx sozlamasini o'qish, keyin ilovani qayta ishga tushirish, keyin DNS ni tekshirish. Bunda siz bir necha marta bir xil joyga qaytasiz.

Tartibni yozib qo'ying va unga amal qiling.

Amaliy topshiriq
  1. ip -o link bilan interfeyslarni sanang.
  2. ss -tlnp bilan tinglayotgan portlarni ko'ring.
  3. python3 -m http.server ni 127.0.0.1 va 0.0.0.0 da ishga tushiring.
  4. ss chiqishida farqni ko'rsating.
  5. nc -z bilan ochiq va yopiq portni tekshiring.
  6. curl -w '%{http_code}' bilan 200 va 404 ni oling.
  7. Yopiq portga curl yuboring va chiqish kodini o'qing.
  8. dig va getent hosts natijalarini solishtiring.
  9. --resolve bilan DNS ni chetlab o'ting.
  10. Yetti qadamli tashxis ro'yxatini boshdan-oxir bajaring.

Xulosa #

  • ifconfig/netstat emas - ip/ss; ular tezroq va hamma joyda bor.
  • ss -tlnp - serverdagi eng ko'p kerak bo'ladigan tarmoq buyrug'i.
  • 127.0.0.1 - faqat server o'zi; 0.0.0.0 - hamma.
  • Nginx orqasidagi ilova uchun 127.0.0.1 to'g'ri tanlov.
  • Ma'lumotlar bazasi hech qachon 0.0.0.0 da turmasin.
  • ping bloklangan bo'lishi mumkin - portni nc bilan tekshiring.
  • curl chiqish kodi: 6 - DNS, 7 - port yopiq, 28 - paket yutilgan.
  • --resolve DNS ni chetlab o'tadi - ko'chirishni sinash uchun ideal.
  • /etc/hosts DNS dan ustun; unutilgan yozuv soatlab vaqt yeydi.
  • CLOSE-WAIT ko'p bo'lsa - ilova soketlarni yopmayapti.

Keyingi bo'limda xavfsizlik devorini sozlaymiz: nftables, ufw va serverga qaysi portlar ochiq bo'lishi kerakligini.

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.