Firewall — ufw bilan portlarni boshqarish
Muammodan boshlaylik
Serverda sudo ss -tlnp qildingiz (32-dars):
0.0.0.0:22 sshd
0.0.0.0:80 nginx
0.0.0.0:3306 mysqld ← ?!
0.0.0.0:6379 redis-server ← ?!
0.0.0.0:3000 node
MySQL va Redis butun internetga ochiq. Redis standart holatda parolsiz — kimdir allaqachon unga ulanib, ma'lumotlarni o'qiyotgan bo'lishi mumkin. Har bir xizmatning sozlamasini tuzatish kerak — lekin ular orasida bittasini unutish oson.
Firewall — ikkinchi himoya qatlami: hatto xizmat noto'g'ri sozlangan bo'lsa ham, tashqaridan faqat ruxsat berilgan portlarga kirish mumkin.
ufw — oddiy firewall
Linux yadrosida kuchli firewall bor (netfilter, iptables/nftables buyruqlari), lekin uning sintaksisi murakkab. Ubuntu da — ufw (Uncomplicated Firewall): xuddi shu narsa, inson tilida.
sudo ufw status
Status: inactive
Standart holatda o'chirilgan.
Birinchi sozlash — to'g'ri tartibda
[!WARNING] SSH ni ruxsat bermasdan firewall ni yoqmang! Aks holda joriy SSH ulanishingiz uzilib, serverdan qulflanib qolasiz. Har doim birinchi qadam —
ufw allow OpenSSH.
# 1. Standart siyosat: kiruvchi — taqiqlangan, chiquvchi — ruxsat
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. SSH — BIRINCHI!
sudo ufw allow OpenSSH # yoki: sudo ufw allow 22/tcp
# 3. Veb
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 4. Yoqish
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status verbose
Status: active
Default: deny (incoming), allow (outgoing), disabled (routed)
To Action From
-- ------ ----
22/tcp (OpenSSH) ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
Endi MySQL (3306), Redis (6379), Node (3000) — tashqaridan yopiq, garchi ular 0.0.0.0 ni tinglasa ham. Serverning ichida (localhost orqali) hammasi ishlayveradi.
Qoidalar
Ruxsat berish
sudo ufw allow 8080/tcp # port
sudo ufw allow 'Nginx Full' # ilova profili (80 + 443)
sudo ufw allow from 203.0.113.10 # bitta IP dan hamma narsa
sudo ufw allow from 203.0.113.10 to any port 3306 # IP dan faqat MySQL
sudo ufw allow from 10.0.0.0/24 to any port 5432 # ichki tarmoqdan PostgreSQL
sudo ufw allow 6000:6010/tcp # diapazon
Ilova profillari:
sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Taqiqlash
sudo ufw deny from 185.220.101.4 # bitta IP ni bloklash (17-darsdagi bot)
sudo ufw deny 3306
O'chirish
sudo ufw status numbered
To Action From
-- ------ ----
[ 1] OpenSSH ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 8080/tcp ALLOW IN Anywhere
sudo ufw delete 3 # raqam bo'yicha
sudo ufw delete allow 8080/tcp # qoida bo'yicha
Tartib muhim
Qoidalar tepadan pastga tekshiriladi, birinchi mos kelgani qo'llanadi. IP ni bloklash qoidasi "hammaga ruxsat" qoidasidan oldin bo'lishi kerak:
sudo ufw insert 1 deny from 185.220.101.4
SSH ni brute-force dan himoyalash
sudo ufw limit OpenSSH
Bitta IP dan 30 soniyada 6 tadan ko'p ulanish urinishi — vaqtincha bloklanadi. Parol bilan kirish o'chirilgan bo'lsa ham (34-dars), loglarni toza saqlaydi.
Kuchliroq himoya — fail2ban: loglarni (auth.log, Nginx) kuzatib, shubhali IP larni avtomatik bloklaydi:
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Loglar
sudo ufw logging on
sudo tail -f /var/log/ufw.log
[UFW BLOCK] IN=eth0 SRC=91.213.8.92 DST=45.12.34.56 PROTO=TCP DPT=3306 ...
Kim, qaysi portga urinib, bloklangani ko'rinadi. Odatda bir necha daqiqada — MySQL, Redis, RDP, Telnet portlariga skanerlar.
Bulut firewall lari
AWS, Google Cloud, Hetzner, DigitalOcean — o'zining tarmoq darajasidagi firewall iga ega (Security Groups, Cloud Firewall). U serverga yetib kelishidan oldin filtrlaydi.
| ufw (server ichida) | Bulut firewall | |
|---|---|---|
| Qayerda | Server operatsion tizimida | Provayder tarmog'ida |
| Sozlash | ufw buyrug'i |
Veb-panel yoki API |
| Server buzilsa | Hujumchi o'chirishi mumkin | Ta'sir qilmaydi |
Eng yaxshi amaliyot — ikkalasi ham: chuqur himoya.
Docker va ufw — muhim tuzoq
[!WARNING] Docker o'z qoidalarini to'g'ridan-to'g'ri iptables ga yozadi va ufw ni chetlab o'tadi.
docker run -p 3306:3306 mysql— ufw da 3306 yopiq bo'lsa ham, port internetga ochiq bo'ladi.
Yechimlar:
- Port ni faqat lokal manzilga bog'lash:
-p 127.0.0.1:3306:3306 - Docker Compose da bazaga umuman
portsbermaslik — konteynerlar ichki tarmoq orqali gaplashadi - Bulut firewall ishlatish
Bu haqida Docker kursida batafsil.
Nima uchun shunday?
Nima uchun "hammasini taqiqla, keraklisiga ruxsat ber" (default deny) — "hammasiga ruxsat, xavflisini taqiqla" dan yaxshiroq?
Chunki xavfli narsalar ro'yxatini oldindan bilib bo'lmaydi. Ertaga siz Redis o'rnatasiz, yoki paket o'zi qandaydir xizmatni ishga tushiradi, yoki dasturchi debug porti ochib qoldiradi — "taqiqlar ro'yxati" bunday yangi portlarni bilmaydi va ular avtomatik ochiq qoladi. "Ruxsatlar ro'yxati" esa aksincha: yangi xizmat avtomatik yopiq, uni ochish uchun ongli qaror kerak. Xatolik bo'lsa — narsa ishlamaydi (va siz buni darhol sezasiz), ma'lumotlar sizib chiqmaydi. Xavfsizlikda "standart holatda yopiq" — oltin qoida.
Xulosa
Eslab qoling:
- Firewall — xizmat noto'g'ri sozlangan bo'lsa ham himoya qiladi
- Tartib:
default deny incoming→allow OpenSSH→allow 80,443→enable ufw status verbose/numbered;ufw delete Nallow from IP to any port N— faqat ma'lum IP gadeny from IP— bloklash;insert 1— tepagaufw limit OpenSSH, fail2ban — brute-force ga qarshi- Docker
-pufw ni chetlab o'tadi —127.0.0.1:bilan bog'lang - Bulut firewall + ufw — ikkalasi ham
Keyingi bo'lim
8-bo'lim: Bash skriptlar — buyruqlarni avtomatlashtirish, shartlar, tsikllar va cron.