Fail2ban سب سے پہلے نصب کیا جاتا ہے اور عموماً وہیں معاملہ ختم بھی ہو جاتا ہے: پیکج اندر ہے، سروس چل رہی ہے، اور sshd بظاہر محفوظ ہے۔ چھ ماہ بعد پتا چلتا ہے کہ jail ایسی فائل پڑھ رہا ہے جو اس نظام پر موجود ہی نہیں، اور باقی سب کچھ — میل، کنٹرول پینل، سائٹ کا لاگ اِن فارم — کبھی محفوظ تھا ہی نہیں۔

آئیے دیکھتے ہیں کہ سائٹ والے ایک عام VPS پر کیا فعال کرنا چاہیے، وہاں کون سے اعداد رکھیں، اور کیسے یقین کریں کہ jail کام کر رہا ہے نہ کہ محض ترتیبات میں موجود ہے۔

پہلے جانچیں کہ sshd کچھ پکڑ رہا ہے

ایک کمانڈ:

sudo fail2ban-client status sshd

نتیجے میں Currently failed، Total failed اور Total banned کی سطریں ہوتی ہیں۔ اگر ایسے سرور پر جو کم از کم ایک دن انٹرنیٹ پر رہا ہو Total failed صفر ہے تو jail کام نہیں کر رہا۔ اسے حقیقت سے ملائیں:

sudo lastb | wc -l

lastb میں ہزاروں ناکام کوششیں اور Fail2ban میں صفر کا مطلب بالکل ایک ہی ہے: فلٹر غلط جگہ دیکھ رہا ہے۔

سب سے عام سبب Debian 12 ہے۔ یہ اب بطور طے شدہ rsyslog نصب نہیں کرتا، فائل /var/log/auth.log سرے سے موجود نہیں، اور طے شدہ jail sshd اسی فائل کو پڑھنے کے لیے مرتب ہے۔ اس بارے میں کوئی خرابی کا پیغام بھی نہیں: سروس چل پڑتی ہے، حالت چھپ جاتی ہے، اور شمار کنندے صفر پر رہتے ہیں۔ حل systemd کے جرنل پر منتقل ہونا ہے:

[sshd]
enabled = true
backend = systemd

دوسرا راستہ rsyslog کو بطور پیکج واپس لانا ہے، اگر سادہ متنی auth.log دوسرے اوزاروں کے لیے اہم ہو۔ Ubuntu 24.04 بھی اسی طرح برتاؤ کرتا ہے۔

اپنی ترتیبات کہاں رکھیں

/etc/fail2ban/jail.conf کو ہاتھ نہ لگائیں: پیکج کی تازہ کاری پر یہ اوپر سے لکھ دیا جاتا ہے، اور وہاں کی گئی ہر ترمیم ایک دن خاموشی سے غائب ہو جائے گی۔ آپ کی ترتیبات /etc/fail2ban/jail.local میں جاتی ہیں — یہ فائل آخر میں پڑھی جاتی ہے اور مشترکہ فائل پر غالب آتی ہے۔

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.25
bantime  = 1h
findtime = 10m
maxretry = 5
backend  = systemd

اپنے پتے کے ساتھ ignoreip عیاشی نہیں بلکہ بیمہ ہے: ایک ٹائپنگ کی غلطی سے خود کو باہر بند کر لینا جتنا لگتا ہے اس سے آسان ہے۔ اور اگر آپ کے پاس مستقل پتہ نہیں تو SSH کے علاوہ داخلے کا دوسرا راستہ رکھیں — اپنے فراہم کنندہ کا کنسول یا VNC۔

وہ jail جو تصویر بدل دیتا ہے: recidive

عام jail کی یادداشت مختصر ہے: دس منٹ میں پانچ کوششیں، ایک گھنٹے کی پابندی، اور ایک گھنٹے بعد سب کچھ نئے سرے سے۔ بوٹ اس کے ساتھ آرام سے گزارا کر لیتا ہے اور کل اور پرسوں بھی لوٹ آئے گا۔ recidive عین اسی خلا کو بند کرتا ہے: یہ نظام کا جرنل نہیں بلکہ خود Fail2ban کا جرنل پڑھتا ہے، یعنی اسی کو روکتا ہے جسے Fail2ban پہلے ہی روک چکا ہے۔

[recidive]
enabled  = true
bantime  = 1w
findtime = 1d
maxretry = 5

اسے یوں پڑھیں: «ایک دن میں پانچ بار پابندی لگی، ایک ہفتے کے لیے غائب»۔ اس jail کو فائل /var/log/fail2ban.log درکار ہے، لہٰذا اگر آپ نے خود Fail2ban کی لاگنگ syslog میں منتقل کر دی ہے تو recidive کو بھی backend = systemd چاہیے ہوگا۔

عملاً اس ایک jail کا اثر عموماً باقی سب کی باریک ترتیب سے زیادہ محسوس ہوتا ہے: باقاعدہ آنے والے چھٹ جاتے ہیں اور لاگ میں صرف تازہ پس منظر رہ جاتا ہے۔

جب سرور پر سائٹ ہو تو اور کیا فعال کریں

افادیت کے گھٹتے ہوئے ترتیب سے:

  • nginx-http-auth یا apache-auth — بنیادی تصدیق کے خلاف اندازہ لگانا۔ ضروری اگر انتظامی حصہ یا آزمائشی سائٹ ویب سرور کے پاس ورڈ کے پیچھے ہو؛
  • nginx-botsearch — معلوم راستوں کی اسکیننگ: /wp-login.php، /phpmyadmin، /.env۔ یہ نقب زنی نہیں بلکہ جاسوسی ہے، اور یہی ہر چیز سے پہلے آتی ہے؛
  • nginx-limit-req — صرف اسی صورت کام کرتا ہے جب خود Nginx میں limit_req_zone متعین ہو؛ ورنہ jail فعال اور بے کار ہے؛
  • postfix-sasl اور dovecot — لازمی اگر آپ کی اپنی میل ہو۔ میل باکسوں کے پاس ورڈ کا اندازہ لگانا مسلسل چلتا ہے اور عموماً کوئی اس پر نظر نہیں رکھتا۔
[nginx-botsearch]
enabled = true
logpath = /var/log/nginx/access.log

خود سائٹ کا لاگ اِن فارم الگ کہانی ہے۔ ایپلیکیشن کے پاس ناکام لاگ اِن کا اپنا لاگ نہیں ہوتا، اور access.log میں ناکام کوشش 200 یا 302 کے ساتھ ایک عام POST جیسی نظر آتی ہے — کوئی بھی عمومی فلٹر اسے کامیاب کوشش سے الگ نہیں کر سکتا۔ دو راستے ہیں: ایپلیکیشن سے ناکامیاں syslog میں لکھوائیں (بیشتر مواد کے انتظامی نظاموں کے لیے اس کا پلگ اِن موجود ہے)، یا لاگ اِن صفحے پر درخواستوں کی رفتار محدود کریں۔ دوسرا محدود کرنے والا ہے، پہچاننے والا نہیں، اور یہ پہلے سے جان لینا بہتر ہے۔

اعداد

bantime = 10m وہ طے شدہ قدر ہے جس کی وجہ سے لوگ Fail2ban کو بے کار قرار دے دیتے ہیں: دس منٹ بوٹ کے لوٹنے کے لیے کافی ہیں۔ پہلی پابندی کے لیے ایک گھنٹہ اور ساتھ ایک ہفتے کا recidive مستقل پابندیوں سے کہیں بہتر کام کرتا ہے، جو وقت کے ساتھ قواعد کی نہ ختم ہونے والی فہرست بن جاتی ہیں۔

SSH کے لیے maxretry = 3 خود کو باہر بند کرنے کا یقینی طریقہ ہے۔ دس منٹ میں پانچ کوششیں اندازہ لگانے کو اتنی ہی خوبی سے کاٹ دیتی ہیں۔

سست اندازہ — ہر پانچ منٹ میں ایک کوشش — کبھی findtime کے اندر نہیں آئے گا۔ یہ کھڑکی کو ایک دن تک کھینچنے کی وجہ نہیں: آپ کو اپنے ہی ساتھیوں کے خلاف جھوٹی اطلاعات ملیں گی۔ سست اندازے کے خلاف کوئی حد نہیں بلکہ پاس ورڈ کی تصدیق بند کرنا کام آتا ہے۔

یقین کریں کہ پابندی پیکٹوں تک پہنچتی ہے

Fail2ban صرف ایک بیرونی کمانڈ چلاتا ہے۔ اگر banaction اس چیز سے میل نہ کھائے جو واقعی ٹریفک چھانتی ہے تو لاگ Ban 198.51.100.7 جیسی خوش کن سطروں سے بھرتا رہے گا جبکہ پیکٹ آتے رہیں گے۔ Debian 12 بطور طے شدہ nftables استعمال کرتا ہے، اور UFW فعال ہو تو درست انتخاب banaction = ufw ہے۔ جانچ کے لیے:

sudo nft list ruleset | grep -c f2b
sudo iptables -S | grep f2b

دونوں میں سے کم از کم ایک کو قواعد دکھانے چاہئیں۔ اور خود فلٹر کو حملے کا انتظار کیے بغیر آزمایا جا سکتا ہے:

sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/sshd.conf

نتیجے کے نیچے لکھا ہوتا ہے کہ کتنی سطریں میل کھائیں۔ صفر کا مطلب ہے کہ فلٹر اور لاگ آپس میں نہیں ملتے، اور آگے کچھ بھی مرتب کرنے کا فائدہ نہیں۔

Fail2ban کیا نہیں کرتا

یہ تقسیم شدہ اندازے سے حفاظت نہیں کرتا: ہزار پتے، ہر ایک کی ایک کوشش، کسی بھی ترتیب پر حد تک نہیں پہنچیں گے۔ یہ سبب دور نہیں کرتا — پابندی زدہ پتہ کمزور پاس ورڈ کو باطل نہیں کرتا۔ اور یہ ساکھ کے بارے میں کچھ نہیں جانتا: وہ پتہ جس نے کل دوسروں کے سرور توڑنے میں گزارا، اس کے نزدیک صاف ہے جب تک آپ کے سرور پر ہاتھ نہ ڈالے۔ اسی سے وہ امتزاج نکلتا ہے جو عملاً استعمال ہوتا ہے: پاس ورڈ کی جگہ کلیدیں، شور کم کرنے والے کے طور پر Fail2ban، اور دوسروں کے تجربے کے علم کے طور پر مشترکہ پابندی فہرست (CrowdSec

ایک الگ مسئلہ یہ ہے کہ ان سب پر کبھی کبھار نظر ڈالنی پڑتی ہے۔ کوئی ہفتوں تک ہر jail کے لیے fail2ban-client status نہیں لکھتا، اور پابندیوں کی بڑھتی تعداد اُس وقت نظر آتی ہے جب کچھ ٹوٹ چکا ہو۔ نیچے ڈیمو صفحات پر وہی ڈیٹا ایک صفحے پر جمع ہے: jail کی فہرست، اِس وقت کون پابند ہے، اور کوششیں کہاں سے آ رہی ہیں۔