16-bo‘lim
Xavfsizlik devori
nftables va ufw, DROP bilan REJECT farqi, o'zingizni bloklab qo'ymaslik va qoidalarni xavfsiz sinash.
Ushbu bo‘lim mundarijasi
Xavfsizlik devori bitta savolga javob beradi: qaysi paketlar serverga kira oladi. To'g'ri sozlangan devor 15-bo'limdagi "ma'lumotlar bazasi internetga ochiq" muammosini butunlay yo'q qiladi.
Uchta darajadagi vositalar #
Qoidalarni xavfsiz sinash #
Xavfsizlik devori - serverdan chiqib qolishning eng tez yo'li. Shuning uchun bu bo'limdagi barcha qoidalar alohida tarmoq nomlar fazosida (network namespace) sinaladi.
ip netns del sinov 2>/dev/null
ip netns add sinov
ip netns exec sinov ip link set lo up
Nomlar fazosi - o'z tarmoq stegi, o'z interfeyslari va o'z xavfsizlik devori bo'lgan izolyatsiyalangan muhit. Undagi qoidalar haqiqiy serverga hech qanday ta'sir qilmaydi.
ip netns exec sinov nft list ruleset | wc -l
0
Bo'sh - ya'ni toza muhitdan boshlayapmiz.
Murakkab qoidalar to'plamini yozganda, uni avval nomlar fazosida sinash - professional amaliyot:
| Buyruq | Vazifa |
|---|---|
ip netns add sinov | Yaratish |
ip netns exec sinov buyruq | Ichida bajarish |
ip netns list | Ro'yxat |
ip netns del sinov | O'chirish |
Ichkarida ishga tushirilgan har qanday jarayon butunlay
alohida tarmoqda yashaydi: o'z lo si, o'z portlari,
o'z nft jadvallari.
Bu Docker va konteynerlar ishlatadigan mexanizmning aynan o'zi.
Birinchi qoidalar to'plami #
ip netns exec sinov nft add table inet filter
ip netns exec sinov nft add chain inet filter input \
'{ type filter hook input priority 0 ; policy drop ; }'
ip netns exec sinov nft add rule inet filter input ct state established,related accept
ip netns exec sinov nft add rule inet filter input iif lo accept
ip netns exec sinov nft add rule inet filter input tcp dport 22 accept
ip netns exec sinov nft list ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
iif "lo" accept
tcp dport 22 accept
}
}
Har qatorni o'qib chiqamiz:
| Qator | Ma'no |
|---|---|
type filter hook input | Kiruvchi paketlarni filtrlash |
policy drop | Ruxsat berilmagan hamma narsa tashlanadi |
ct state established,related accept | Javob paketlariga ruxsat |
iif lo accept | Loopback - server o'zi bilan gaplashadi |
tcp dport 22 accept | SSH |
policy drop bilan boshlaganingizda hamma narsa taqiqlanadi -
jumladan siz yuborgan so'rovlarning javoblari ham.
ct state established,related accept bo'lmasa:
| Nima buziladi | Nima uchun |
|---|---|
apt update | Ombordan kelgan javob tashlanadi |
| DNS so'rovlari | Javob kelmaydi |
curl, git pull | Xuddi shunday |
| Ma'lumotlar bazasiga tashqi ulanish | Javob yo'q |
iif lo accept bo'lmasa:
| Nima buziladi | Nima uchun |
|---|---|
Nginx → ilova (127.0.0.1:8080) | Loopback bloklangan |
Ilova → MySQL (127.0.0.1:3306) | Xuddi shunday |
| Ko'p jarayonlararo aloqalar | Xuddi shunday |
Bu ikki qator - har qanday xavfsizlik devorining majburiy asosi. Ularsiz qoidalar to'plami yozmang.
DROP va REJECT - farqni ko'ramiz #
15-bo'limda curl chiqish kodlari haqida gapirgandik. Endi
buni tajribada tasdiqlaymiz.
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
printf "qoidasiz: "; curl -s -o /dev/null -w "%{http_code}\n" --max-time 2 http://127.0.0.1:8099/
'
qoidasiz: 200
Endi reject qo'shamiz:
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
nft add rule inet filter input tcp dport 8099 reject
printf "reject: "; curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8099/; printf " kod=%s\n" "$?"
'
reject: 000 kod=7
Va drop:
ip netns exec sinov bash -c '
python3 -m http.server 8099 --bind 127.0.0.1 >/dev/null 2>&1 &
sleep 1
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy accept ; }"
nft add rule inet filter input tcp dport 8099 drop
printf "drop: "; curl -s -o /dev/null -w "%{http_code}" --max-time 3 http://127.0.0.1:8099/; printf " kod=%s\n" "$?"
'
drop: 000 kod=28
| Amal | Mijoz nima ko'radi | curl kodi | Tezlik |
|---|---|---|---|
accept | Javob | 0 | - |
reject | Darhol rad javobi (ICMP) | 7 | Tez |
drop | Sukunat - taymautgacha kutadi | 28 | Sekin |
| Vaziyat | Tanlov | Sabab |
|---|---|---|
| Internetga qaragan port | drop | Skanerlarni sekinlashtiradi |
| Ichki tarmoq | reject | Xatoni tez ko'rasiz, tashxis oson |
| Xizmatni vaqtincha yopish | reject | Ilova darhol xato oladi, osilib qolmaydi |
drop ning foydasi: port skanerlari har port uchun taymaut
kutishga majbur bo'ladi va butun serverni skanerlash
soatlarga cho'ziladi. reject bilan esa skaner sekundiga
minglab portni tekshiradi.
Kamchiligi: siz ham tashxis qo'yganda kutasiz. Shuning uchun
ichki tarmoqda reject, tashqarida drop.
Bu 15-bo'limdagi jadval bilan bir xil: 7 - eshik yopiq,
28 - eshik yo'q.
To'liq server uchun qoidalar #
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add chain inet filter forward "{ type filter hook forward priority 0 ; policy drop ; }"
nft add chain inet filter output "{ type filter hook output priority 0 ; policy accept ; }"
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input iif lo accept
nft add rule inet filter input ip protocol icmp icmp type echo-request limit rate 5/second accept
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft list chain inet filter input
'
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif "lo" accept
ip protocol icmp icmp type echo-request limit rate 5/second burst 5 packets accept
tcp dport { 22, 80, 443 } accept
}
}
| Qator | Nima uchun |
|---|---|
forward policy drop | Server marshrutizator emas |
output policy accept | Chiquvchi trafik erkin |
ct state invalid drop | Buzilgan paketlarni erta tashlash |
icmp ... limit rate 5/second | ping ishlaydi, lekin suiiste'mol qilinmaydi |
nft chiqishga burst 5 packets ni o'zi qo'shdi - bu
standart qiymat. Ya'ni qisqa vaqtda beshta paket to'planib
kelishi mumkin, o'rtacha tezlik esa sekundiga beshtadan
oshmaydi.
| tcp dport { 22, 80, 443 } | Faqat uchta port |
3306, 5432, 6379 ataylab qo'shilmagan.
15-bo'limda ko'rganimizdek, ma'lumotlar bazasi 127.0.0.1
da turishi kerak - shunda unga faqat serverning o'zi ulanadi
va iif lo accept qoidasi kifoya.
Agar sizga haqiqatan ham tashqi ulanish kerak bo'lsa (masalan alohida ilova serveri), portni hammaga emas, aniq manzilga oching:
nft add rule inet filter input ip saddr 10.0.0.5 tcp dport 3306 accept
Va bu ham to'liq yechim emas: ustiga TLS va parol ham kerak.
Umumiy qoida: portni ochishdan oldin, uni ochmasdan hal qilish yo'lini qidiring. SSH tunneli yoki VPN ko'pincha ochiq portdan yaxshiroq.
O'zingizni bloklab qo'ymaslik #
Siz policy drop qo'yasiz, SSH qoidasini yozishni unutasiz -
va ulanish darhol uziladi. Server ishlayapti, lekin siz unga
kira olmaysiz.
To'rtta himoya:
| Chora | Qanday |
|---|---|
| SSH qoidasini birinchi yozing | policy drop dan oldin |
| Ikkinchi sessiya ochiq tursin | 7 va 8-bo'limlardagi kabi |
| Avtomatik bekor qilish qo'ying | Pastda |
| Provayder konsolini biling | Oxirgi chora |
Avtomatik bekor qilish - eng ishonchli usul:
sudo systemd-run --on-active=300 --unit=fw-qaytarish \
nft flush ruleset
Bu besh daqiqadan keyin barcha qoidalarni tozalaydi. Agar yangi qoidalar to'g'ri ishlasa va siz hali ham ulangan bo'lsangiz - taymerni bekor qiling:
sudo systemctl stop fw-qaytarish.timer
Ulanishni yo'qotsangiz esa - besh daqiqa kuting va qayta ulaning.
Xuddi shu naqsh SSH sozlamasi va Nginx uchun ham ishlaydi.
Qoidalarni saqlash #
nft qoidalari xotirada yashaydi - qayta yuklashda
yo'qoladi.
| Vazifa | Buyruq |
|---|---|
| Faylga saqlash | nft list ruleset > /etc/nftables.conf |
| Fayldan yuklash | nft -f /etc/nftables.conf |
| Sintaksisni tekshirish | nft -c -f /etc/nftables.conf |
| Yuklanishda avtomatik | systemctl enable nftables |
| Hammasini tozalash | nft flush ruleset |
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add rule inet filter input tcp dport 22 accept
nft list ruleset > qoidalar.nft
nft flush ruleset
printf "tozalangach: %s qator\n" "$(nft list ruleset | wc -l)"
nft -f qoidalar.nft
printf "qayta yuklangach: %s qator\n" "$(nft list ruleset | wc -l)"
'
tozalangach: 0 qator
qayta yuklangach: 6 qator
nft -c - visudo -c ning tarmoqdagi ekvivalentisudo nft -c -f /etc/nftables.conf
-c (check) faylni qo'llamaydi, faqat sintaksisni
tekshiradi.
Bu darslikdagi to'rtinchi shunday buyruq:
| Sozlama | Tekshiruv |
|---|---|
sudoers | visudo -cf |
sshd_config | sshd -t -f |
.service | systemd-analyze verify |
nftables.conf | nft -c -f |
nginx.conf | nginx -t (17-bo'lim) |
Odat qiling: sozlamani qo'llashdan oldin tekshiring.
ufw - oddiyroq yo'l #
Ubuntu Server da ufw standart o'rnatilgan va ko'p holatlar
uchun yetarli.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80,443/tcp comment 'Veb'
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verbose
| Buyruq | Vazifa |
|---|---|
ufw default deny incoming | Asosiy siyosat |
ufw allow 22/tcp | Portni ochish |
ufw allow from 10.0.0.5 to any port 3306 | Aniq manzildan |
ufw limit 22/tcp | Tezlikni cheklash - brute-force ga qarshi |
ufw delete allow 80/tcp | Qoidani o'chirish |
ufw status numbered | Raqamlangan ro'yxat |
ufw --dry-run allow 80 | Nima bo'lishini ko'rish |
ufw enable SSH ni uzishi mumkinufw enable buyrug'i ogohlantirish beradi:
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
Bu bo'sh ogohlantirish emas. allow 22/tcp ni enable
dan oldin yozganingizga ishonch hosil qiling.
ufw limit 22/tcp esa alohida foydali: u bir IP dan
30 soniyada 6 martadan ko'p ulanishga urinishni bloklaydi.
Bu SSH brute-force hujumlarining katta qismini to'xtatadi -
fail2ban ga qo'shimcha qatlam sifatida (19-bo'lim).
Tezlikni cheklash #
ip netns exec sinov bash -c '
nft add table inet filter
nft add chain inet filter input "{ type filter hook input priority 0 ; policy drop ; }"
nft add rule inet filter input tcp dport 22 ct state new limit rate 6/minute accept
nft add rule inet filter input tcp dport 22 ct state established accept
nft list chain inet filter input | grep -c "limit rate"
'
1
| Naqsh | Nima qiladi |
|---|---|
limit rate 6/minute | Daqiqasiga 6 ta yangi ulanish |
limit rate over 10/second drop | Chegaradan oshganini tashlash |
ct state new | Faqat yangi ulanishlarga - mavjudlariga tegmaydi |
Bu chora hujumni sekinlashtiradi, to'xtatmaydi. Uning vazifasi - avtomatik skanerlarni foydasiz qilish va jurnalni o'qish mumkin holga keltirish.
Haqiqiy himoya - bu bir necha qatlam:
| Qatlam | Nima qiladi |
|---|---|
| Xavfsizlik devori | Keraksiz portlarni yopadi |
| Tezlik cheklovi | Hujum tezligini kamaytiradi |
| Kalit bilan kirish | Parol taxminini butunlay foydasiz qiladi |
fail2ban | Takroriy urinuvchilarni bloklaydi |
| Monitoring | Sizni xabardor qiladi |
Ulardan eng kuchlisi - uchinchisi (8-bo'lim). Xavfsizlik devori uni almashtirmaydi, faqat to'ldiradi.
Tekshirish #
| Savol | Buyruq |
|---|---|
| Qanday qoidalar bor | sudo nft list ruleset |
ufw holati | sudo ufw status verbose |
| Qaysi portlar tinglanmoqda | sudo ss -tlnp |
| Tashqaridan ochiqmi | Boshqa mashinadan nc -zv IP port |
| Qoida ishlayaptimi | nft list ruleset da hisoblagichlar |
Serverning o'zidan port ochiqligini tekshirib bo'lmaydi:
iif lo accept qoidasi tufayli hammasi ochiq ko'rinadi.
To'g'ri usullar:
| Usul | Izoh |
|---|---|
Boshqa serverdan nc -zv | Eng aniq |
| Telefon internetidan | Uy tarmog'idan farqli manba |
| Onlayn port skaner xizmati | Tez, lekin ishonch cheklangan |
Sozlagandan keyin albatta tashqaridan tekshiring. "Menda ishlayapti" bu yerda hech nimani anglatmaydi.
ip netns del sinov 2>/dev/null; ip netns list | grep -c sinov || true
0
ip netnsbilan sinov muhitini yarating.policy dropbilaninputzanjirini tuzing.established,relatedvaiif loqoidalarini qo'shing.- Ularsiz nima buzilishini tushuntiring.
rejectvadropni sinab,curlkodlarini solishtiring.22, 80, 443portlarini ochadigan to'liq to'plam yozing.- Qoidalarni faylga saqlab, tozalab, qayta yuklang.
nft -c -fbilan sintaksisni tekshiring.limit ratebilan tezlik cheklovi qo'ying.systemd-run --on-activebilan avtomatik bekor qilishni sozlang.
Xulosa #
ufw,nftables,iptables- bitta netfilter ustidagi uch interfeys.- Ikkalasini birga ishlatmang.
- Qoidalarni nomlar fazosida sinang - serverga tegmaydi.
ct state established,related acceptvaiif lo accept- majburiy asos.rejectdarhol rad javobi (curlkodi7),drop- sukunat (28).- Tashqarida
drop, ichki tarmoqdareject. - Ma'lumotlar bazasi portini ochmang -
127.0.0.1vaiif lokifoya. policy dropdan oldin SSH qoidasini yozing.systemd-run --on-activebilan avtomatik bekor qilish qo'ying.- Portni tashqaridan tekshiring - serverning o'zidan emas.
Keyingi bo'limda Nginx ni sozlaymiz: statik fayllar, teskari proksi va veb-server darajasidagi himoya.
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.