Ubuntu 24.04 এ Fail2ban ইন্সটল করার নিয়ম
Ubuntu 24.04 এ apt install দিয়ে SSH সুরক্ষা নিশ্চিত করুন। fail2ban-client status sshd কমান্ড দিয়ে লগ চেক করার সঠিক পদ্ধতি এবং Total failed 0 থাকলে সমাধান জানুন।
Fail2ban আসলে কী কাজ করে
Fail2ban হলো একটি log-reading daemon। এটি আপনার SSH authentication message পর্যবেক্ষণ করে। একটি নির্দিষ্ট সময়ের মধ্যে একটি IP address থেকে কয়েকবার ব্যর্থতা দেখা দিলে, এটি একটি firewall command রান করে সেই address-টি সাময়িকভাবে block করে দেয়। এটাই এর মূল কাজ। একটি ফাইলের মাত্র ৩০ লাইনের configuration এর মাধ্যমে এটি কাজ করে। Ubuntu 24.04-এ এটি একটি মাত্র apt command দিয়ে install করা যায় এবং কোনো পরিবর্তন করার আগেই এটি আপনাকে সুরক্ষা প্রদান করে।
এটি কী এবং কী নয় তা স্পষ্টভাবে বোঝা প্রয়োজন। Fail2ban কাউকে authenticate করে না, কোনো কিছু encrypt করে না এবং কোনো একজন আক্রমণকারীর দৃঢ় লগইন প্রচেষ্টা রুখে দিতে পারে না—এটি শুধুমাত্র একই source থেকে বারবার করা প্রচেষ্টাকে আটকায়। এটি একটি noise filter এবং rate limiter, কোনো lock নয়। এর কাজ হলো port 22-এর ক্রমাগত background scanning বন্ধ করা যাতে আপনার CPU, bandwidth এবং log space অপচয় না হয়। এছাড়া এটি আক্রমণকারীকে ধীরগতি করে দেয়, কারণ আক্রমণকারীকে প্রতিবার একটি করে address ব্যবহার করতে হয়।
Fail2ban যা প্রতিস্থাপন করে না
Fail2ban হলো তৃতীয় স্তর, প্রথম স্তর নয়। আপনার সার্ভার যদি এখনও SSH password গ্রহণ করে, তবে হাজার হাজার অ্যাড্রেসে ছড়িয়ে থাকা একটি botnet ক্রমাগত পাসওয়ার্ড অনুমান করার চেষ্টা চালিয়ে যেতে পারে; কারণ প্রতিটি অ্যাড্রেস আপনার ban threshold-এর নিচে থাকে এবং কখনোই তা অতিক্রম করে না। এর বিরুদ্ধে প্রকৃত প্রতিরক্ষা হলো key-only authentication, যা পাসওয়ার্ড অনুমান করার চেষ্টাকে অসম্ভব করে তোলে, কেউ যতবারই চেষ্টা করুক না কেন। key-only auth-এর সাথে Fail2ban ব্যবহার করলে দুটি সুবিধা পাওয়া যায়: এটি আপনার log থেকে brute-force noise কমিয়ে দেয়, এবং এটি স্ক্যানারদের দ্রুত বের করে দেয় যাতে তারা port-এ আক্রমণ করা বন্ধ করে। এটিকে defence in depth হিসেবে বিবেচনা করুন। এটি key authentication এবং firewall-এর পেছনে কাজ করে, কখনোই তাদের সামনে নয়।
Prerequisites, এবং Ubuntu 24.04 এর বাস্তবতা
আপনার একটি VPS প্রয়োজন যাতে Ubuntu 24.04 চলছে এবং আপনার কাছে root বা sudo অ্যাক্সেস আছে। SSH আগে থেকেই কাজ করছে এমন হওয়া উচিত — আদর্শভাবে key authentication ব্যবহার করে। Fail2ban খুব কম রিসোর্স ব্যবহার করে: মাত্র কয়েকটা মেগাবাইট RAM লাগে এবং কোনো limit tuning করার প্রয়োজন হয় না।
এখন সেই অংশটি যা প্রতিটি পুরনো গাইডে ভুলভাবে বলা হয়েছে। বছরের পর বছর ধরে স্ট্যান্ডার্ড পরামর্শ ছিল "Fail2ban ইনস্টল করুন, তারপর backend = systemd যোগ করুন, কারণ Ubuntu /var/log/auth.log লেখা বন্ধ করে দিয়েছে।" এই পরামর্শটি একটি প্রকৃত পরিবর্তনের কথা বলছে — আধুনিক server এবং cloud images এ rsyslog থাকে না, তাই SSH log শুধুমাত্র systemd journal এ জমা হয় এবং সেই text file টি আর থাকে না — কিন্তু Ubuntu 24.04 এ Fail2ban package এ ইতিমধ্যে এর সমাধান করা আছে। package টি /etc/fail2ban/jail.d/defaults-debian.conf প্রদান করে, এবং আপনার server আসলে upstream defaults এর পরিবর্তে এই ফাইলটিই ব্যবহার করে:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueএটি মনোযোগ দিয়ে পড়ুন, কারণ এটি কোনো কিছু করার আগেই দুটি প্রশ্নের সমাধান দেয়। backend = systemd মানে হলো SSH jail সরাসরি journal থেকে ডেটা পড়ে, তাই auth.log না থাকলেও কোনো সমস্যা নেই। banaction = nftables মানে হলো bans গুলো nftables এর মাধ্যমে কার্যকর করা হয়, যা Ubuntu 24.04 এ আসলে ব্যবহৃত firewall, legacy iptables নয়। এবং [sshd] enabled = true মানে হলো প্রথম boot থেকেই jail সক্রিয় থাকে। ফলাফল হলো: Ubuntu 24.04 এ একটি stock apt install fail2ban ডিফল্টভাবেই SSH brute-force ban করে দেয়। আপনার বেশিরভাগ কাজ হলো এটি নিশ্চিত করা, policy tuning করা, এবং আপনি যেন নিজে lockout না হয়ে যান তা নিশ্চিত করা।
পুরনো auth.log trap তিনটি পরিস্থিতিতে এখনও সমস্যা তৈরি করতে পারে, এবং এগুলো চিনে রাখা জরুরি: আপনি apt এর পরিবর্তে pip দিয়ে Fail2ban ইনস্টল করেছেন, তাই কোনো defaults-debian.conf নেই; আপনি এমন একটি unprivileged container এর ভেতরে আছেন যেখানে পড়ার জন্য কোনো systemd journal নেই; অথবা আপনি কোনো পুরনো tutorial অনুসরণ করে আপনার নিজস্ব jail.local এ backend = auto পেস্ট করেছেন, যা কাজ করা default settings কে ওভাররাইড করে ফেলেছে। failure-modes সেকশনে প্রতিটি সমস্যার বিস্তারিত দেখানো হয়েছে।
ধাপ 1: Install এবং এটি ইতিমধ্যে ban করছে কিনা তা নিশ্চিত করুন
sudo apt update
sudo apt install -y fail2banUbuntu 24.04-এ Fail2ban 1.0.2 থাকে, এবং এই package-টি python3-systemd-কে একটি hard dependency হিসেবে নিয়ে আসে, তাই journal backend-এর প্রয়োজনীয় সব উপাদান এতে রয়েছে। service-টি নিজে থেকেই enable এবং start হয়:
sudo systemctl status fail2banআপনার active (running) প্রয়োজন। এরপর ইতিমধ্যে কাজ করছে এমন jail-টি দেখুন:
sudo fail2ban-client status sshdএকটি public VPS যা মাত্র কয়েক মিনিট ধরে online আছে, সেখানে আপনি প্রায়ই failure count এবং banned address দেখতে পাবেন — কারণ internet ক্রমাগত port 22 scan করে। এটিই প্রমাণ করে যে stock config সঠিকভাবে কাজ করছে। এখান থেকে আপনি এটিকে আরও উন্নত করবেন, নতুন করে তৈরি করবেন না।
Step 2: jail.local এডিট করুন, jail.conf নয়
Fail2ban তার ডিফল্ট সেটিংসগুলো /etc/fail2ban/jail.conf ফাইলে রাখে। সেই ফাইলটি এডিট করবেন না। প্যাকেজের প্রতিটি apt upgrade ফাইল সেটি পরিবর্তন করতে পারে, ফলে আপনার করা পরিবর্তনগুলো কোনো সতর্কতা ছাড়াই মুছে যাবে। Fail2ban একটি নির্দিষ্ট ক্রমে ফাইলগুলো পড়ে — প্রথমে jail.conf, তারপর jail.d/ এর সব ফাইল, এবং সবশেষে jail.local — এবং সর্বশেষ মানটি কার্যকর হয়। .local ফাইলটি আপনার নিজস্ব, এবং প্যাকেজ আপগ্রেড করার সময় এটি পরিবর্তন হয় না। একই নিয়ম ফিল্টারের ক্ষেত্রেও প্রযোজ্য, যেখানে একটি *.local ফাইল ডিফল্ট filter.d/*.conf ফাইলকে ওভাররাইড করে।
তাই আপনি একটি ছোট jail.local লিখবেন যা শুধুমাত্র আপনার প্রয়োজনীয় কিছু সেটিংস ওভাররাইড করবে। রেফারেন্স হিসেবে jail.conf এবং প্যাকেজের সাথে থাকা jail.d/defaults-debian.conf ফাইল দুটি অপরিবর্তিত রাখুন।
Step 3: /etc/fail2ban/jail.local লিখুন
sudo nano /etc/fail2ban/jail.localignoreip লাইনে থাকা অ্যাড্রেসটি আপনার নিজস্ব public IP দিয়ে পরিবর্তন করে নিচের কোডটি লিখুন:
[DEFAULT]
# Ubuntu 24.04 already sets these two in jail.d/defaults-debian.conf.
# Pinning them here documents the dependency and survives if that
# file is ever removed or changed by an upgrade.
backend = systemd
banaction = nftables
# Ban for one hour ...
bantime = 1h
# ... if an address fails ...
maxretry = 5
# ... 5 times within 10 minutes.
findtime = 10m
# Never ban these. PUT YOUR OWN IP HERE.
ignoreip = 127.0.0.1/8 ::1 10.0.0.24
# Longer bans for repeat offenders: 1h, 2h, 4h ... up to a week.
bantime.increment = true
bantime.maxtime = 1w
[sshd]
enabled = trueপ্রতিটি লাইনের নির্দিষ্ট কাজ রয়েছে:
bantime,findtime,maxretryহলো পলিসি। ডিফল্ট হিসেবে থাকাbantimeমাত্র দশ মিনিটের জন্য; এক ঘণ্টা সময় নির্ধারণ করা বেশি যুক্তিসঙ্গত। দশ মিনিটের মধ্যে একটি অ্যাড্রেস থেকে পাঁচবার ভুল পাসওয়ার্ড দিলে ban কার্যকর হবে। সাধারণ মানুষ একবার বা দুবার ভুল টাইপ করতে পারে; কিন্তু দশ মিনিটে পাঁচবার ভুল করা মানে এটি একটি script।ignoreipহলো আপনার সুরক্ষা কবচ। আপনি যে public address থেকে কানেক্ট করেন সেটি এখানে লিখুন, যাতে Fail2ban আপনাকে আপনার নিজের সার্ভার থেকে লক আউট করতে না পারে। যদি আপনার হোম কানেকশনে IP পরিবর্তনশীল হয়, তবে শেষে বর্ণিত VPN পদ্ধতিটি ব্যবহার করা শ্রেয়, কিন্তু এই লাইনটি বাদ দেওয়া উচিত নয়।bantime.increment = trueপ্রতিটি বার ban হওয়ার সময় আগের চেয়ে বেশি দীর্ঘ করবে — প্রথমে এক ঘণ্টা, তারপর দুই ঘণ্টা, তারপর চার ঘণ্টা — যা সর্বোচ্চbantime.maxtimeপর্যন্ত হতে পারে। বারবার ফিরে আসা অ্যাড্রেসগুলো ক্রমান্বয়ে লক আউট হয়ে যাবে।
আপনি যে মেশিন থেকে SSH করছেন, সেই মেশিন থেকে whitelist করার জন্য অ্যাড্রেসটি খুঁজে বের করুন, সার্ভার থেকে নয়:
curl -s ifconfig.meআপনি আপনার port এবং ban পলিসি অনুযায়ী একটি jail.local এখানে তৈরি করতে পারেন, তারপর সেটি ফাইলে পেস্ট করুন:
Step 4: Restart and verify it is reading the journal
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd-t প্রথমে একটি config test চালায়, তাই jail.local-এ কোনো typo থাকলে সার্ভিসটি অচল হয়ে যাওয়ার পরিবর্তে এখানে সরাসরি error দেখাবে। একটি সঠিক jail status দেখতে এমন হবে:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 14
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 10.0.0.66Fail2ban সঠিকভাবে আপনার login গুলো পড়ছে কি না তা প্রমাণ করার জন্য সংখ্যাটি হলো Total failed। যদি এটি শূন্যের উপরে থাকে, অথবা অন্য কোনো machine থেকে আপনি ইচ্ছে করে login fail করার পর সংখ্যাটি বৃদ্ধি পায়, তবে বুঝতে হবে journal পড়া হচ্ছে এবং আপনার কাজ শেষ। যদি আপনি যতবারই login fail করুন না কেন সংখ্যাটি 0-এই স্থির থাকে — এবং আপনি নিশ্চিত যে আপনি ignoreip অ্যাড্রেস থেকে টেস্ট করছেন না — তবে নিচের failure modes গুলো দেখুন।
লক্ষ্য করুন যে Journal matches লাইনে এখনও sshd.service নামটি আছে। Ubuntu-তে SSH unit আসলে ssh.service, কিন্তু শিপড filter-টি _COMM=sshd-এর সাথেও match করে। এছাড়া OpenSSH 24.04-এ failure গুলো sshd নামক একটি process থেকে log হয়, তাই match কাজ করে। এই বিষয়টি কেবল তখনই গুরুত্বপূর্ণ যদি আপনি নতুন OpenSSH (9.8 বা তার পরবর্তী সংস্করণ, যেখানে per-connection worker হলো sshd-session) ব্যবহার করেন; failure modes সে ক্ষেত্রেও প্রযোজ্য।
Step 5: একটি বাস্তব ban পর্যবেক্ষণ করুন, অথবা পরীক্ষার জন্য একটি ban ফোর্স করুন
যেকোনো পাবলিক VPS-এ বাস্তব ban কয়েক মিনিটের মধ্যেই নিজে থেকেই ঘটে যায়। এটি পর্যবেক্ষণ করতে, log ফাইলটি tail করুন:
sudo tail -f /var/log/fail2ban.logএকটি ban দেখতে এইরকম হয়:
2026-07-15 10:31:40,502 fail2ban.filter [812]: INFO [sshd] Found 10.0.0.66 - 2026-07-15 10:31:40
2026-07-15 10:31:44,118 fail2ban.actions [812]: NOTICE [sshd] Ban 10.0.0.66অপেক্ষা না করে পুরো প্রক্রিয়াটি পরীক্ষা করতে, ম্যানুয়ালি একটি documentation address ban করুন — কখনোই আপনার নিজের address ব্যবহার করবেন না:
sudo fail2ban-client set sshd banip 10.0.0.66এটি 1 প্রিন্ট করবে, এবং address-টি fail2ban-client status sshd-এর অধীনে Banned IP list-এ দেখা যাবে। এবার নিশ্চিত করুন যে firewall-এ block-টি সত্যিই বিদ্যমান আছে কিনা। Ubuntu 24.04-এ এটি nftables, iptables নয়:
sudo nft list table inet f2b-tableআপনি 10.0.0.66 ধারণকারী addr-set-sshd নামে একটি set এবং একটি f2b-chain chain দেখতে পাবেন যা ওই set-এর যেকোনো source reject করে। যদি fail2ban-client বলে যে একটি address ban করা হয়েছে কিন্তু nft list-এ কিছু দেখা না যায়, তবে আপনার ban action এবং firewall মিলছে না — failure modes-এ nftables/iptables নোটটি দেখুন।
Step 6: নিজেকে আনব্যান করুন এবং লক আউট হয়ে গেলে রিকভার করুন
আপনি যদি ভুলবশত কোনো অ্যাড্রেস ব্যান করে ফেলেন — যেমন আপনার নিজের অ্যাড্রেস — তবে সেটি রিমুভ করুন:
sudo fail2ban-client set sshd unbanip 10.0.0.66সফলভাবে সম্পন্ন হলে এটি 1 রিটার্ন করবে। প্রতিটি jail থেকে সব ব্যান ক্লিয়ার করতে:
sudo fail2ban-client unban --allআপনার বর্তমান SSH সেশন আপনাকে রক্ষা করবে বলে আশা করবেন না: nftables ব্যান করা অ্যাড্রেস থেকে port 22-এ আসা প্রতিটি প্যাকেট রিজেক্ট করে — এমনকি established কানেকশনও এর অন্তর্ভুক্ত — তাই ব্যান হওয়ার সাথে সাথেই বিদ্যমান সেশনটি ফ্রিজ হয়ে যাবে। আপনি যদি নিজেকে ব্যান করেন এবং আপনার কোনো ignoreip এন্ট্রি না থাকে, তবে ব্যান শেষ না হওয়া পর্যন্ত আপনি লক আউট হয়ে থাকবেন — রিকভার করার জন্য আপনার প্রোভাইডারের ওয়েব কনসোল (VNC বা serial) ব্যবহার করুন, যা SSH এর মাধ্যমে চলে না; এরপর হয় bantime শেষ হওয়া পর্যন্ত অপেক্ষা করুন অথবা সেখানে আনব্যান কমান্ডটি চালান।
Step 7: Ban গুলো স্থায়ী করা এবং বৃদ্ধি করা
Fail2ban সক্রিয় ban গুলো /var/lib/fail2ban/fail2ban.sqlite3 ফোল্ডারে একটি ছোট SQLite database-এ সংরক্ষণ করে; ফলে service restart বা reboot করার পরেও ban গুলো মুছে যায় না। আপনি ইতিমধ্যে যোগ করা bantime.increment লাইনগুলো বারবার অপরাধী করা IP-গুলোর জন্য ban-এর সময়সীমা বাড়িয়ে দেয় — যা এক ঘণ্টা থেকে শুরু করে প্রায় এক সপ্তাহ পর্যন্ত হতে পারে।
এর পাশাপাশি সিস্টেম-ব্যাপী "three strikes" পলিসি প্রয়োগ করতে, Fail2ban একটি recidive jail প্রদান করে যা এর নিজস্ব /var/log/fail2ban.log পর্যবেক্ষণ করে। সব jail জুড়ে বারবার ban হওয়া যেকোনো address-কে এটি দীর্ঘমেয়াদী ban প্রদান করে। যেহেতু আপনার [DEFAULT] এখন systemd backend ব্যবহার করছে, তাই এই jail-টিকে নির্দিষ্ট log file-এর সাথে সংযুক্ত করে দিন যা এটি পড়ার জন্য ডিজাইন করা হয়েছে:
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5Explicit logpath সহ backend = auto ব্যবহার করলে recidive সরাসরি fail2ban.log ফাইলটি পড়তে পারে, যেখানে Ban লাইনগুলো আসলে উপস্থিত থাকে — আপনি গ্লোবালভাবে সেট করা systemd default ব্যবহার করলে এটি journal-এর দিকে নির্দেশ করবে, যেখানে এই লাইনগুলো থাকে না।
Step 8: এটিকে key-only SSH এবং আরও ভালো হয় যদি একটি VPN এর সাথে যুক্ত করেন
Fail2ban শুধুমাত্র key authentication এর সাথে কার্যকর হয়। /etc/ssh/sshd_config.d/ এর অধীনে একটি drop-in file — যেমন /etc/ssh/sshd_config.d/00-hardening.conf — এ এটি সেট করুন:
PasswordAuthentication no
KbdInteractiveAuthentication noতারপর sudo systemctl restart ssh। পাসওয়ার্ড অপশন বন্ধ থাকলে, brute force আক্রমণ সফল হতে পারবে না; তখন Fail2ban শুধুমাত্র log noise কমাতে এবং scanners দের দ্রুত বের করে দিতে ব্যবহৃত হয়। আরও শক্তিশালী উপায় হলো SSH কে সম্পূর্ণভাবে public internet থেকে সরিয়ে রাখা: SSH কে একটি self-hosted WireGuard VPN এর পেছনে রাখুন এবং firewall port 22 বন্ধ রাখুন যাতে এটি শুধুমাত্র tunnel এর মাধ্যমে সাড়া দেয়। যে port এ পৌঁছানো সম্ভব নয়, সেখানে কেউ brute-force করতে পারবে না; ফলে Fail2ban তখন front line এর পরিবর্তে একটি backstop হিসেবে কাজ করে।
Fail2ban শুধুমাত্র SSH এর জন্য নয়। যে কোনো service যা failed logins এর log রাখে, তার জন্য একটি jail তৈরি করা সম্ভব — যেমন একটি mail server, nginx site, অথবা একটি self-hosted Vaultwarden password manager যার web login আপনি credential stuffing থেকে রক্ষা করতে চান। একবার কোনো web app Let's Encrypt certificate সহ একটি nginx site এর পেছনে সেট হয়ে গেলে, SSH jail যেভাবে journal কে নির্দেশ করে, ঠিক একইভাবে এর access log এর দিকে একটি Fail2ban filter পয়েন্ট করুন।
Failure modes, with the exact strings you will see
"Have not found any log file for sshd jail", এবং Fail2ban শুরু হচ্ছে না। এটি পুরনো auth.log সমস্যা। Ubuntu 24.04-এ এটি তখনই ঘটে যদি ডিফল্ট প্যাকেজ কনফিগারেশন পরিবর্তন করা হয় — যেমন pip ইন্সটলেশনে defaults-debian.conf নেই, কোনো journal ছাড়া container ব্যবহার করা হচ্ছে, অথবা jail.local ফাইলে কোনো ভুল backend = auto পেস্ট করা হয়েছে। যদি file backend ব্যবহার করা হয় এবং সেখানে /var/log/auth.log না থাকে, তবে sshd jail তার log খুঁজে পায় না এবং পুরো daemon বন্ধ হয়ে যায়। fail2ban.log নিচের মেসেজটি দেখায়:
ERROR Failed during configuration: Have not found any log file for sshd jailযেহেতু এই error টি মারাত্মক, তাই service টি চালু হয় না এবং fail2ban-client status নিচের লক্ষণটি দেখায়:
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?"socket path" লাইনটির অর্থ এই নয় যে Fail2ban নষ্ট হয়ে গেছে — এর অর্থ হলো একটি jail তার log খুঁজে না পাওয়ায় এটি শুরু হতে পারেনি। [DEFAULT] ফাইলে backend = systemd সেট করলে (যা Ubuntu প্যাকেজটি আপনার জন্য আগে থেকেই করে রাখে) উভয় মেসেজই ঠিক হয়ে যাবে।
Jail সক্রিয় আছে কিন্তু Total failed পরিবর্তন হচ্ছে না। Daemon চলছে এবং journal পড়া হচ্ছে, কিন্তু journalctl -u ssh-এ ব্যর্থতা জমা হচ্ছে অথচ counter টি 0-এ স্থির আছে। প্রথমে সহজ বিষয়গুলো পরীক্ষা করুন: আপনি যদি ignoreip-এ তালিকাভুক্ত কোনো address থেকে টেস্ট করেন, তবে আপনার নিজের ব্যর্থতাগুলো নিয়ম অনুযায়ী বাদ দেওয়া হবে। যদি এটি কারণ না হয়, তবে আপনি OpenSSH-এর এমন একটি build ব্যবহার করছেন যেখানে per-connection worker হলো sshd-session (9.8 এবং পরবর্তী সংস্করণ), যার journal _COMM হলো sshd-session, sshd নয়; ফলে ডিফল্ট match সেটি খুঁজে পায় না। [sshd] ব্লকে match রেঞ্জ বাড়িয়ে দিন:
[sshd]
enabled = true
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-sessionRestart দিন, ignoreip-এ নেই এমন কোনো address থেকে উদ্দেশ্যমূলকভাবে login ব্যর্থ করুন, এবং নিশ্চিত করুন যে Total failed অবশেষে বাড়ছে।
আপনি নিজেকে ban করেছেন: Connection refused। আপনি আপনার নিজের address ignoreip থেকে বাদ রেখেছেন, কিছু ভুল login টেস্ট করেছেন এবং এখন:
ssh: connect to host 10.0.0.10 port 22: Connection refusedসাইলেন্ট timeout-এর পরিবর্তে এই refusal হলো nftables action-এর ডিফল্ট reject verdict যা আপনার ওপর কাজ করছে। এটি ঠিক করতে Step 6 অনুসরণ করুন: অন্য কোনো unbanned address অথবা provider console থেকে একটি session খুলে unban করুন — কারণ ban করা address থেকে খোলা session টিও freeze হয়ে থাকে। এরপর আপনার address টি ignoreip-এ যোগ করুন যাতে এটি আর না ঘটে।
Fail2ban বলছে একটি address ban করা হয়েছে, কিন্তু সেটি এখনও connect করতে পারছে। status sshd-এর counter বাড়ছে, কিন্তু address টি এখনও port 22-এ পৌঁছাতে পারছে। এটি ban-action এবং firewall-এর মধ্যে অমিল। Ubuntu 24.04-এ এর মানে হলো আপনি একটি পুরোনো গাইড থেকে কপি করা banaction = iptables-multiport দিয়ে কার্যকর banaction = nftables-কে পরিবর্তন করে ফেলেছেন, যেখানে কোনো iptables layer নেই। fail2ban.log নিচের মেসেজটি দেখায়:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'সেই override টি মুছে ফেলুন এবং প্যাকেজের ডিফল্ট nftables action ব্যবহার করুন। অথবা, আপনি যদি সম্পূর্ণ firewall ufw দিয়ে পরিচালনা করেন এবং ban গুলো সেখানে দেখতে চান, তবে [DEFAULT] ফাইলে banaction = ufw সেট করুন। Restart দিন এবং sudo nft list ruleset | grep f2b দিয়ে নিশ্চিত করুন যে rule টি দেখা যাচ্ছে।
jail.local এডিট করার পর Fail2ban শুরু হচ্ছে না। একটি টাইপো — যেমন ভুল heading বা ভুল time value — এর কারণে service টি চালু হতে ব্যর্থ হয়। Fail2ban চালানোর আগে কনফিগারেশন চেক করতে বলুন:
sudo fail2ban-client -tএটি সমস্যাযুক্ত ফাইল এবং jail-এর নাম বলে দেবে, যেমন Errors in jail 'sshd'. Skipping..., যাতে আপনি অনুমান না করে সরাসরি উৎসটি ঠিক করতে পারেন।
FAQ
Ubuntu 24.04-এ stock Fail2ban install করলে কি তা সত্যিই SSH attacks ban করে?
হ্যাঁ। এই প্যাকেজটি /etc/fail2ban/jail.d/defaults-debian.conf প্রদান করে, যা sshd jail সক্রিয় করে, backend = systemd সেট করে যাতে এটি অনুপস্থিত /var/log/auth.log এর পরিবর্তে systemd journal পড়তে পারে, এবং banaction = nftables সেট করে যাতে Ubuntu-এর আসল firewall-এর মাধ্যমে ban কার্যকর করা হয়। প্রথম boot থেকেই একটি সাধারণ apt install fail2ban SSH-কে সুরক্ষা দেয়। এটি sudo fail2ban-client status sshd দিয়ে নিশ্চিত করুন এবং Total failed এর মান ০-এর বেশি কিনা তা দেখুন।
আমার সার্ভারে Fail2ban কোনো কিছু কেন ban করছে না?
নিচের তিনটি সাধারণ কারণ ক্রমানুসারে পরীক্ষা করুন। আপনি হয়তো ignoreip এর কোনো address থেকে পরীক্ষা করছেন, যা ডিজাইনের কারণে exempt করা হয়েছে। আপনি হয়তো কোনো পুরনো গাইড থেকে jail.local ফাইলে backend = auto পেস্ট করে ডিফল্ট সেটিংস পরিবর্তন করে ফেলেছেন, যা auth.log নেই এমন image-এ journal পড়ার ক্ষমতা নষ্ট করে দেয়। অথবা আপনি এমন একটি container-এর ভেতরে থাকতে পারেন যেখানে পড়ার জন্য কোনো systemd journal নেই। fail2ban-client status sshd ফাইলে Total failed চেক করুন: যদি journalctl -u ssh রিয়েল failure দেখালেও এর মান না বাড়ে, তবে jail ভুল জায়গা থেকে ডেটা পড়ছে।
আমি কীভাবে আমার নিজের IP address unban করব?
sudo fail2ban-client set sshd unbanip YOUR.IP.HERE চালান, যা সফল হলে 1 রিটার্ন করবে, অথবা সব ban মুছে ফেলতে sudo fail2ban-client unban --all ব্যবহার করুন। আপনি যদি SSH থেকে লক আউট হয়ে যান, তবে আপনার provider-এর web বা VNC console ব্যবহার করে একই command চালান — ban আপনার address থেকে port 22-এ আসা প্রতিটি packet রিজেক্ট করে দেয়, তাই আগে থেকেই খোলা থাকা session ও কাজ করা বন্ধ করে দেয়। এরপর আপনার addressটি ignoreip ফাইলে যোগ করুন যাতে এটি পুনরায় ban না হয়।
jail.conf এবং jail.local এর মধ্যে পার্থক্য কী?
jail.conf ফাইলে Fail2ban-এর upstream defaults থাকে এবং প্রতিটি package upgrade-এ এটি overwrite হয়ে যায়, তাই সেখানে কোনো পরিবর্তন করলে তা মুছে যাবে। Debian/Ubuntu package jail.d/defaults-debian.conf এর মাধ্যমে নিজস্ব সেটিংস যোগ করে। আপনার পরিবর্তনগুলো jail.local ফাইলে করা উচিত, যা সবার শেষে পড়া হয় এবং সব সেটিংসের ওপর প্রাধান্য পায়, এবং upgrade করার সময় এটি পরিবর্তন হয় না। jail.conf ফাইলটিকে শুধুমাত্র রেফারেন্স হিসেবে ব্যবহার করুন।
Fail2ban কি key-based SSH authentication-এর বিকল্প হিসেবে কাজ করে?
না। Fail2ban একটি নির্দিষ্ট address থেকে বারবার হওয়া failure-এর হার সীমিত করে; এটি ধীরগতির বা distributed guessing attack প্রতিরোধ করতে পারে না যেখানে প্রতিটি address থ্রেশহোল্ডের নিচে থাকে। শুধুমাত্র key-based authentication (PasswordAuthentication no) পাসওয়ার্ড guessing সম্পূর্ণ অসম্ভব করে তোলে, আর Fail2ban তখন log noise কমায় এবং স্ক্যানারদের দ্রুত বের করে দেয়। উভয় পদ্ধতিই ব্যবহার করুন, এবং আদর্শগতভাবে SSH-কে পাবলিক ইন্টারনেট থেকে সম্পূর্ণ আলাদা রাখা উচিত।