Tarkibga o'tish

iptables va nftables

Firewall va UFW maqolasida UFW firewall qoidalari uchun o'qilishi oson front end sifatida ko'rib chiqildi. UFW’ning o'zi paketlarni filtrlashni amalga oshirmaydi — u quyi darajadagi kernel quyi tizimi uchun qoidalar hosil qiladi. Ilgari bu quyi tizim faqat iptables edi. Zamonaviy Linux tizimida esa bu nftables, iptables ning o'zi esa odatda eski uslubdagi buyruqlarni ostida nftables qoidalariga tarjima qiladigan moslik (compatibility) qatlami sifatida amalga oshirilgan. Bu maqola ikkalasini ham ko'rib chiqadi: eski tizimda yoki hali ham uni bevosita ishlatayotgan tizimda qoidalarni o'qish uchun yetarli iptables ni va har qanday yangi ish uchun o'rganishga haqiqatan arziydigan vosita sifatida nftables ni.

Nimalarni o'rganasiz

Bu maqola oxirida siz quyidagilarni qila olasiz:

  • iptables, nftables va UFW o'rtasidagi bog'liqlikni tushuntirish;
  • filter jadvalining o'rnatilgan chain’lari bo'yicha asosiy iptables qoidalarini o'qish va yozish;
  • nftables sintaksisida, uning ifodaliroq moslashtirish (matching) imkoniyatlari bilan birga, ekvivalent qoidalarni yozish;
  • har ikki vositaning qoidalarini qayta yuklanishdan keyin ham saqlanadigan qilish;
  • qachon UFW o'rniga xom nftables/iptables ga murojaat qilish kerakligini hal qilish.

Nega ikkita vosita va ular qanday bog'liq

iptables 2.4 kernel seriyasidan beri mavjud va qoidalarni jadvallarga (tables) — xatti-harakat toifalariga: ruxsat berish/rad etish qarorlari uchun filter, manzil tarjimasi uchun nat — ajratadi. Har bir jadvalda chain'lar bor — paketning kernel orqali o'tish yo'lidagi nuqtalar: INPUT, OUTPUT, FORWARD. Keyinroq paydo bo'lgan nftables xuddi o'sha netfilter hook’larini yagona, ifodaliroq sintaksis va o'zining qoidalar dvigateli bilan almashtiradi. U iptables ustidagi o'ram (wrapper) emas, ikkalasining yangisi bo'lib, kernel bilan bevosita muloqot qiladi. iptables-nft (hozirgi Debian, Ubuntu va RHEL’da standart holatda keladigan versiya) esa aksincha, moslik uchun eski iptables sintaksisini nftables qoidalariga tarjima qiladi.

sudo iptables --version
iptables v1.8.9 (nf_tables)

Versiya satridagi (nf_tables) bu tizimdagi iptables buyrug'i eski dvigatel emas, moslik qatlami ekanini tasdiqlaydi. Ya’ni iptables bilan ham, nft bilan ham yozilgan qoidalar bir xil asosiy ruleset’ga tushadi va ikkalasi ham nft list ruleset orqali ko'rinadi.

iptables: jadvallar va chain’lar

Asosiy firewall vazifalari uchun filter jadvali muhim. Unda qaror paket yo'lining qaysi nuqtasida qabul qilinishiga mos keladigan uchta o'rnatilgan chain bor:

Chain Nimaga qo'llaniladi
INPUT Shu hostga yo'naltirilgan paketlar
OUTPUT Shu hostdan chiqayotgan paketlar
FORWARD Shu host orqali boshqa joyga o'tayotgan paketlar (routing)
sudo iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

-L qoidalarni ro'yxatga chiqaradi, -v paket/bayt hisoblagichlarini ko'rsatadi, -n esa manzillar uchun DNS so'rovlaridan qochadi (tezlik uchun ham, chiqish reverse DNS mavjudligiga qarab o'zgarmasligi uchun ham).

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -P INPUT DROP
  • -A INPUT qoidani INPUT chain’ining oxiriga qo'shadi;
  • -p tcp --dport 22 22-portga keladigan TCP trafikka mos keladi;
  • -j ACCEPT — target, ya’ni mos kelgan paket bilan nima qilish kerakligi;
  • -P INPUT DROP chain’ning standart siyosatini (default policy) o'rnatadi — hech bir qoidaga mos kelmagan paket bilan nima bo'lishini.

Allow qoidalari mavjud bo'lmasdan standart siyosatni DROP ga o'rnatish joriy sessiyani qulflab qo'yadi

UFW’dagi kabi bu yerda ham tartib hal qiluvchi ahamiyatga ega: -P INPUT DROP darhol kuchga kiradi va agar joriy sessiya uchun SSH allow qoidasi hali qo'shilmagan bo'lsa, o'sha ulanish orqali keyingi buyruq hostga yetib bora olmaydi. Har qanday standart siyosatni DROP ga o'rnatishdan oldin har doim barcha kerakli ACCEPT qoidalarini — birinchi navbatda SSH’ni — qo'shing va birinchisini yopishdan oldin ikkinchi, mustaqil ulanishdan tekshiring.

iptables qoidalari faqat kernel xotirasida yashaydi va aniq saqlanmasa, qayta yuklanishda yo'qoladi:

sudo apt install iptables-persistent
sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save

nftables: bitta sintaksis, ifodaliroq moslashtirish

nftables qoidalarni konseptual jihatdan xuddi shunday tashkil qiladi — jadvallar ichida chain’lar, chain’lar ichida qoidalar. Lekin jadvallar va chain’larning o'zi qat’iy o'rnatilgan bo'lmay, aniq yaratiladi. Bitta qoida esa bir nechta alohida iptables qoidasini talab qiladigan shartlarni ifodalay oladi.

sudo nft list ruleset
table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
}

table inet filter — inet bu jadval IPv4 va IPv6 ga bir vaqtda qo'llanilishini bildiradi. Bu iptables va takrorlangan qoidalar bilan unga parallel ishlaydigan alohida ip6tables zaruratini yo'q qiladi. tcp dport { 80, 443 } accept — portlar to'plamini bitta qatorda moslashtirish maxsus kengaytma emas, tabiiy sintaksis.

Xuddi shu ruleset’ni noldan qurish:

sudo nft add table inet filter
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

Buni qayta o'qish iptables -L ning tekisroq ro'yxatidan farqli o'laroq, chain siyosatini va har bir qabul qilingan portni bitta o'qilishi oson blokda tasdiqlaydi.

nftables qoidalari ham standart holatda vaqtinchalik. Ularni saqlashning standart usuli — aniq yoki systemd unit orqali yuklanadigan oddiy konfiguratsiya fayli:

sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        iif lo accept
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
}

ct state established,related accept alohida e’tiborga loyiq. Usiz ulanishning faqat birinchi paketi aniq qoidaga mos keladi, allaqachon ruxsat berilgan ulanishning javob trafigi esa standart siyosat tomonidan tashlab yuboriladi. Chunki bu qatorsiz holat saqlamaydigan (stateless) ruleset qaysi ulanishlarga oldin ruxsat berilganini eslab qolmaydi. iif lo accept loopback trafikka ruxsat beradi. Bu o'zi bilan yoki 127.0.0.1 orqali mahalliy ma’lumotlar bazasi bilan muloqot qiladigan ko'plab ilovalar uchun kerak.

Aslida qaysi birini ishlatish kerak

Vaziyat Tavsiya
Oddiy server, bir nechta portni ochish kerak UFW — qarang: Firewall va UFW
Mavjud, eski iptables ga asoslangan konfiguratsiyani o'qish yoki qo'llab-quvvatlash kerak Yuqorida ko'rib chiqilganidek, uni o'qish uchun yetarli iptables sintaksisini o'rganing
Yangi firewall qoidalarini noldan, bevosita (UFW orqali emas) yozish nftables — bu zamonaviy, faol rivojlanayotgan vosita, UFW’ning o'zi ham ostida tobora ko'proq unga yo'naltirilmoqda
Oddiy allow/deny’dan tashqari murakkab NAT, port forwarding yoki traffic shaping nftables yoki maxsus router/firewall distributivi — bu asosiy host firewall doirasidan tashqarida

Ko'pchilik bitta serverli sozlamalarda UFW hosil qilgan qoidalar to'liq yetarli. Xom nftables ga murojaat qilish faqat talab haqiqatan UFW sintaksisi ifodalay oladigan doiradan oshganda ma’noga ega — masalan, UFW’da qisqa shakli bo'lmagan manba, manzil va ulanish holatining aniq kombinatsiyasiga mos keladigan qoida kerak bo'lganda.

Amaliy vaziyat: meros qolgan firewall konfiguratsiyasini o'qish

Muammo. Serverni allaqachon ketgan kishi sozlagan va unga biror o'zgartirish kiritishdan oldin uning firewall xatti-harakatini tushunish kerak.

Qoidalarga aslida qaysi vosita egalik qilishini tekshirish:

sudo iptables --version
iptables v1.8.9 (nf_tables)

Dastlab qaysi buyruq yaratganidan qat’i nazar, to'liq ruleset’ni nft orqali ro'yxatga chiqarish:

sudo nft list ruleset
table ip filter {
    chain INPUT {
        type filter hook input priority 0; policy drop;
        ct state established,related counter packets 48213 bytes 6291842 accept
        iif "lo" accept
        tcp dport 22 accept
        tcp dport 443 accept
    }
}

Xulosa. Bu ruleset dastlab deyarli aniq iptables buyruqlari bilan qurilgan bo'lsa ham (katta harfdagi INPUT/FORWARD/OUTPUT chain nomlari — iptables kelishuvi, tabiiy nftables konfiguratsiyalarida esa kichik harfli maxsus nomlar ishlatiladi), nft list ruleset qaysi vosita yozganidan qat’i nazar haqiqiy, joriy holatni ko'rsatadi. Zamonaviy tizimda firewall’ning haqiqiy xatti-harakatini audit qilishning eng ishonchli usuli — qaysi buyruq qatori vositasi o'rnatilganiga qarab taxmin qilish emas, uni nft orqali o'qish.

Keng tarqalgan xatolar

  • SSH allow qoidasini qo'shishdan oldin DROP siyosatini o'rnatish. Yuqorida ko'rib chiqilganidek, bu o'zgarish kiritish uchun ishlatilayotgan sessiyaning o'zini uzib qo'yishi mumkin va konsol orqali kirishdan boshqa qaytish yo'li qolmaydi.
  • Qo'lda yozilgan nftables konfiguratsiyasida ct state established,related qoidasini unutish. Usiz har qanday ulanishning faqat birinchi paketi qoidalar bo'yicha baholanadi, allaqachon ruxsat berilgan ulanishning javob trafigi esa standart siyosat tomonidan jimgina tashlab yuboriladi.
  • Zamonaviy tizimda iptables -L to'liq manzarani ko'rsatadi deb o'ylash. Yuqorida ko'rsatilganidek, xuddi shu ruleset nft list ruleset orqali (ko'pincha to'liqroq) ko'rinadi. Bevosita qo'shilgan tabiiy nftables qoidalari bo'lishi mumkin bo'lgan tizimni audit qilishda eski vositalarga tayanish konfiguratsiyaning bir qismini o'tkazib yuborishi mumkin.
  • Doimiy qoidalar faylini uni qayta yuklamasdan tahrirlash. /etc/nftables.conf dagi o'zgarish servis qayta yuklanmaguncha (systemctl reload nftables) yoki fayl bevosita qo'llanilmaguncha (nft -f /etc/nftables.conf) hech qanday ta’sir qilmaydi — faylning o'zini tahrirlash ishlab turgan ruleset’da hech narsani o'zgartirmaydi.

Mashqlar

  1. Lab VM’da loopback trafikni, established/related ulanishlarni va SSH’ni qabul qiladigan, standart siyosati drop bo'lgan nftables ruleset’ini noldan yozing. Keyin birinchisini yopishdan oldin ikkinchi SSH sessiyasi hali ham ulanishini tekshiring.
  2. Kirish huquqingiz bor tizimda iptables --version ni ishga tushiring va chiqishda (nf_tables) bor yoki yo'qligi bu buyruq aslida qanday amalga oshirilgani haqida nima aytishini tushuntiring.
  3. Bu maqoladagi namuna ruleset’dan foydalanib, nftables dagi tcp dport { 80, 443 } accept nega iptables ekvivalentiga qaraganda ixchamroq ekanini va iptables ekvivalenti qanday ko'rinishini tushuntiring.
  4. Hozir UFW bilan boshqarilayotgan server uchun UFW sintaksisi bevosita ifodalay olmaydigan va shuning uchun xom nftables qoidasini talab qiladigan yetarlicha aniq vaziyatni tasvirlab bering.

Xulosa

iptables ham, nftables ham kernel’ning netfilter paket filtrini sozlaydi va qoidalarni jadvallar va chain’larga ajratadi. Zamonaviy tizimda iptables ning o'zi odatda ostidagi o'sha nftables dvigateliga ma’lumot uzatadigan moslik qatlami. Shuning uchun nft list ruleset qaysi buyruq qurganidan qat’i nazar, firewall’ning haqiqiy holatini audit qilishning eng ishonchli usuli. Oldingi maqolada ko'rib chiqilgan UFW ko'pchilik bitta serverli firewall vazifalari uchun to'g'ri standart tanlov bo'lib qoladi. Xom nftables esa UFW beradigandan ifodaliroq moslashtirish haqiqatan kerak bo'lgan holatlar uchun o'rganishga arziydi. Keyingi maqola, fail2ban, shunchaki statik qoidalarga emas, log shablonlariga javob beradigan qatlam qo'shadi — kuzatilgan hujum xatti-harakatiga asoslanib firewall ban’larini avtomatik yozadi va olib tashlaydi.

Manbalar