गाइड

Fail2ban: SSH को पासवर्ड ब्रूट-फ़ोर्स से बचाने का सेटअप

अपडेट किया गया: · Skillaria.Top

Fail2ban सेवाओं के लॉग पढ़ता है, बार-बार होने वाली असफल लॉगिन कोशिशें पहचानता है और हमलावर IP को firewall के ज़रिए कुछ समय के लिए ब्लॉक कर देता है। SSH के लिए बस पैकेज इंस्टॉल करें, /etc/fail2ban/jail.local में [sshd] सेक्शन बनाएँ (enabled = true, maxretry, findtime, bantime) और सेवा दोबारा चलाएँ; स्थिति fail2ban-client status sshd से देखी जाती है।

Fail2ban एक डेमन है जो सेवाओं के लॉग पर नज़र रखता है, बार-बार होने वाली असफल लॉगिन कोशिशें पहचानता है और उस IP को कुछ समय के लिए ब्लॉक कर देता है। SSH के लिए यह पासवर्ड ब्रूट-फ़ोर्स के खिलाफ़ सबसे सरल बचाव है: कुछ गलत कोशिशों के बाद बॉट सर्वर पर दस्तक देना बंद कर देते हैं। नीचे इंस्टॉल से लेकर बैन जाँचने और आम गलतियों तक पूरा fail2ban सेटअप है।

SSH-key होने पर भी fail2ban क्यों चाहिए

पोर्ट 22 खुला हो तो शुरू होने के कुछ ही मिनटों में हर सर्वर पर बॉट लॉगिन की कोशिशें आने लगती हैं। खुद देखें:

$ sudo journalctl -u ssh --since "1 hour ago" | grep -c "Failed password"
412

अगर पासवर्ड से लॉगिन बंद है और केवल key चलती है, तो एक्सेस तोड़ना लगभग नामुमकिन है। फिर भी fail2ban उपयोगी है: वह लॉग का शोर कम करता है, हज़ारों कनेक्शनों का लोड घटाता है, और अगर गलती से पासवर्ड वाला लॉगिन फिर से चालू हो जाए तब भी बचाव करता है। यह key का विकल्प नहीं, दूसरी परत है।

fail2ban कैसे काम करता है

इसके तीन हिस्से हैं:

  • फ़िल्टर (filter) — regular expressions का सेट, जो लॉग में असफल कोशिश वाली पंक्तियाँ ढूँढता है और उनसे IP निकालता है। फ़िल्टर /etc/fail2ban/filter.d/ में रहते हैं।
  • एक्शन (action) — दोषी के साथ क्या करना है: iptables, nftables, ufw या firewalld में नियम जोड़ना। एक्शन /etc/fail2ban/action.d/ में रहते हैं।
  • जेल (jail) — फ़िल्टर, एक्शन, लॉग के स्रोत और सीमाओं का जोड़। उदाहरण के लिए jail sshd SSH का लॉग देखता है।

अगर findtime के भीतर एक IP से maxretry मिलान हो जाएँ, तो वह पता bantime तक ब्लॉक होता है। समय पूरा होने पर बैन अपने-आप हट जाता है।

fail2ban इंस्टॉल करना

Debian और Ubuntu पर:

sudo apt update
sudo apt install fail2ban

RHEL, Rocky, AlmaLinux पर पैकेज EPEL रिपॉज़िटरी में है:

sudo dnf install epel-release
sudo dnf install fail2ban

ऑटोस्टार्ट चालू करें और सेवा की स्थिति जाँचें:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

Debian और Ubuntu में SSH की jail /etc/fail2ban/jail.d/defaults-debian.conf के ज़रिए पहले से चालू होती है। RHEL परिवार में इंस्टॉल के बाद कुछ भी चालू नहीं होता — jail को हाथ से सक्रिय करना पड़ता है।

सेटिंग कहाँ रहती हैं: jail.conf और jail.local

मुख्य फ़ाइल /etc/fail2ban/jail.conf है, लेकिन उसे सीधे न बदलें: पैकेज अपडेट होने पर वह दोबारा लिख दी जाएगी। अपनी सेटिंग /etc/fail2ban/jail.local या अलग फ़ाइलों /etc/fail2ban/jail.d/*.local में रखें। Fail2ban इन फ़ाइलों को इस क्रम में पढ़ता है, और बाद वाली पिछली को बदल देती है:

  1. jail.conf
  2. jail.d/*.conf
  3. jail.local
  4. jail.d/*.local

पूरा jail.conf jail.local में न कॉपी करें — इससे पुराने डिफ़ॉल्ट मान जम जाएँगे। jail.local में केवल वही लिखें जो बदलना है।

SSH के लिए fail2ban सेटअप: न्यूनतम jail.local

फ़ाइल बनाएँ:

sudo nano /etc/fail2ban/jail.local

और उसमें जोड़ें:

[DEFAULT]
# आपके अपने पते, जिन्हें कभी बैन नहीं करना
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
# लॉग कहाँ से लें: systemd जर्नल या फ़ाइलें
backend  = systemd

[sshd]
enabled  = true
port     = ssh
maxretry = 3

सेवा दोबारा चलाएँ और जाँचें कि जेल चालू हो गई है:

$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

पैरामीटर का मतलब

पैरामीटरअर्थउदाहरण
enabledजेल चालू है या नहींtrue
portदोषी के लिए ब्लॉक होने वाले पोर्टssh, 2222, ssh,2222
maxretryबैन से पहले कितनी गलतियाँ मान्य हैं3
findtimeवह अवधि जिसमें गलतियाँ गिनी जाती हैं10m
bantimeबैन की अवधि; -1 — हमेशा के लिए1h, 1d
ignoreipवे पते और सबनेट जो कभी बैन न हों10.0.0.0/8
backendलॉग का स्रोतsystemd, auto
logpathफ़ाइल-आधारित backend के लिए लॉग फ़ाइल का पथ/var/log/auth.log
banactionबैन करने के लिए कौन-सा firewallnftables-multiport, ufw

समय के साथ प्रत्यय लिखे जा सकते हैं: s, m, h, d, w। बिना प्रत्यय के संख्या को सेकंड माना जाता है।

backend: systemd या फ़ाइल

आधुनिक Debian 12 और Ubuntu 24.04 पर अगर rsyslog इंस्टॉल नहीं है, तो /var/log/auth.log हो ही नहीं सकती: SSH के लॉग केवल systemd जर्नल में होते हैं। ऐसे में backend = systemd चाहिए, वरना fail2ban इस त्रुटि के साथ नहीं चलेगा कि लॉग फ़ाइल नहीं मिली। अगर rsyslog मौजूद है, तो फ़ाइल वाला विकल्प रखा जा सकता है:

[sshd]
enabled  = true
backend  = auto
logpath  = /var/log/auth.log

RHEL सिस्टम पर उसका समकक्ष लॉग /var/log/secure है।

गैर-मानक पोर्ट पर SSH

अगर sshd, मान लीजिए, पोर्ट 2222 पर सुनता है, तो उसे जेल में लिखें — वरना fail2ban पोर्ट 22 ब्लॉक करेगा और हमला 2222 पर जारी रहेगा:

[sshd]
enabled = true
port    = 2222

दोषी के लिए सभी पोर्ट एक साथ ब्लॉक करने के लिए banaction पैरामीटर में iptables-allports या nftables-allports एक्शन दिया जा सकता है।

firewall चुनना: iptables, nftables, ufw, firewalld

Debian में डिफ़ॉल्ट banaction = nftables है (पुराने वर्ज़न में iptables), और RHEL में firewalld। अगर सर्वर पर ufw सेट है, तो बैन उसी में दिखें तो सुविधाजनक है:

[DEFAULT]
banaction = ufw

firewalld के लिए:

[DEFAULT]
banaction = firewallcmd-rich-rules

यह जाँचने के लिए कि नियम सच में जुड़े हैं, sudo nft list ruleset | grep f2b या sudo iptables -L -n | grep f2b चलाएँ: fail2ban f2b- उपसर्ग वाली चेन बनाता है।

काम जाँचना: fail2ban-client status

मुख्य प्रबंधन टूल fail2ban-client है। किसी एक जेल की स्थिति:

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     147
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 4
   |- Total banned:     38
   `- Banned IP list:   45.148.10.12 92.118.39.7 185.224.128.40 218.92.0.112

यहाँ दिखता है कि अभी विंडो में कितनी गलतियाँ हैं, कितने IP बैन हैं और कौन-से। सुरक्षा को लाइव जाँचने के लिए किसी दूसरी मशीन से (जो ignoreip में न हो) गलत पासवर्ड से कई बार लॉगिन करें — तीसरी कोशिश के बाद कनेक्शन बनना बंद हो जाएगा।

fail2ban का अपना लॉग /var/log/fail2ban.log में है:

$ sudo tail -n 3 /var/log/fail2ban.log
2026-10-14 09:12:41,118 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:44,302 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:47,551 fail2ban.actions [812]: NOTICE  [sshd] Ban 218.92.0.112

fail2ban में IP अनब्लॉक कैसे करें

अगर आपने खुद को या किसी सहकर्मी को ब्लॉक कर दिया है, तो सर्वर के कंसोल से (होस्टिंग पैनल के ज़रिए या किसी दूसरे IP से) बैन हटाएँ:

sudo fail2ban-client set sshd unbanip 203.0.113.25

सभी जेल के सारे बैन हटाने के लिए:

sudo fail2ban-client unban --all

फ़िल्टर के चालू होने का इंतज़ार किए बिना किसी पते को हाथ से ब्लॉक करने के लिए:

sudo fail2ban-client set sshd banip 198.51.100.7

दोबारा ऐसा न हो, इसके लिए अपने स्थायी पते या ऑफ़िस का सबनेट ignoreip में जोड़ दें।

बार-बार गड़बड़ी करने वालों के लिए बढ़ता बैन

कई बॉट बैन हटते ही लौट आते हैं। संस्करण 0.11 से fail2ban में बार-बार गड़बड़ी करने वालों के लिए बैन की अवधि बढ़ाने की सुविधा है:

[DEFAULT]
bantime = 1h
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w

उसी IP का हर अगला बैन पिछले से लंबा होगा, पर चार हफ़्ते से ज़्यादा नहीं। पुराने वर्ज़न के लिए विकल्प है recidive जेल, जो fail2ban का अपना लॉग पढ़ती है और जो पता कई बार पकड़ा गया हो, उसे लंबे समय के लिए ब्लॉक करती है:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 1w
findtime = 1d
maxretry = 5

फ़िल्टर की जाँच: fail2ban-regex

अगर जेल चालू है, पर कोई बैन नहीं होता, तो जाँचें कि फ़िल्टर लॉग में पंक्तियाँ पकड़ रहा है या नहीं। फ़ाइल वाले लॉग के लिए:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

systemd जर्नल के लिए:

sudo fail2ban-regex systemd-journal sshd

आउटपुट में Lines: ... matched वाली पंक्ति देखें। शून्य मिलान का मतलब है कि फ़िल्टर लॉग के फ़ॉर्मेट से मेल नहीं खाता या स्रोत गलत है। रीस्टार्ट से पहले पूरी कॉन्फ़िगरेशन का सिंटैक्स भी जाँच लें:

sudo fail2ban-client -t

आम गलतियाँ

  • सेवा शुरू नहीं होती: «Have not found any log file for sshd jail». /var/log/auth.log नहीं है। backend = systemd रखें या rsyslog इंस्टॉल करें।
  • स्थिति में बैन दिखते हैं, पर हमला जारी है। गलत पोर्ट लिखा है (SSH किसी और पोर्ट पर ले जाया गया है), या firewall के नियम किसी पहले के allow नियम से टकरा रहे हैं। port और nft list ruleset का आउटपुट जाँचें।
  • बदलाव लागू नहीं हुए। आपने jail.conf बदला, पर jail.local या jail.d/*.local में कोई दूसरा मान लिखा है। अंतिम मान देखें: sudo fail2ban-client get sshd maxretry।
  • आपने खुद को ब्लॉक कर लिया। कंसोल से अनब्लॉक करें और IP को ignoreip में जोड़ें।
  • Docker में चल रही सेवाओं पर हमले नहीं दिखते। कंटेनर पोर्ट DOCKER चेन के ज़रिए प्रकाशित होते हैं, जो INPUT को बाईपास करती है। ऐसी सेवाओं के लिए एक्शन में chain = DOCKER-USER इस्तेमाल करें।

SSH के लिए और क्या करें

Fail2ban /etc/ssh/sshd_config की बुनियादी सेटिंग के साथ सबसे अच्छा काम करता है:

PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3

बदलाव के बाद sudo sshd -t से कॉन्फ़िगरेशन जाँचें और सेवा दोबारा चलाएँ। मौजूदा सेशन तब तक बंद न करें जब तक नए सेशन में key से लॉगिन काम करता हुआ न दिखे। चाहें तो firewall स्तर पर SSH की पहुँच केवल ज़रूरी पतों तक सीमित कर सकते हैं।

निष्कर्ष

fail2ban सेटअप कुछ चरणों में होता है: पैकेज इंस्टॉल करें, [sshd] सेक्शन वाली jail.local बनाएँ, सही backend और पोर्ट चुनें, maxretry, findtime और bantime तय करें, अपने पते ignoreip में डालें, और fail2ban-client status sshd से जाँचें। केवल key से लॉगिन के साथ यह SSH को पासवर्ड ब्रूट-फ़ोर्स से भरोसेमंद ढंग से बचाता है। सर्वर सुरक्षा और fail2ban का व्यावहारिक अभ्यास Linux कोर्स में किया जाता है।

अक्सर पूछे जाने वाले प्रश्न

अगर पासवर्ड से लॉगिन बंद है, तब भी क्या fail2ban चाहिए?

अनिवार्य नहीं है, पर उपयोगी है: वह लॉग से हज़ारों बेकार कोशिशें हटाता है, लोड घटाता है, और अगर पासवर्ड वाला लॉगिन गलती से फिर चालू हो जाए तो भी सुरक्षा देता है।

सभी जेल में ब्लॉक हुए IP कैसे देखें?

sudo fail2ban-client banned चलाएँ — यह हर जेल के लिए ब्लॉक हुए पतों की सूची दिखाता है। किसी एक जेल के लिए fail2ban-client status sshd इस्तेमाल करें।

सर्वर रीबूट होने के बाद बैन बचे रहते हैं?

हाँ, fail2ban बैन अपने SQLite डेटाबेस (/var/lib/fail2ban/fail2ban.sqlite3) में रखता है और शुरू होने पर सक्रिय बैन फिर लागू कर देता है, बशर्ते dbpurgeage पैरामीटर उन्हें पहले ही न हटा दे।

क्या fail2ban सिर्फ़ SSH की सुरक्षा कर सकता है?

नहीं, उसके साथ nginx, Apache, Postfix, Dovecot और दूसरी सेवाओं के फ़िल्टर आते हैं। jail.local में ज़रूरी जेल चालू करना काफ़ी है, जैसे enabled = true वाला [nginx-http-auth]।

fail2ban और firewall की सीमा में क्या फ़र्क है?

Firewall पतों को स्थायी रूप से अनुमति या मनाही देता है, जबकि fail2ban लॉग में गड़बड़ी दिखाने वालों को गतिशील रूप से बैन करता है। अक्सर दोनों साथ इस्तेमाल होते हैं: firewall में व्हाइटलिस्ट, और बाकी सबके लिए fail2ban।

इस विषय को वीडियो में सीखें

यह विषय “Linux: с нуля до уверенного администрирования” कोर्स में अभ्यास के साथ विस्तार से समझाया गया है।

कोर्स पर जाएँ