15-bo‘lim
Tarmoq - IP, portlar va DNS
Manzillar, tinglanayotgan portlar, nom yechish va "sayt ochilmayapti" muammosini bosqichma-bosqich topish.
Ushbu bo‘lim mundarijasi
"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 #
Interfeyslar va manzillar #
ip -o link show | awk '{print $2}' | tr -d ':' | sort | head -2
eth0
lo
| Interfeys | Nima |
|---|---|
lo | Loopback - 127.0.0.1, faqat serverning o'zi |
eth0, ens3 | Fizik yoki virtual tarmoq kartasi |
docker0 | Docker ko'prigi |
wg0, tun0 | VPN tunnellari |
ip -4 -o addr show lo | awk '{print $2, $4}'
lo 127.0.0.1/8
| Buyruq | Vazifa |
|---|---|
ip a | Barcha manzillar |
ip -4 a | Faqat IPv4 |
ip r | Marshrut jadvali |
ip r get 8.8.8.8 | Qaysi yo'l bilan boradi |
ip -s link | Statistika (xatolar, paketlar) |
ifconfig va netstat - eski vositalarUlar net-tools paketida edi va yangi serverlarda umuman
o'rnatilmagan bo'lishi mumkin.
| Eski | Yangi |
|---|---|
ifconfig | ip addr |
route -n | ip route |
netstat -tlnp | ss -tlnp |
arp -a | ip 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.
echo "<h1>Salom</h1>" > index.html
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"
LISTEN 127.0.0.1:8099
| Bayroq | Ma'no |
|---|---|
-t | TCP |
-u | UDP |
-l | Faqat tinglayotganlar |
-n | Nomlarni yechmaslik (tezroq) |
-p | Qaysi jarayon (root kerak) |
-a | Hammasi |
-s | Umumiy 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 #
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
0.0.0.0:8097
127.0.0.1:8096
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.
| Manzil | Kim ulana oladi |
|---|---|
127.0.0.1:8080 | Faqat serverning o'zi |
0.0.0.0:8080 | Hamma - barcha interfeyslardan |
10.0.0.5:8080 | Faqat o'sha tarmoqdan |
[::]:8080 | IPv6 (va odatda IPv4 ham) |
Qaysi biri to'g'ri? Bu maqsadga bog'liq:
| Vaziyat | To'g'ri manzil |
|---|---|
| Nginx orqasidagi ilova | 127.0.0.1 - shunday bo'lishi kerak |
| Nginx ning o'zi | 0.0.0.0:80 va :443 |
| Ma'lumotlar bazasi | 127.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:
sudo ss -tlnp | grep -E ':(3306|5432|6379|27017)'
Natijada 0.0.0.0 ko'rsangiz - bazangiz internetga ochiq.
Ulanishni sinash #
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"
8099 ochiq
8098 yopiq
| Vosita | Nimani tekshiradi |
|---|---|
ping IP | Xost javob beradimi (ICMP) |
nc -zv IP port | TCP port ochiqmi |
curl -I URL | HTTP javob keladimi |
traceroute IP | Paket qayerda to'xtaydi |
mtr IP | ping + traceroute birga |
dig nom | DNS javobi |
ping javob bermasligi "server o'lgan" degani emasKo'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:
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 #
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"
200
<h1>Salom</h1>
404
Xizmat umuman yo'q bo'lsa, curl HTTP kod bermaydi:
curl -s -o /dev/null -w '%{http_code}\n' --max-time 2 http://127.0.0.1:8098/
echo "curl chiqish kodi: $?"
000
curl chiqish kodi: 7
curl chiqish kodlari - aniq tashxis000 va chiqish kodi - bular ikki xil ma'lumot:
| Kod | Ma'no |
|---|---|
0 | Muvaffaqiyat |
6 | Nom yechilmadi - DNS muammosi |
7 | Ulanib bo'lmadi - port yopiq yoki xizmat yo'q |
28 | Taymaut - odatda xavfsizlik devori paketni yutmoqda |
35 | TLS qo'l siqishi buzildi |
60 | Sertifikat 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:
| Bayroq | Vazifa |
|---|---|
-I | Faqat sarlavhalar |
-v | Batafsil - TLS va sarlavhalar bilan |
-w '%{http_code}' | Aniq maydonni chiqarish |
-o /dev/null -s | Mazmunni ko'rsatmaslik |
--max-time 5 | Taymaut |
--resolve sayt.uz:443:1.2.3.4 | DNS ni chetlab o'tish |
-H 'Host: sayt.uz' | Sarlavhani qo'lda qo'yish |
--resolve - DNS o'zgarishidan oldin sinashSaytni yangi serverga ko'chirayotganingizda, DNS hali eski IP ni ko'rsatib turadi. Yangi server ishlayotganini qanday tekshirasiz?
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 #
getent hosts localhost | awk '{print $2}'
localhost
Yechish tartibi /etc/nsswitch.conf da belgilanadi:
hosts: files dns
| Manba | Qayerda |
|---|---|
files | /etc/hosts - birinchi qaraladi |
dns | /etc/resolv.conf dagi serverlar |
myhostname | Serverning o'z nomi |
/etc/hosts DNS dan ustun turadiBu ikki tomonlama xususiyat.
Foydali tomoni: saytni DNS o'zgarishidan oldin sinash uchun ish kompyuteringizga qator qo'shasiz:
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:
| Qoida | Sabab |
|---|---|
| Sinovdan keyin darhol o'chiring | Unutilgan yozuv soatlab vaqt yo'qotadi |
--resolve ni afzal ko'ring | U faqat bitta buyruq uchun ishlaydi |
Serverda /etc/hosts ni tekshiring | Migratsiyadan keyin qolib ketishi mumkin |
"Menda ishlayapti, sizda yo'q" muammosining klassik sababi aynan shu fayl.
| Buyruq | Vazifa |
|---|---|
dig +short sayt.uz | Faqat IP |
dig sayt.uz MX | Pochta yozuvlari |
dig @8.8.8.8 sayt.uz | Aniq serverdan so'rash |
dig +trace sayt.uz | To'liq yechish zanjiri |
getent hosts nom | Tizim qanday yechishini (hosts + DNS) |
resolvectl status | Qaysi DNS serverlar ishlatilmoqda |
dig va getent boshqa javob berishi mumkindig 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:
| Natija | Xulosa |
|---|---|
| Ikkalasi bir xil | DNS to'g'ri ishlayapti |
dig to'g'ri, getent boshqa | /etc/hosts da yozuv bor |
dig bo'sh, getent to'g'ri | Faqat /etc/hosts da yashayapti |
| Ikkalasi bo'sh | Domen yozuvi yo'q yoki muddati o'tgan |
Portlar va xizmatlar #
getent services ssh https
ssh 22/tcp
https 443/tcp
| Port | Xizmat | Serverda |
|---|---|---|
| 22 | SSH | Ochiq bo'lishi kerak |
| 80 | HTTP | Ochiq - HTTPS ga yo'naltirish uchun |
| 443 | HTTPS | Ochiq |
| 3306 | MySQL | Faqat 127.0.0.1 |
| 5432 | PostgreSQL | Faqat 127.0.0.1 |
| 6379 | Redis | Faqat 127.0.0.1 |
| 25, 587 | SMTP | Kerak bo'lsa |
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:
| Qatlam | Chora |
|---|---|
| Ilova | bind 127.0.0.1 |
| Autentifikatsiya | requirepass yoki ACL |
| Tarmoq | Xavfsizlik devori (16-bo'lim) |
Har uchtasini ham qo'ying. Bittasi yetarli emas, chunki har biri boshqa xato turidan himoya qiladi.
Ulanishlar statistikasi #
ss -s | head -1 | grep -c 'Total:'
1
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"
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 emasss -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.
| Holat | Ma'no |
|---|---|
LISTEN | Port ochiq, kutmoqda |
ESTAB | Faol ulanish |
TIME-WAIT | Yopilgan, karantinda - normal |
CLOSE-WAIT | Ilova soketni yopmagan - kod xatosi |
SYN-SENT | Ulanishga 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 #
| Qadam | Buyruq | Natija nima deydi |
|---|---|---|
| 1 | dig +short sayt.uz | Bo'sh - DNS muammosi |
| 2 | getent hosts sayt.uz | dig dan farqli - /etc/hosts |
| 3 | nc -zv IP 443 | Yopiq - firewall yoki xizmat yo'q |
| 4 | Serverda: ss -tlnp | grep :443 | Bo'sh - Nginx ishlamayapti |
| 5 | Serverda: systemctl status nginx | failed - jurnalga qarang |
| 6 | Serverda: curl -I localhost | 502 - ilova o'lgan |
| 7 | journalctl -u ilova -n 50 | Aniq sabab |
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.
ip -o linkbilan interfeyslarni sanang.ss -tlnpbilan tinglayotgan portlarni ko'ring.python3 -m http.serverni127.0.0.1va0.0.0.0da ishga tushiring.sschiqishida farqni ko'rsating.nc -zbilan ochiq va yopiq portni tekshiring.curl -w '%{http_code}'bilan 200 va 404 ni oling.- Yopiq portga
curlyuboring va chiqish kodini o'qing. digvagetent hostsnatijalarini solishtiring.--resolvebilan DNS ni chetlab o'ting.- Yetti qadamli tashxis ro'yxatini boshdan-oxir bajaring.
Xulosa #
ifconfig/netstatemas -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.1to'g'ri tanlov. - Ma'lumotlar bazasi hech qachon
0.0.0.0da turmasin. pingbloklangan bo'lishi mumkin - portnincbilan tekshiring.curlchiqish kodi:6- DNS,7- port yopiq,28- paket yutilgan.--resolveDNS ni chetlab o'tadi - ko'chirishni sinash uchun ideal./etc/hostsDNS dan ustun; unutilgan yozuv soatlab vaqt yeydi.CLOSE-WAITko'p bo'lsa - ilova soketlarni yopmayapti.
Keyingi bo'limda xavfsizlik devorini sozlaymiz: nftables,
ufw va serverga qaysi portlar ochiq bo'lishi kerakligini.
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.