سلام به همگی
همانطور که میدانید در دبیان ۱۲ و توزیعهای جدید لینوکس، iptables به عنوان یک ابزار قدیمی شناخته میشود و جایگزین مدرن، سریعتر و بهینهتر آن یعنی nftables به صورت پیشفرض نصب است.
در این آموزش قصد داریم نحوه نوشتن یک کانفیگ امنیتی (به خصوص برای سرورهای ویپ مثل Asterisk یا Simotel) را بررسی کنیم. ما قوانینی که قبلا در iptables داشتیم را به زبان جدید nftables ترجمه و پیادهسازی خواهیم کرد.
قدم اول: پیش نیاز ها
سیستم عامل Debian 12 (یا اوبونتوهای جدید)
دسترسی روت (Root)
قدم اول: نصب و فعالسازی سرویس NFTables
اگرچه nftables معمولا نصب است، اما برای اطمینان دستورات زیر را اجرا کنید:
apt update
apt install nftables
systemctl enable nftables
systemctl start nftables
قدم دوم: درک ساختار NFTables
برخلاف iptables که زنجیرهها (Chains) پیشفرض داشت (مثل INPUT, OUTPUT)، در nftables ما باید Table و Chain خودمان را بسازیم.
Table: محفظه اصلی قوانین (مثلا برای فیلتر کردن ترافیک IP)
Chain: جایی که قوانین (Rules) قرار میگیرند و به ترافیک ورودی یا خروجی قلاب (Hook) میشوند
قدم سوم: تبدیل قوانین IPTables به NFTables
شما درخواست تبدیل قوانین خاصی را داشتید. بیایید نگاهی به منطق آنها بیندازیم و معادلسازی کنیم.
قوانین درخواستی (Legacy IPTables):
این قوانین روی پورت ۵۰۶۰ (SIP) تمرکز دارند و سعی دارند با بررسی User-Agent پکتها (Deep Packet Inspection)، جلوی حملات را بگیرند و فقط به کلاینتهای مجاز اجازه دهند.
معادلسازی در NFTables (فایل کانفیگ):
فایل کانفیگ اصلی در مسیر /etc/nftables.conf قرار دارد. ما تمام فایل را پاک کرده و ساختار جدید را مینویسیم.
دستور زیر را بزنید تا فایل باز شود:
nano /etc/nftables.conf
سپس محتویات زیر را دقیقا جایگزین کنید (توضیحات هر بخش در ادامه آمده است):
nft
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
define BLOCKED_GATEWAY = 192.168.1.1
define LOCAL_NET = 192.168.1.0/24
define TRUNKS = { 185.98.113.0/24 }
chain input {
type filter hook input priority filter; policy accept;
# قانون ۱: دراپ کردن ترافیک UDP 5060 از سمت گیتوی
ip saddr $BLOCKED_GATEWAY udp dport 5060 counter drop
# قانون ۲: اجازه دسترسی به شبکه داخلی
ip saddr $LOCAL_NET counter accept
# قانون ۳: اجازه دسترسی به ترانکها (آسیاتک و ...)
ip saddr $TRUNKS counter accept
# قانون ۴ تا ۱۰: بررسی User-Agent برای پورت 5060 (Deep Packet Inspection)
# نکته: بررسی String خام در nftables کمی متفاوت است و معمولا از آفست استفاده میشود.
# اما روش تمیزتر استفاده از Raw Payload است. در اینجا معادلسازی دقیق لاجیک iptables را میبینید.
udp dport 5060 @th,64,96 "User-Agent: Yealink" counter accept
udp dport 5060 @th,64,96 "User-Agent: MicroS" counter accept
udp dport 5060 @th,64,96 "User-Agent: Zoiper" counter accept
udp dport 5060 @th,64,96 "User-agent: eyeBea" counter accept
udp dport 5060 @th,64,96 "User-Agent: Z" counter accept
udp dport 5060 @th,64,96 "User-Agent: Grands" counter accept
udp dport 5060 @th,64,96 "User-Agent: Htek" counter accept
udp dport 5060 @th,64,96 "User-Agent: Akuvox" counter accept
# قانون ۱۱ و ۱۲: بستن همه روی پورت های SIP و IAX
# (دقت کنید چون policy پیش فرض accept است، باید صراحتا drop کنیم)
udp dport 5060 counter drop
udp dport 4569 counter drop
# دسترسی SSH (اختیاری ولی حیاتی - مراقب باشید دسترسی خودتان قطع نشود)
tcp dport 22 counter accept
# اجازه به ترافیکهای Established (برای اینکه پاسخ درخواستهای سرور برگردد)
ct state established,related counter accept
# اجازه به ترافیک Loopback
iif "lo" accept
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
نکات بسیار مهم در مورد کد بالا:
- بررسی String (User-Agent)
در iptables از ماژول string استفاده میشد که کل پکت را میگشت. این کار بار زیادی روی CPU دارد. در nftables روش استاندارد بررسی Payload است. اما چون مکان User-Agent در هدر SIP متغیر است، کد بالا یک نسخه سادهسازی شده است.
توصیه امنیتی: فیلتر کردن بر اساس User-Agent در لایه فایروال روشی غیرمطمئن است (چون هکرها به راحتی میتوانند هدر خود را جعل کنند). بهتر است این کار در خود کانفیگ Asterisk/Kamailio انجام شود.
- ترتیب قوانین:
ترتیب بسیار مهم است. ابتدا IP های مجاز (Allow) چک میشوند، سپس User-Agent ها، و در نهایت هر چه باقی ماند روی پورت ۵۰۶۰ بسته (Drop) میشود.
قدم چهارم: اعمال تغییرات
بعد از ذخیره فایل، با دستور زیر کانفیگ را لود کنید:
nft -f /etc/nftables.conf
اگر خطایی دریافت نکردید، یعنی سینتکس درست است. حالا سرویس را ریستارت کنید تا مطمئن شوید در بوت بعدی هم اجرا میشود:
systemctl restart nftables
قدم پنجم: بررسی وضعیت فایروال
برای اینکه ببینید چه قوانینی در حال اجرا هستند و چند پکت توسط هر رول گرفته شده است، بزنید:
nft list ruleset
اضافه کردن دستی (بدون تغییر در فایل)
اگر خواستید یک IP جدید (مثلا آیپی یک مشتری جدید با آیپی 2.2.2.2) را سریعا باز کنید، نیازی نیست فایل را ویرایش کنید. کافیست دستور زیر را بزنید:
nft insert rule inet filter input ip saddr 2.2.2.2 counter accept
(دستور insert رول را به بالای لیست میبرد تا اولویت داشته باشد).
موفق باشید!