إطار nftables هو نظام تصفية الحزم في أنوية لينكس الحديثة، وتعتمد عليه Debian منذ عدة إصدارات؛ فمنذ Debian 10 صار الأمر iptables نفسه هو النسخة iptables-nft التي تكتب قواعد nftables في الخلفية. يشرح هذا الدليل إعداد جدار حماية صغير على مستوى الخادم في Debian 12 (bookworm) أو Debian 13 (trixie) يسمح باتصالات SSH والويب ويحجب ما سواها، ويبقى فعّالاً بعد إعادة التشغيل، ويوضح علاقته بأداة ufw وDocker وجدار الحماية السحابي الموجود أمام الخادم.
كيف تترابط المكونات
- nft هي أداة سطر الأوامر. تُكتب القواعد داخل جداول تحتوي على سلاسل، والسلسلة المرتبطة بنقطة
inputترى الحزم الموجهة إلى الخادم. والجدول من عائلةinetيغطي IPv4 وIPv6 معاً. /etc/nftables.confهو الملف الذي تحمّله Debian عند الإقلاع إذا فُعّلت الخدمةnftables.service، كما توضح ويكي Debian. يأتي Debian 12 بالإصدار 1.0.6 من nftables، ويأتي Debian 13 بالإصدار 1.1.3 (متتبع الحزم).- iptables-nft وufw وDocker: تدير ufw جدار الحماية عبر iptables، ويستخدم Docker أداة iptables افتراضياً. وهذا يعني في Debian أن قواعدهما تنتهي أيضاً داخل nftables وتظهر في ناتج
nft list ruleset. ووجود أداتين تعدّلان جدار الحماية نفسه هو أكثر أسباب الالتباس شيوعاً، لذا اختر أداة واحدة لكل خادم.
قبل أي تغيير: لا تُغلق الباب على نفسك
قد يقطع خطأ في جدار الحماية جلسة SSH الخاصة بك على خادم بعيد. وتمنع ثلاث عادات معظم هذه الحوادث: أبقِ الجلسة الحالية مفتوحة واختبر من جلسة ثانية، وافحص الملف قبل تحميله، وجدول تراجعاً تلقائياً تلغيه بعد التأكد من أن الدخول يعمل. يمكن للأداة systemd-run إنشاء هذا المؤقت (راجع systemd-run(1)):
sudo apt update
sudo apt install nftables
# undo in 5 minutes unless cancelled: removes all rules
sudo systemd-run --unit=nft-rollback --on-active=300 /usr/sbin/nft flush rulesetمجموعة قواعد مختصرة لـ SSH وHTTP(S)
الملف التالي مقتبس من مثال الخادم في ويكي nftables. يحجب الحركة الواردة افتراضياً، ويقبل الردود على الاتصالات التي بدأها الخادم، ويسمح بواجهة loopback، ويحدّ من معدل ping، ويُبقي رسائل اكتشاف الجيران في ICMPv6 التي يحتاجها IPv6، ويفتح منافذ TCP رقم 22 و80 و443.
#!/usr/sbin/nft -f
# /etc/nftables.conf
flush ruleset
table inet firewall {
chain inbound_ipv4 {
icmp type echo-request limit rate 5/second accept
}
chain inbound_ipv6 {
icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
icmpv6 type echo-request limit rate 5/second accept
}
chain inbound {
type filter hook input priority 0; policy drop;
ct state vmap { established : accept, related : accept, invalid : drop }
iifname lo accept
meta protocol vmap { ip : jump inbound_ipv4, ip6 : jump inbound_ipv6 }
tcp dport 22 accept
tcp dport { 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
}لا توجد سلسلة للحركة الصادرة، لذا تبقى الاتصالات الخارجة مسموحة. وإذا كان SSH يعمل على منفذ آخر فغيّر الرقم 22 قبل تحميل الملف.
الفحص والتحميل والإبقاء بعد إعادة التشغيل
# syntax check only, nothing is applied
sudo nft -c -f /etc/nftables.conf
# apply
sudo nft -f /etc/nftables.conf
sudo nft list ruleset
# now open a NEW SSH session; if it works, cancel the undo timer
sudo systemctl stop nft-rollback.timer
# load the file at every boot
sudo systemctl enable nftables.serviceيتحقق الخيار -c (أي --check) من صحة الأوامر دون تطبيقها، كما يوثّق دليل nft(8). أما القواعد التي تضاف أثناء التشغيل بالأمر nft add rule فتضيع عند إعادة التشغيل ما لم تُكتب في الملف أيضاً.
حصر SSH في عناوين معروفة
إذا كنت تتصل دائماً من عناوين ثابتة، فإن مجموعة مسمّاة (set) تُبقي القاعدة سهلة القراءة. أضف المجموعة داخل الجدول واستبدل قاعدة SSH العامة:
set ssh_admins {
type ipv4_addr
flags interval
elements = { 203.0.113.10, 198.51.100.0/24 }
}
# in chain inbound, instead of: tcp dport 22 accept
ip saddr @ssh_admins tcp dport 22 acceptتسمح الراية interval بأن تحتوي المجموعة على نطاقات عناوين. وهذه القاعدة تطابق IPv4 فقط؛ فإن كنت تدير الخادم عبر IPv6 فأضف مجموعة من نوع ipv6_addr وقاعدة ip6 saddr كذلك، وإلا فستُغلق الوصول على نفسك عبر IPv6.
موقع ufw وDocker وجدار الحماية السحابي
- ufw: مناسبة للخوادم البسيطة، لكن لا تحمّل معها ملف
/etc/nftables.confخاصاً بك على الجهاز نفسه. اختر واحداً منهما. flush rulesetيحذف كل الجداول لا جدولك وحده، ودليل nft صريح في أنه يترك مجموعة قواعد فارغة. لذلك فإن إعادة تحميل الملف تمسح أيضاً القواعد التي أنشأها Docker أو ufw أو غيرهما.- خوادم Docker: ينص دليل تثبيت Docker على أن القواعد المنشأة بالأمر
nftغير مدعومة على نظام مثبّت عليه Docker، وأن منافذ الحاويات المنشورة تتجاوز قواعد ufw وfirewalld. على خادم Docker اتبع إرشادات Docker لتصفية الحزم (أي iptables والسلسلةDOCKER-USER) بدلاً من ملف مكتوب يدوياً يبدأ بـflush ruleset. - جدار الحماية السحابي: الجدار الموجود أمام الخادم يوقف الحركة غير المرغوبة قبل وصولها إلى نظام التشغيل، ويظل يعمل حتى لو أخطأت في قاعدة على الخادم. في خوادم VPS من Skyline Cloud في الرياض يُدار جدار الحماية السحابي من لوحة التحكم ويُطبَّق خارج الخادم (نظرة عامة على VPS). استخدمه طبقةً خارجية وnftables طبقةً داخلية، مع قائمة المنافذ المفتوحة نفسها في الطبقتين.
أخطاء شائعة
- نسيان قواعد اكتشاف الجيران في ICMPv6، فينقطع اتصال IPv6 بطريقة تبدو كأنها عطل في الشبكة.
- ضبط
policy dropعلى سلسلةforwardفي خادم يمرّر الحركة، مثل بوابة VPN أو مضيف حاويات. عدّل هذه السلسلة بحسب دور الخادم. - الاختبار من الجلسة المفتوحة فقط؛ فالاتصالات القائمة تستمر في العمل حتى لو حُجبت الاتصالات الجديدة.
- تعديل الملف دون إعادة تحميله، أو تحميله دون تفعيل الخدمة.
ما الذي ينبغي فعله
- حدّد الأداة المسؤولة عن جدار الحماية في كل خادم: ملف nftables مكتوب يدوياً، أو ufw، أو قواعد Docker مع
DOCKER-USER. - ابدأ من مجموعة القواعد المختصرة أعلاه، وافتح فقط المنافذ التي يقدّمها الخادم فعلاً، واحفظ الملف في نظام لإدارة الإصدارات.
- شغّل دائماً
nft -c -fأولاً، وأبقِ التراجع المؤقت قائماً حتى ينجح دخول SSH جديد. - فعّل
nftables.serviceلتعود القواعد بعد إعادة التشغيل، وتحقق منها بالأمرnft list ruleset. - كرّر المنافذ المفتوحة نفسها في جدار الحماية السحابي أمام الخادم، حتى لا يكون خطأ على الخادم هو خط الدفاع الوحيد.
المصادر
- wiki.debian.org/nftables
- wiki.nftables.org/wiki-nftables/index.php/Simple_ruleset_for_a_server
- manpages.debian.org/trixie/nftables/nft.8.en.html
- manpages.debian.org/trixie/systemd/systemd-run.1.en.html
- manpages.debian.org/trixie/ufw/ufw.8.en.html
- tracker.debian.org/pkg/nftables
- docs.docker.com/engine/network/packet-filtering-firewalls
- docs.docker.com/engine/install/debian
- cloud.alskyline.com/vps-saudi-arabia
Comments
0 total · 0 threads