Firewall — ufw bilan portlarni boshqarish

~10 daq · Linux · Tarmoq

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 ports bermaslik — 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 N
  • allow from IP to any port N — faqat ma'lum IP ga
  • deny from IP — bloklash; insert 1 — tepaga
  • ufw limit OpenSSH, fail2ban — brute-force ga qarshi
  • Docker -p ufw 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.