Fail2ban: SSH-কে পাসওয়ার্ড ব্রুট-ফোর্স থেকে রক্ষা করার কনফিগারেশন
Fail2ban সার্ভিসের লগ পড়ে, বারবার ব্যর্থ লগইন চেষ্টা খুঁজে বের করে এবং firewall-এর মাধ্যমে আক্রমণকারীর IP সাময়িকভাবে ব্লক করে। SSH-এর জন্য প্যাকেজ ইনস্টল করে /etc/fail2ban/jail.local-এ [sshd] বিভাগ লিখুন (enabled = true, maxretry, findtime, bantime) এবং সার্ভিস রিস্টার্ট করুন; অবস্থা যাচাই হয় fail2ban-client status sshd দিয়ে।
Fail2ban হলো একটি ডেমন, যা সার্ভিসের লগ নজরে রাখে, বারবার ব্যর্থ লগইন চেষ্টা ধরে এবং সেই IP ঠিকানা কিছু সময়ের জন্য ব্লক করে। SSH-এর ক্ষেত্রে এটি পাসওয়ার্ড ব্রুট-ফোর্স থেকে সবচেয়ে সহজ সুরক্ষা: কয়েকবার ভুল হওয়ার পর বটগুলো সার্ভারে আঘাত করা বন্ধ করে। নিচে fail2ban কনফিগারেশন — ইনস্টল থেকে ব্যান যাচাই ও সাধারণ ভুল পর্যন্ত — ধাপে ধাপে দেওয়া হলো।
SSH-কী থাকলেও fail2ban কেন দরকার
২২ নম্বর পোর্ট খোলা যেকোনো সার্ভারে চালু হওয়ার কয়েক মিনিটের মধ্যে বটদের লগইন চেষ্টা আসতে শুরু করে। নিজেই দেখুন:
$ sudo journalctl -u ssh --since "1 hour ago" | grep -c "Failed password"
412
পাসওয়ার্ড লগইন বন্ধ থাকলে এবং শুধু কী ব্যবহৃত হলে অ্যাক্সেস অনুমান করা প্রায় অসম্ভব। তবু fail2ban উপকারী: এটি লগের আবর্জনা কমায়, হাজার হাজার সংযোগের চাপ কমায় এবং ভুল কনফিগারেশন থেকে রক্ষা করে, যেমন পাসওয়ার্ড লগইন ভুলে চালু রয়ে গেলে। এটি দ্বিতীয় স্তরের সুরক্ষা, কীর বিকল্প নয়।
fail2ban কীভাবে কাজ করে
যুক্তির তিনটি অংশ আছে:
- ফিল্টার (filter) — রেগুলার এক্সপ্রেশনের সেট, যা লগে ব্যর্থ চেষ্টার লাইন খুঁজে তা থেকে IP বের করে। ফিল্টার থাকে
/etc/fail2ban/filter.d/-এ। - অ্যাকশন (action) — অপরাধীর সঙ্গে কী করা হবে: iptables, nftables, ufw বা firewalld-এ নিয়ম যোগ। অ্যাকশন থাকে
/etc/fail2ban/action.d/-এ। - জেল (jail) — ফিল্টার, অ্যাকশন, লগের উৎস ও সীমার সমন্বয়। যেমন
sshdjail 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 ফাইলগুলো এই ক্রমে পড়ে, এবং পরের প্রতিটি আগেরটিকে ওভাররাইড করে:
jail.confjail.d/*.confjail.localjail.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
সার্ভিস রিস্টার্ট করুন এবং নিশ্চিত হন jail চালু হয়েছে:
$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
প্যারামিটারগুলোর অর্থ
| প্যারামিটার | অর্থ | উদাহরণ |
|---|---|---|
enabled | jail চালু কি না | 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 | কোন firewall দিয়ে ব্যান হবে | nftables-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 পোর্টে শোনে, jail-এ তা উল্লেখ করুন — নইলে 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। একটি jail-এর অবস্থা:
$ 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
সব jail-এর সব ব্যান একসঙ্গে তুলতে:
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 jail, যা fail2ban-এর নিজের লগ পড়ে এবং কয়েকবার ধরা পড়া ঠিকানা দীর্ঘ সময়ের জন্য ব্লক করে:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5
ফিল্টার যাচাই: fail2ban-regex
jail চালু আছে কিন্তু কাউকে ব্যান করছে না — তখন দেখুন ফিল্টার আদৌ লগে লাইন খুঁজে পাচ্ছে কিনা। ফাইল-লগের জন্য:
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-এর আগের কোনো অনুমতির নিয়ম আগে কাজ করছে।
portওnft list ruleset-এর আউটপুট দেখুন। - পরিবর্তন প্রয়োগ হচ্ছে না।
jail.confবদলানো হয়েছে, কিন্তুjail.localবাjail.d/*.local-এ অন্য মান আছে। চূড়ান্ত মান দেখুন:sudo fail2ban-client get sshd maxretry। - নিজেকেই ব্লক করে ফেলা। কনসোল থেকে আনব্যান করুন এবং IP
ignoreip-এ যোগ করুন। - Docker-এ fail2ban আক্রমণ দেখে না। কন্টেইনারের পোর্ট প্রকাশ হয় DOCKER চেইনের মাধ্যমে, যা INPUT বাইপাস করে। এমন সার্ভিসের জন্য অ্যাকশনে
chain = DOCKER-USERব্যবহার করুন।
SSH রক্ষায় আর কী করা যায়
fail2ban /etc/ssh/sshd_config-এর মৌলিক ব্যবস্থার সঙ্গে ভালো কাজ করে:
PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3
পরিবর্তনের পর sudo sshd -t দিয়ে কনফিগ যাচাই করুন এবং সার্ভিস রিস্টার্ট করুন। নতুন কী-লগইন কাজ করছে নিশ্চিত না হওয়া পর্যন্ত বর্তমান সেশন বন্ধ করবেন না। অতিরিক্ত হিসেবে firewall-এ SSH-এর প্রবেশাধিকার শুধু প্রয়োজনীয় ঠিকানাগুলোতে সীমিত করা যায়।
সারসংক্ষেপ
fail2ban কনফিগারেশন কয়েকটি ধাপে সারে: প্যাকেজ ইনস্টল, [sshd] বিভাগসহ jail.local তৈরি, সঠিক backend ও পোর্ট বেছে নেওয়া, maxretry, findtime ও bantime নির্ধারণ, নিজের ঠিকানা ignoreip-এ যোগ এবং fail2ban-client status sshd দিয়ে কাজ যাচাই। শুধু কী দিয়ে লগইনের সঙ্গে মিলিয়ে এটি SSH-কে পাসওয়ার্ড ব্রুট-ফোর্স থেকে নির্ভরযোগ্যভাবে রক্ষা করে। সার্ভার সুরক্ষা ও fail2ban Linux কোর্সে হাতে-কলমে শেখানো হয়।
সাধারণ প্রশ্ন
পাসওয়ার্ড লগইন বন্ধ থাকলে কি fail2ban লাগে?
বাধ্যতামূলক নয়, তবে কাজে আসে: এটি লগ থেকে হাজার হাজার অপ্রয়োজনীয় চেষ্টা সরায়, চাপ কমায় এবং পাসওয়ার্ড লগইন ভুলে আবার চালু হলে সুরক্ষা দেয়।
সব jail-এর সব ব্লক করা IP কীভাবে দেখব?
sudo fail2ban-client banned চালান — এটি প্রতিটি jail-এর ব্লক করা ঠিকানার তালিকা দেখায়। একটি নির্দিষ্ট jail-এর জন্য fail2ban-client status sshd ব্যবহার করুন।
সার্ভার রিবুটের পরও ব্যান থাকে কি?
হ্যাঁ, fail2ban ব্যান রাখে তার SQLite ডেটাবেসে (/var/lib/fail2ban/fail2ban.sqlite3) এবং শুরুতে সক্রিয় ব্লক পুনরুদ্ধার করে, যদি dbpurgeage প্যারামিটার আগেই তা মুছে না ফেলে।
fail2ban কি শুধু SSH-এর জন্য?
না, সঙ্গে আছে nginx, Apache, Postfix, Dovecot ও অন্য সার্ভিসের ফিল্টার। প্রয়োজনীয় jail jail.local-এ চালু করলেই হয়, যেমন enabled = true সহ [nginx-http-auth]।
fail2ban ও firewall-এর নিয়মের মধ্যে পার্থক্য কী?
firewall স্থিরভাবে ঠিকানা অনুমোদন বা নিষিদ্ধ করে, আর fail2ban লগে নিজেকে প্রকাশ করা ঠিকানাগুলো গতিশীলভাবে ব্লক করে। দুটি প্রায়ই একসঙ্গে ব্যবহার হয়: firewall-এ বিশ্বস্ত ঠিকানার তালিকা, আর বাকি সবকিছুর জন্য fail2ban।
“Linux: с нуля до уверенного администрирования” কোর্সে বিষয়টি অনুশীলনসহ বিস্তারিত শেখানো হয়েছে।
কোর্সে যান