المستوى المطلوب: محترف (Professional) — هذا المقال موجّه لمهندسي DevOps ومسؤولي الأنظمة اللي بيديروا سيرفرات لينكس تحت حِمل شبكي عالي. الفرضية إن عندك خدمة بتستقبل آلاف الاتصالات في الثانية على جدار حماية أو Load Balancer أو Kubernetes node.
لو سيرفرك فجأة بيرفض اتصالات جديدة، والـ CPU والرام مرتاحين، والـ ping شغّال بس الـ TCP بيعلّق، غالبًا مالوش علاقة بالتطبيق. الجاني الحقيقي سطر واحد في الـ kernel log: nf_conntrack: table full, dropping packet. هنا هتعرف تشخّصها في أقل من دقيقة وتصلّحها صح من غير ما تفتح ثغرة ذاكرة.
nf_conntrack: table full — لماذا يتوقف سيرفرك عن قبول الاتصالات فجأة
المشكلة باختصار
لينكس بيتتبّع كل اتصال شبكي ماشي عبر الـ firewall في جدول اسمه nf_conntrack. الجدول ده له سقف. لمّا يمتلي، الـ kernel بيبدأ يرمي أي حزمة SYN جديدة على الأرض، فالمستخدم بيشوف الموقع "واقف" مع إن السيرفر مرتاح. المشكلة دي بتضرب البوابات (gateways)، الـ reverse proxies، وعُقد Kubernetes تحت ترافيك كثيف أو أثناء هجوم SYN flood.
يعني إيه conntrack أصلًا؟ (مثال بسيط الأول)
تخيّل موظف استقبال في فندق معاه دفتر. كل ضيف بيدخل، بيكتب اسمه ورقم غرفته في سطر. لمّا الضيف يمشي، بيشطب السطر. الدفتر ده بيخلّي الموظف يعرف مين جوّه ومين بيرجع لأي غرفة. المشكلة: الدفتر عدد صفحاته محدود. لو دخل ضيوف أكتر من عدد السطور، الموظف مش هيقدر يسجّل ضيف جديد، فبيقفله على الباب حتى لو الفندق نفسه فاضي.
ده بالظبط اللي بيعمله nf_conntrack. الـ conntrack (connection tracking) هو النظام اللي بيخلّي الـ Netfilter/iptables "stateful": بيربط الحزمة الراجعة بالاتصال اللي طلبها، وبيسمح بقواعد زي --ctstate ESTABLISHED,RELATED. كل اتصال (زوج IP/port في الاتجاهين + البروتوكول) بياخد سطر في جدول hash في ذاكرة الـ kernel. لمّا عدد الأسطر nf_conntrack_count يوصل للسقف nf_conntrack_max، أي حزمة تبدأ اتصال جديد بتتساب invalid وتتدروب، والـ kernel بيسجّل السطر الشهير في dmesg.
إزاي تكتشفها في أقل من دقيقة
أول حاجة، دوّر على السطر في الـ kernel log:
# لو لقيت السطر ده، المشكلة اتأكدت
dmesg | grep -i "nf_conntrack: table full"
# قارن العدد الحالي بالسقف
sysctl net.netfilter.nf_conntrack_count
sysctl net.netfilter.nf_conntrack_max
# مثال ناتج:
# net.netfilter.nf_conntrack_count = 262144
# net.netfilter.nf_conntrack_max = 262144 <-- count == max يعني ممتلئلو count بيلامس max باستمرار، انت في المنطقة الخطر. اعرف كمان مين ماخد أكبر عدد أسطر عشان تفرّق بين حِمل حقيقي وهجوم أو تسريب اتصالات: