Tarmoq izolyatsiyasi — nimani tashqariga ochish kerak
Muammodan boshlaylik
Haqiqiy voqealar asosida: VPS serverda loyiha. Dasturchi qulaylik uchun hammasini ochdi:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d -p 6379:6379 redis
docker run -d -p 27017:27017 mongo
Bir hafta ichida: MySQL dagi barcha jadvallar o'chirilgan, o'rniga bitta jadval — "Ma'lumotlaringizni qaytarish uchun 0.05 BTC to'lang". Redis orqali serverga kripto-mayner o'rnatilgan.
Internetni 24/7 avtomatik skanerlaydigan botlar ochiq 3306, 6379, 27017 portlarni daqiqalar ichida topadi.
Asosiy qoida
Tashqariga faqat foydalanuvchi to'g'ridan-to'g'ri kirishi kerak bo'lgan narsa ochiladi.
Odatiy veb-loyihada bu — faqat 80 va 443 (Nginx / Caddy, reverse proxy — 37-dars).
| Xizmat | Tashqariga ochiqmi |
|---|---|
| Reverse proxy (Nginx, Caddy, Traefik) | ✅ 80, 443 |
| API, backend | ❌ — proxy orqali |
| Baza (MySQL, PostgreSQL, MongoDB) | ❌ Hech qachon |
| Redis, RabbitMQ | ❌ Hech qachon |
| Admin panellar (Adminer, pgAdmin) | ❌ — kerak bo'lsa SSH tunnel orqali |
Uch daraja himoya
1. Portni umuman ochmang
docker run -d --name baza --network dokon-net mysql:8.4 # -p yo'q
Baza faqat Docker tarmog'i ichida (24-dars). Eng xavfsiz.
2. Faqat lokal
Kompyuterdan (masalan, GUI mijoz bilan) ulanish kerak bo'lsa:
-p 127.0.0.1:3306:3306
Tashqi tarmoqdan — yetib bo'lmaydi.
3. Firewall — lekin Docker uni chetlab o'tadi
[!WARNING] Linux da Docker port qoidalarini to'g'ridan-to'g'ri
iptablesga yozadi va UFW ni chetlab o'tadi (9-dars).ufw deny 3306—-p 3306:3306bilan ochilgan konteynerni himoya qilmaydi. Firewall ga tayanmang — portni ochmang yoki127.0.0.1:bilan oching.
Bulut provayderining firewall i (AWS Security Groups, DigitalOcean Cloud Firewall, Hetzner Firewall) server tashqarisida ishlaydi va Docker ni chetlab o'tmaydi — qo'shimcha qatlam sifatida yoqing: faqat 22, 80, 443.
Serverdagi bazaga qanday ulanish kerak
Baza porti yopiq. Lekin siz kompyuteringizdan (DBeaver, Workbench) unga ulanmoqchisiz. Yechim — SSH tunnel:
ssh -L 3307:localhost:3306 foydalanuvchi@server-ip
Endi kompyuteringizdagi localhost:3307 → shifrlangan SSH orqali → serverning localhost:3306 ga. Serverda baza -p 127.0.0.1:3306:3306 bilan ochilgan bo'lishi kerak.
Ko'p GUI vositalarda (DBeaver, TablePlus, Workbench) "SSH tunnel" sozlamasi bor — buyruq yozmasdan.
Konteyner ichidan chiqish
Izolyatsiya ikki tomonlama:
docker network create --internal baza-net
--internal (24-dars) — tarmoqdagi konteynerlar internetga chiqa olmaydi. Baza buzilsa ham — hujumchi ma'lumotni tashqariga yubora olmaydi, qo'shimcha zararli dastur yuklab ololmaydi.
Tekshirish ro'yxati
Serverda:
docker ps --format "table {{.Names}}\t{{.Ports}}"
NAMES PORTS
nginx 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp ✅
api 3000/tcp ✅ (faqat ichki)
baza 3306/tcp ✅ (faqat ichki)
redis 127.0.0.1:6379->6379/tcp ✅ (faqat lokal)
0.0.0.0:3306 yoki 0.0.0.0:6379 ko'rsangiz — darhol tuzating.
Tashqaridan tekshirish (boshqa kompyuterdan):
nc -zv server-ip 3306
# Connection refused / timed out — ✅ yopiq
Qo'shimcha qatlamlar
- Bazalarga kuchli parollar — "123456" yoki "root" emas, hatto ichki tarmoqda ham
- Redis —
requirepassbilan - Ilova uchun —
rootemas, cheklangan huquqli baza foydalanuvchisi (MySQL kursi 50-dars) - Image larni yangilab turish — zaifliklar tuzatiladi (39-dars)
Nima uchun shunday?
Nima uchun "ichki tarmoqdagi baza" ham kuchli parolga muhtoj?
Chunki xavfsizlik — qatlamlar (defense in depth). Har bir qatlam ertami-kechmi teshilishi mumkin: API da zaiflik topiladi va hujumchi API konteyneri ichida bo'ladi — endi u ichki tarmoqda, bazaga yeta oladi. Agar baza paroli "root" bo'lsa — keyingi qatlam yo'q. Agar kuchli parol va cheklangan huquqli foydalanuvchi bo'lsa — hujumchi faqat ilova ko'ra oladigan narsani ko'radi. Har bir qatlam hujumni qiyinlashtiradi va vaqt yutadi.
Xulosa
Eslab qoling:
- Tashqariga — faqat 80/443 (reverse proxy)
- Baza, Redis, admin panellar — hech qachon
0.0.0.0da - Portni ochmang → yoki
127.0.0.1:→ firewall ga tayanmang (Docker UFW ni chetlab o'tadi) - Bulut firewall — qo'shimcha qatlam: 22, 80, 443
- Serverdagi bazaga — SSH tunnel
--internal— internetga chiqishsizdocker psda0.0.0.0:3306— darhol tuzating- Ichki tarmoqda ham kuchli parollar
Keyingi dars
26-dars: Docker Compose nima — bir buyruqda butun loyiha