اصولاً باب شده تا sysadmin ها از پیکربندیهای لایه ۴ استفاده نمایند که این موضوع در کل کار قشنگی نیست. هرزگاهی باید از لایههای پایینتر استفاده نمود و یا مشکلاتی را حل کرد که پایینتر از لایه ۴ باید حل شوند.(مدل ۴ لایهای) یک مثال بارز این جریان دایرکتیو MaxKeepAliveRequests آپاچی میباشد که اگر به آن پارامتر 0 دهیم بدان معنیست که بینهایت connection را بپیذیر و اگر عددی دیگر دهیم مقدار connection مربوطه است. فرض کنید شما به آن 0 پاس کردید یا نه اصلاً شما وب سرور نیستید. شما daemon هستید که شرکت شما آن را نوشته و مثلاً به دو پورت ۱۸۵۰۰ , ۱۸۵۰۱ گوش فرا میدهد. و هیچ پورت دیگری هم باز ندارید و سرویسی را در حال اجرا نگذاشتهاید.
اما مشکل از اینجا شروع میشود که بیشتر از ۱۷۰۰ کلاینت نمیتوانند به شما وصل شوند. نه firewall ی سر راه است نه چیز دیگری….!
بیایید صورت مسأله را نگه داریم و چند هویت را بازنگری کنیم.
تا وقتی اسم netfilter شنیده میشود ناخدا آگاه iptables بر ذهن حک میشود. در صورتی که netfilter پروژهای بزرگتر از یک firewall میباشد. قسمتی از پروژه netfilter یک سری hook برای داخل کرنل لینوکس میباشد. برای اطلاعات بیشتر به سایت netfilter رجوع کنید.
یکی از قابیلتهای Netfiler ماژول ip_conntrack میباشد.
نکته: ما امروز به دیگر قابلیتهای ip_conntrack کاری نداریم و با بیش از ۲ ۳ متغیر آنکه قبلاً در proc/ و امروزه روز با sysctl دستکاری میشود کاری نداریم.
نکته: conntrack مخفف Connection(s) Track میباشد که از همین نقطه بقیه قضایا شروع میشود.
فرمان زیر را اجرا کنید تا ببینیم ماژول ip_conntrack بر روی ماشین شما لود شده است یا خیر؟
1 |
root@debian:/home/mohsen# sysctl -a |grep -i ip_conntrack |
اگر لود نشده بود هیچ پیغامی برنمیگردد و اگر لود شده بود خروجی زیرا را خواهید داشت:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
net.ipv4.netfilter.ip_conntrack_buckets = 16384 net.ipv4.netfilter.ip_conntrack_checksum = 1 net.ipv4.netfilter.ip_conntrack_count = 0 net.ipv4.netfilter.ip_conntrack_generic_timeout = 600 net.ipv4.netfilter.ip_conntrack_icmp_timeout = 30 net.ipv4.netfilter.ip_conntrack_log_invalid = 0 net.ipv4.netfilter.ip_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_tcp_be_liberal = 0 net.ipv4.netfilter.ip_conntrack_tcp_loose = 1 net.ipv4.netfilter.ip_conntrack_tcp_max_retrans = 3 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close = 10 net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 432000 net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30 net.ipv4.netfilter.ip_conntrack_tcp_timeout_max_retrans = 300 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv = 60 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_sent2 = 120 net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.ip_conntrack_udp_timeout = 30 net.ipv4.netfilter.ip_conntrack_udp_timeout_stream = 180 |
اگر لود نشده بود کافیست فرمان زیر را جرا نمایید:
1 |
root@debian:/home/mohsen# modprobe ip_conntrack |
نکته: چگونه آن را به صورت دايم لود کنم؟
سؤال قشنگی است حتماً اسم ماژول بر مبنای اسم فایلها آنها نیست باید با فرمان زیر اسم فایل را بدست آوریم تا از روی فایل لود کنیم.
1 2 |
root@debian:/home/mohsen# modinfo -n ip_conntrack /lib/modules/3.16.0-4-amd64/kernel/net/ipv4/netfilter/nf_conntrack_ipv4.ko |
نکتهای که ایجا قابل تأمل است تمیز دادن اسم فایل از اسم ماژول است، هر چند که اسم ماژول اینجا از اسم فایل ماژول مجزا میباشد و جالب اینجاست که ip_conntrack یک alias به نام ماژول است.
برای اینکار یک فایل در دایرکتوری /etc/modules-load.d/ به نامip_conntrack.conf میسازیم و اسم nf_conntrack_ipv4 را درون آن مینویسیم.
برای لود کردن ماژول نیاز به restart کردن سیستم نداریم و در systemd کافیست فرمان زیر را وارد نماییم:
1 |
root@debian:/home/mohsen# systemctl status systemd-modules-load.service |
و در SysV باید از فرمان زیر استفاده نماییم:
1 |
root@debian:/home/mohsen# /etc/init.d/kmod restart |
حال همه چیز آماده است تا برگردیم به صورت مسأله، بله بیش از ۱۷۰۰ کلاینت نمیتوانند به سرور ما وصل شوند.
۲ متغیر اساسی در sysctl وجود دارند که بیانگر این موضوعند، یکی net.ipv4.netfilter.ip_conntrack_max که شامل ماکسیمم کانکشنهای مربوطه میشود و دیگری net.ipv4.netfilter.ip_conntrack_count که شامل تعداد کانکشنهای جاری وصل شده به سیستم!! دراین حالت net.ipv4.netfilter.ip_conntrack_max ما به ۱۷۰۰ تغییر کرده که نمیتوان بیشتر از آن کانکشن زد و count آن ، مساوی همین رقم است.
در لپتاپم count مساوی با 15 بود و max را 20 قرار دادم , و چند کانکشن زدم و اتفاق زیر روی داد:
در حالت بالا گیر کرد تا یک connection قطع گردید.
توصیه: شما با حالتهای مختلف میتوانید این دو را چک کنید و نگذارید count برابر max شود.