SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-01

Ubuntu 24.04-এ Fail2ban ইনস্টল করে SSH bot বন্ধ করুন

Ubuntu 24.04-এ সাধারণ apt install-ই SSH brute force ban করে। fail2ban-client status sshd দিয়ে প্রমাণ দেখুন, আর Total failed 0 থাকলে কেন এবং কীভাবে ঠিক করবেন তা জানুন।

Fail2ban আসলে যা করে

Fail2ban একটি লগ পড়া daemon। এটি আপনার SSH authentication message পর্যবেক্ষণ করে। অল্প সময়ের মধ্যে একটি address থেকে কয়েকবার authentication ব্যর্থ হলে এটি এমন একটি firewall command চালায়, যা ওই address-কে কিছু সময়ের জন্য block করে। এটাই এর মূল কাজ। একটি file-এ প্রায় 30 লাইন configuration দিয়েই এটি কাজ করে। Ubuntu 24.04-এ install করার জন্য শুধু একটি apt command লাগে। কিছু edit করার আগেই এটি আপনাকে সুরক্ষিত রাখে।

এটি কী এবং কী নয়, তা পরিষ্কারভাবে বুঝুন। Fail2ban কাউকে authenticate করে না। এটি কোনো কিছু encrypt করে না। একই source থেকে বারবার আসা login attempt প্রতিহত করতে পারে, কিন্তু একবারের কোনো নির্ধারিত login attempt থামাতে পারে না। এটি noise filter এবং rate limiter, lock নয়। এর কাজ হলো port 22-এর চলমান background scan যেন আপনার CPU, bandwidth এবং log space অকারণে ব্যবহার না করে, তা নিশ্চিত করা। একই সঙ্গে, কোনো attacker-কে একবারে একটি address থেকে আসতে হলে তার গতি কমিয়ে দেওয়াও এর কাজ।

Fail2ban যা প্রতিস্থাপন করে না

Fail2ban হলো তৃতীয় স্তরের প্রতিরক্ষা, প্রথম স্তর নয়। আপনার server এখনও যদি SSH password গ্রহণ করে, তাহলে হাজার হাজার address-এ ছড়িয়ে থাকা একটি botnet বারবার অনুমান চালিয়ে যেতে পারে। কারণ প্রতিটি address আপনার ban threshold-এর নিচে থাকে এবং কখনও threshold সক্রিয় করে না। এর প্রকৃত প্রতিরক্ষা হলো key-only authentication। এতে যতবারই চেষ্টা করা হোক, password অনুমান করা অসম্ভব হয়। key-only auth-এর ওপর Fail2ban ব্যবহার করলে দুটি কাজে সুবিধা হয়: এটি আপনার log থেকে brute-force-এর অপ্রয়োজনীয় noise কমায় এবং scanner-গুলোকে শুরুতেই সরিয়ে দেয়, যাতে তারা port-এ বারবার অনুরোধ পাঠানো বন্ধ করে। এটিকে layered defence হিসেবে বিবেচনা করুন। এটি key authentication এবং firewall-এর পেছনে থাকে, কখনও তাদের আগে নয়।

পূর্বশর্ত এবং Ubuntu 24.04-এর বাস্তবতা

আপনার এমন একটি VPS প্রয়োজন, যেখানে Ubuntu 24.04 চলছে, root অথবা sudo সুবিধা আছে এবং SSH ইতিমধ্যে কাজ করছে। সম্ভব হলে key authentication ব্যবহার করুন। Fail2ban কম সম্পদ ব্যবহার করে: কয়েক দশ মেগাবাইট RAM যথেষ্ট, কোনো limit tuning প্রয়োজন নেই।

এখন সেই বিষয়টি আসছে, যেখানে পুরোনো প্রায় সব গাইডই ভুল। বহু বছর ধরে প্রচলিত পরামর্শ ছিল: "Fail2ban install করুন, তারপর backend = systemd যোগ করুন, কারণ Ubuntu /var/log/auth.log লেখা বন্ধ করেছে।" এই পরামর্শের পেছনে বাস্তব পরিবর্তন ছিল। আধুনিক server ও cloud image-এ rsyslog থাকে না। তাই SSH শুধু systemd journal-এ log লেখে এবং ওই text file আর থাকে না। তবে Ubuntu 24.04-এ Fail2ban package ইতিমধ্যে এই বিষয়টি বিবেচনায় রাখে। Packageটি /etc/fail2ban/jail.d/defaults-debian.conf যোগ করে। Upstream defaults নয়, আপনার server আসলে এই file-টির configuration ব্যবহার করে:

[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd

[sshd]
enabled = true

এটি মনোযোগ দিয়ে পড়ুন। কারণ কোনো configuration পরিবর্তন করার আগে এটি দুটি প্রশ্নের উত্তর দেয়। backend = systemd-এর অর্থ হলো SSH jail journal পড়ে। তাই auth.log না থাকলেও সমস্যা হয় না। banaction = nftables-এর অর্থ হলো ban nftables-এর মাধ্যমে কার্যকর করা হয়। Ubuntu 24.04 বাস্তবে এই firewall-ই ব্যবহার করে, পুরোনো iptables নয়। আর [sshd] enabled = true-এর অর্থ হলো প্রথম boot থেকেই jail চালু থাকে। ফলাফল হলো: Ubuntu 24.04-এ একটি stock apt install fail2ban কোনো অতিরিক্ত configuration ছাড়াই SSH brute-force আক্রমণকারীদের ban করে। আপনার অধিকাংশ কাজ হলো এটি নিশ্চিত করা, policy সামঞ্জস্য করা এবং নিজেকেই system থেকে lock out না করার বিষয়টি নিশ্চিত করা।

পুরোনো auth.log-সংক্রান্ত সমস্যাটি এখনও তিনটি পরিস্থিতিতে দেখা যায়। তাই এগুলো চেনা গুরুত্বপূর্ণ: আপনি apt-এর পরিবর্তে pip দিয়ে Fail2ban install করেছেন, ফলে কোনো defaults-debian.conf নেই; আপনি এমন একটি unprivileged container-এর মধ্যে আছেন, যেখানে পড়ার মতো systemd journal নেই; অথবা আপনি পুরোনো tutorial অনুসরণ করে নিজের jail.local-এ backend = auto paste করেছেন এবং কার্যকর default-টি override করেছেন। Failure modes অংশে প্রতিটি পরিস্থিতি ঠিক কেমন দেখায় তা দেখানো হয়েছে।

ধাপ 1: ইনস্টল করুন এবং নিশ্চিত করুন যে এটি ইতিমধ্যে নিষিদ্ধ করছে

sudo apt update
sudo apt install -y fail2ban

Ubuntu 24.04-এর সঙ্গে Fail2ban 1.0.2 রিলিজ হয়, এবং প্যাকেজটি হার্ড নির্ভরতা হিসেবে python3-systemd ইনস্টল করে। তাই journal backend-এর প্রয়োজনীয় সবকিছু থাকে। সার্ভিসটি নিজে থেকেই enable এবং start হয়:

sudo systemctl status fail2ban

আপনার active (running) দেখা উচিত। এরপর যে jail ইতিমধ্যে কাজ করছে, সেটি দেখুন:

sudo fail2ban-client status sshd

একটি public VPS কয়েক মিনিটের জন্যও network-এ accessible থাকলে, সাধারণত ইতিমধ্যে failure গণনা এবং address ban করা দেখা যায়। Internet ক্রমাগত port 22 স্ক্যান করে। এটিই প্রমাণ যে stock config কাজ করছে। এখান থেকে আপনি সেটিকে পরিমার্জন করছেন, শূন্য থেকে তৈরি করছেন না।

ধাপ 2: jail.local সম্পাদনা করুন, jail.conf কখনও নয়

Fail2ban তার upstream ডিফল্ট /etc/fail2ban/jail.conf-এ রাখে। এই ফাইলটি সম্পাদনা করবেন না। প্যাকেজের প্রতিটি apt upgrade এটিকে প্রতিস্থাপন করতে পারে, এবং আপনার পরিবর্তন কোনো সতর্কতা ছাড়াই হারিয়ে যাবে। Fail2ban নির্দিষ্ট ক্রমে ফাইল পড়ে: প্রথমে jail.conf, এরপর jail.d/-এর সব ফাইল, তারপর jail.local; সর্বশেষ মান কার্যকর হয়। .local ফাইলটি আপনার জন্য, এবং প্যাকেজ আপগ্রেড কখনও এটিতে পরিবর্তন করে না। একই নিয়ম filter-এর ক্ষেত্রেও প্রযোজ্য: একটি *.local ফাইল shipped filter.d/*.conf-কে override করে।

তাই আপনি একটি ছোট jail.local লিখবেন, যা আপনার প্রয়োজনীয় অল্প কয়েকটি সেটিংসই override করবে। jail.conf এবং packaged jail.d/defaults-debian.conf—দুটিই reference হিসেবে অপরিবর্তিত রাখবেন।

ধাপ 3: /etc/fail2ban/jail.local লিখুন

sudo nano /etc/fail2ban/jail.local

এটি ফাইলে লিখুন। ignoreip লাইনের ঠিকানাটি আপনার নিজস্ব 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 নীতির নিয়ম নির্ধারণ করে। সরবরাহ করা default bantime মাত্র দশ মিনিট; এক ঘণ্টা বেশি যুক্তিসংগত ন্যূনতম সময়। দশ মিনিটের মধ্যে একই ঠিকানা থেকে পাঁচবার ব্যর্থতা ঘটলে ban প্রয়োগ হবে। প্রকৃত ব্যবহারকারীরা সাধারণত এক বা দুইবার password ভুল টাইপ করেন; দশ মিনিটে পাঁচবার ব্যর্থতা সাধারণত script-এর কার্যকলাপ।
  • ignoreip আপনার নিরাপত্তা সুরক্ষা। যে public address from ব্যবহার করে আপনি সংযোগ করেন, সেটি এখানে লিখুন। তাহলে Fail2ban আপনাকে নিজের server থেকে কখনও lock out করতে পারবে না। পরিবর্তনশীল IP-যুক্ত home connection থাকলে শেষে দেওয়া VPN পদ্ধতি বেছে নেওয়ার কারণ আছে; এই লাইন বাদ দেওয়ার কারণ নেই।
  • bantime.increment = true প্রতিটি পুনরাবৃত্ত ban-এর সময় আগেরটির চেয়ে বাড়ায়: প্রথমে এক ঘণ্টা, তারপর দুই ঘণ্টা, তারপর চার ঘণ্টা, সর্বোচ্চ bantime.maxtime পর্যন্ত। যে address বারবার ফিরে আসে, সেটি ক্রমশ দীর্ঘ সময়ের জন্য lock out হয়।

আপনি যে machine from SSH করেন, সেখান থেকে whitelist করার address খুঁজে নিন; server থেকে নয়:

curl -s ifconfig.me

এখানে আপনার port এবং ban policy অনুযায়ী একটি jail.local তৈরি করে সেটি ফাইলে paste করতে পারেন:

ToolFail2ban jail generator

ধাপ 4: পুনরায় চালু করুন এবং যাচাই করুন যে এটি journal পড়ছে

sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

-t প্রথমে কনফিগারেশন পরীক্ষা চালায়। তাই jail.local-এ বানান ভুল থাকলে পরিষেবা নিষ্ক্রিয় অবস্থায় না থেকে এখানেই স্পষ্টভাবে ব্যর্থ হবে। সুস্থ jail-এর অবস্থা এভাবে দেখা যায়:

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.66

আপনার লগইনগুলো Fail2ban সত্যিই পড়ছে—এটি প্রমাণ করে Total failed সংখ্যাটি। এটি শূন্যের বেশি হলে, অথবা অন্য একটি মেশিন থেকে ইচ্ছাকৃতভাবে লগইন ব্যর্থ করালে সংখ্যাটি বাড়লে, journal পড়া হচ্ছে এবং কাজ শেষ। আপনি যতবারই লগইন ব্যর্থ করুন, এটি যদি 0-এ থাকে এবং আপনি নিশ্চিত থাকেন যে ignoreip-এ থাকা ঠিকানা থেকে পরীক্ষা করছেন না, তাহলে নিচের ব্যর্থতার ধরনগুলো দেখুন।

লক্ষ করুন, Journal matches লাইনটি এখনও sshd.service উল্লেখ করছে। Ubuntu-তে SSH unit-এর প্রকৃত নাম ssh.service। তবে সরবরাহ করা filter-টি _COMM=sshd-এর সঙ্গেও মিল খোঁজে, এবং OpenSSH 24.04 তার ব্যর্থতাগুলো sshd নামের process থেকে log করে। তাই মিলটি কাজ করে। আপনি যদি নতুন OpenSSH ব্যবহার করেন, কেবল তখনই এই বিষয়টি গুরুত্বপূর্ণ (9.8 বা পরবর্তী সংস্করণে প্রতি-সংযোগ worker হল sshd-session); ব্যর্থতার ধরনগুলোতে এই পরিস্থিতি অন্তর্ভুক্ত আছে।

ধাপ 5: বাস্তব ban কার্যকর হওয়া দেখুন, অথবা পরীক্ষা করতে একটি ban প্রয়োগ করুন

যেকোনো public VPS-এ বাস্তব ban কয়েক মিনিটের মধ্যে নিজে থেকেই কার্যকর হয়। একটি দেখতে log অনুসরণ করুন:

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

অপেক্ষা না করে শুরু থেকে শেষ পর্যন্ত প্রক্রিয়াটি যাচাই করতে, নিজের address কখনও নয়, হাতে একটি documentation address ban করুন:

sudo fail2ban-client set sshd banip 10.0.0.66

এতে 1 প্রদর্শিত হবে এবং address-টি fail2ban-client status sshd-এর মধ্যে Banned IP list-এর অধীনে দেখা যাবে। এবার firewall-এ block-টি সত্যিই আছে কি না নিশ্চিত করুন। Ubuntu 24.04-এ এটি iptables নয়, nftables:

sudo nft list table inet f2b-table

আপনি 10.0.0.66 ধারণকারী addr-set-sshd নামের একটি set এবং এমন একটি f2b-chain দেখতে পাবেন, যা ওই set-এর যেকোনো source প্রত্যাখ্যান করে। fail2ban-client যদি বলে কোনো address banned, কিন্তু nft list-এ কিছু দেখা না যায়, তাহলে আপনার ban action firewall-এর সঙ্গে সামঞ্জস্যপূর্ণ নয়। failure modes-এর nftables/iptables সংক্রান্ত নোট দেখুন।

ধাপ 6: নিজেকে নিষেধাজ্ঞা থেকে মুক্ত করুন এবং প্রবেশাধিকার হারালে পুনরুদ্ধার করুন

আপনি যদি ভুল করে এমন কোনো address নিষিদ্ধ করে থাকেন, যার মধ্যে আপনার নিজের address-ও থাকতে পারে, সেটি সরিয়ে দিন:

sudo fail2ban-client set sshd unbanip 10.0.0.66

সফল হলে এটি 1 ফেরত দেয়। সব jail-এর সব নিষেধাজ্ঞা সরাতে:

sudo fail2ban-client unban --all

আপনাকে রক্ষা করার জন্য ইতিমধ্যে খোলা SSH session-এর ওপর নির্ভর করবেন না: nftables-এর নিষেধাজ্ঞা নিষিদ্ধ address থেকে port 22-এ আসা প্রতিটি packet প্রত্যাখ্যান করে, established connection-সহ। তাই নিষেধাজ্ঞা কার্যকর হওয়ার মুহূর্তে বিদ্যমান session স্থবির হয়ে যায়। আপনি নিজেকে নিষিদ্ধ করলে এবং কোনো ignoreip entry না থাকলে, নিষেধাজ্ঞার মেয়াদ শেষ না হওয়া পর্যন্ত আপনি প্রবেশাধিকার হারাবেন। আপনার provider-এর web console (VNC বা serial) ব্যবহার করে পুনরুদ্ধার করুন। এই সংযোগ SSH-এর মাধ্যমে যায় না। সেখানে bantime শেষ হওয়া পর্যন্ত অপেক্ষা করুন অথবা unban command চালান।

ধাপ 7: নিষেধাজ্ঞা স্থায়ী করুন এবং ধীরে ধীরে কঠোর করুন

Fail2ban সক্রিয় নিষেধাজ্ঞাগুলো /var/lib/fail2ban/fail2ban.sqlite3-এ থাকা একটি ছোট SQLite ডেটাবেসে সংরক্ষণ করে। তাই service restart বা reboot হলেও সেগুলো বজায় থাকে; সেগুলো হারিয়ে যায় না। আপনি আগে যোগ করা bantime.increment লাইনগুলো প্রতিটি পুনরাবৃত্তি করা আক্রমণকারীকে ক্রমশ কঠোর নিষেধাজ্ঞার আওতায় আনে। নিষেধাজ্ঞার সময় প্রায় দ্বিগুণ হয়ে এক ঘণ্টা থেকে প্রায় এক সপ্তাহ পর্যন্ত বাড়ে।

এর পাশাপাশি সিস্টেমজুড়ে "তিনবার অপরাধ" নীতি প্রয়োগ করতে Fail2ban-এর সঙ্গে থাকা recidive jail ব্যবহার করুন। এটি নিজের /var/log/fail2ban.log পর্যবেক্ষণ করে এবং সব jail জুড়ে বারবার নিষিদ্ধ হওয়া যেকোনো address-এর ওপর দীর্ঘমেয়াদি নিষেধাজ্ঞা প্রয়োগ করে। আপনার [DEFAULT] এখন systemd backend ব্যবহার করে। তাই এই jail-কে সেই log file-এ নির্দিষ্টভাবে সেট করুন, যেটি পড়ার জন্য এটি তৈরি করা হয়েছে:

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

স্পষ্ট logpath সহ backend = auto, recidive-কে সরাসরি সাধারণ fail2ban.log পড়তে বাধ্য করে। গণনা করা Ban লাইনগুলো আসলে সেখানেই থাকে। আপনি বিশ্বব্যাপী সেট করা systemd default ব্যবহার করলে এটি journal-এ নির্দেশিত হতো, যেখানে ওই লাইনগুলো থাকে না।

ধাপ 8: শুধুমাত্র key-ভিত্তিক 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। Password বন্ধ থাকলে brute-force আক্রমণ সফল হতে পারে না; তখন Fail2ban-এর কাজ হলো log-এর অপ্রয়োজনীয় বার্তা কমানো এবং scanner-দের দ্রুত সরিয়ে দেওয়া। আরও নিরাপদ পদ্ধতি হলো SSH-কে সম্পূর্ণভাবে public internet থেকে বিচ্ছিন্ন রাখা: self-hosted WireGuard VPN-এর মাধ্যমে SSH চালান এবং port 22-এ firewall এমনভাবে কনফিগার করুন, যাতে এটি কেবল tunnel-এ সাড়া দেয়। যে port-এ পৌঁছানো যায় না, সেটিতে কেউ brute-force আক্রমণ চালাতে পারে না। তখন Fail2ban প্রাথমিক প্রতিরক্ষা নয়, অতিরিক্ত সুরক্ষা হিসেবে কাজ করে।

Fail2ban শুধু SSH-এর জন্য নয়। যেকোনো service failed login 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 পর্যবেক্ষণ করে, একইভাবে Fail2ban filter-কে সেই web app-এর access log-এ নির্দেশ করুন।

ব্যর্থতার ধরন এবং আপনি যে সঠিক স্ট্রিংগুলো দেখবেন

"Have not found any log file for sshd jail", এবং Fail2ban চালু হবে না। এটি পুরোনো auth.log সমস্যা। Ubuntu 24.04-এ এটি কেবল তখনই ঘটে, যখন কোনো কিছু প্যাকেজের ডিফল্ট সেটিং ওভাররাইড করেছে, pip ইনস্টল করা হয়েছে কিন্তু defaults-debian.conf নেই, কোনো container-এ journal নেই, অথবা আপনি ভুলবশত কোনো backend = auto কপি করে jail.local-এ পেস্ট করেছেন। /var/log/auth.log ছাড়া file backend ব্যবহার করলে sshd jail তার log খুঁজে পায় না এবং পুরো daemon বন্ধ হয়ে যায়। fail2ban.log দেখায়:

ERROR   Failed during configuration: Have not found any log file for sshd jail

এই ত্রুটিটি গুরুতর। তাই service কখনো চালু হয় না, এবং fail2ban-client status পরে এর ফলস্বরূপ এই বার্তাটি দেখায়:

ERROR  Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?

"socket path" লাইনটির অর্থ Fail2ban নষ্ট হয়ে গেছে নয়। এর অর্থ হলো একটি jail তার log খুঁজে না পাওয়ায় Fail2ban চালুই হয়নি। [DEFAULT]-এ backend = systemd সেট করলে দুটি বার্তাই একসঙ্গে ঠিক হয়। Ubuntu package এটি আপনার হয়ে আগেই করে দেয়।

Jail সক্রিয়, কিন্তু Total failed কখনো বাড়ে না। Daemon চলছে এবং journal পড়া হচ্ছে। তবু প্রকৃত ব্যর্থ প্রচেষ্টাগুলো journalctl -u ssh-এ জমা হয়, আর কাউন্টার 0-এ স্থির থাকে। প্রথমে সহজ কারণটি বাদ দিন: আপনি ignoreip-এ তালিকাভুক্ত কোনো address থেকে পরীক্ষা করছেন। তাই নকশা অনুযায়ী আপনার নিজের ব্যর্থ প্রচেষ্টাগুলো বাদ পড়ে। এটি কারণ না হলে, আপনি এমন একটি OpenSSH build ব্যবহার করছেন যেখানে per-connection worker হলো sshd-session (9.8 এবং পরবর্তী সংস্করণ)। এর journal _COMM হলো sshd-session, sshd নয়। তাই shipped match এটি শনাক্ত করতে পারে না। [sshd] block-এ match বিস্তৃত করুন:

[sshd]
enabled      = true
backend      = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd + _COMM=sshd-session

Restart করুন। ignoreip-এ তালিকাভুক্ত নয় এমন কোনো address থেকে ইচ্ছাকৃতভাবে login ব্যর্থ করুন। এরপর নিশ্চিত করুন যে Total failed অবশেষে বাড়ছে।

আপনি নিজেকেই নিষিদ্ধ করেছেন: Connection refused আপনি ignoreip থেকে নিজের address বাদ দিয়েছেন, কয়েকবার ভুল login পরীক্ষা করেছেন, এবং এখন:

ssh: connect to host 10.0.0.10 port 22: Connection refused

নীরবে timeout না হয়ে refusal দেখাচ্ছে, কারণ nftables action-এর ডিফল্ট reject verdict আপনার ক্ষেত্রেও কাজ করছে। Step 6 অনুযায়ী এটি ঠিক করুন: অন্য কোনো unbanned address থেকে খোলা session ব্যবহার করে unban করুন, অথবা provider console ব্যবহার করুন। Banned address থেকে আগে থেকেই খোলা session-টিও জমে যাবে। এরপর নিজের address ignoreip-এ যোগ করুন, যাতে এটি আবার না ঘটে।

Fail2ban বলছে একটি address banned, কিন্তু সেটি এখনও connect করতে পারে। status sshd-এর counter বাড়ছে, তবু address-টি port 22-এ পৌঁছাতে পারছে। এটি ban action এবং firewall-এর মধ্যে অসামঞ্জস্য। Ubuntu 24.04-এ এর প্রায় সব ক্ষেত্রেই কারণ হলো আপনি কার্যকর banaction = nftables-এর পরিবর্তে পুরোনো guide থেকে কপি করা banaction = iptables-multiport ব্যবহার করেছেন, এমন একটি server-এ যেখানে iptables layer নেই। fail2ban.log দেখায়:

fail2ban.actions [812]: ERROR  Failed to execute ban jail 'sshd' action 'iptables-multiport'

ওই override মুছে দিন এবং packaged nftables action ব্যবহার করতে দিন। অথবা আপনি যদি সম্পূর্ণ firewall ufw-এর মাধ্যমে পরিচালনা করেন এবং ban-গুলো সেখানে দেখতে চান, তাহলে [DEFAULT]-এ banaction = ufw সেট করুন। Restart করুন এবং sudo nft list ruleset | grep f2b দিয়ে নিশ্চিত করুন যে rule দেখা যাচ্ছে।

jail.local সম্পাদনা করার পর Fail2ban চালু হবে না। Typo, অতিরিক্ত heading বা ভুল time value থাকলে service চালু হতে অস্বীকার করে। Service চালানোর আগে Fail2ban-কে config পরীক্ষা করতে বলুন:

sudo fail2ban-client -t

সমস্যাযুক্ত file এবং jail-এর নাম দেখাবে, যেমন Errors in jail 'sshd'. Skipping...। তাই অনুমান না করে source-এ সংশোধন করতে পারবেন।

FAQ

Ubuntu 24.04-এ stock Fail2ban ইনস্টল কি সত্যিই SSH আক্রমণ নিষিদ্ধ করে?

হ্যাঁ। প্যাকেজটি /etc/fail2ban/jail.d/defaults-debian.conf সরবরাহ করে। এটি sshd jail সক্রিয় করে, backend = systemd সেট করে যাতে অনুপস্থিত /var/log/auth.log-এর পরিবর্তে systemd journal পড়ে, এবং banaction = nftables সেট করে যাতে Ubuntu-এর কার্যকর firewall-এর মাধ্যমে নিষেধাজ্ঞা প্রয়োগ হয়। সাধারণ apt install fail2ban প্রথম boot থেকেই SSH সুরক্ষিত করে। sudo fail2ban-client status sshd দিয়ে এটি নিশ্চিত করুন এবং non-zero Total failed খুঁজুন।

আমার box-এ Fail2ban কিছুই নিষিদ্ধ করছে না কেন?

ক্রম অনুযায়ী তিনটি সাধারণ কারণ বাদ দিন। আপনি ignoreip-এর কোনো address থেকে পরীক্ষা করতে পারেন, যা নকশা অনুযায়ী exempt। পুরোনো guide থেকে backend = auto-কে jail.local-এ paste করে কার্যকর default-টি override করে থাকতে পারেন। কোনো auth.log না থাকা image-এ এটি journal পড়া ব্যাহত করে। অথবা আপনি এমন একটি container-এর ভিতরে থাকতে পারেন যেখানে পড়ার মতো কোনো systemd journal নেই। fail2ban-client status sshd-এ Total failed পরীক্ষা করুন। journalctl -u ssh প্রকৃত failure দেখালেও এটি যদি কখনো না বাড়ে, তবে jail ভুল স্থান থেকে পড়ছে।

কীভাবে আমার নিজের IP address-এর ban তুলে দেব?

sudo fail2ban-client set sshd unbanip YOUR.IP.HERE চালান। সফল হলে এটি 1 ফেরত দেয়। অথবা সব ban মুছে দিতে sudo fail2ban-client unban --all চালান। SSH থেকে locked out হলে provider-এর web বা VNC console ব্যবহার করে একই command চালান। Ban আপনার address থেকে port 22-এ আসা প্রতিটি packet প্রত্যাখ্যান করে। তাই আগে থেকেই খোলা session-ও কাজ করা বন্ধ করে দেয়। এরপর আপনার address ignoreip-এ যোগ করুন, যাতে এটি আবার ঘটতে না পারে।

jail.conf এবং jail.local-এর মধ্যে পার্থক্য কী?

jail.conf-এ Fail2ban-এর upstream default থাকে। প্রতিটি package upgrade-এর সময় এটি overwritten হয়, তাই সেখানে করা যেকোনো edit শেষ পর্যন্ত হারিয়ে যায়। Debian/Ubuntu package jail.d/defaults-debian.conf-এর মাধ্যমে তার নিজস্ব settings-এর ওপর অতিরিক্ত settings প্রয়োগ করে। আপনার পরিবর্তন jail.local-এ রাখা উচিত। এটি সবশেষে পড়া হয় এবং উভয়ের ওপর অগ্রাধিকার পায়। Upgrade কখনো এটিকে পরিবর্তন করে না। jail.conf-কে কেবল read-only reference হিসেবে রাখুন।

Fail2ban কি key-based SSH authentication-এর বিকল্প?

না। Fail2ban একটি address থেকে বারবার হওয়া failure-এর rate limit করে। প্রতিটি address threshold-এর নিচে থাকলে ধীরগতির distributed guess-এর বিরুদ্ধে এটি কিছুই করে না। Key-only authentication (PasswordAuthentication no) সরাসরি password guessing অসম্ভব করে তোলে। এরপর Fail2ban log noise কমায় এবং scanner-দের দ্রুত সরিয়ে দেয়। দুটিই চালান। সম্ভব হলে SSH সম্পূর্ণভাবে public internet-এর বাইরে রাখুন।