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 ব্যবহার করে এবং এর লিমিট টিউন করার প্রয়োজন হয় না।
এখন সেই অংশটি দেখুন যা পুরোনো গাইডগুলোতে ভুলভাবে উপস্থাপন করা হয়েছে। বছরের পর বছর ধরে সাধারণ পরামর্শ ছিল "Fail2ban ইনস্টল করুন, তারপর backend = systemd যোগ করুন, কারণ Ubuntu এখন আর /var/log/auth.log লেখে না।" এই পরামর্শটি কেবল কিছু নির্দিষ্ট ইমেজের ক্ষেত্রে প্রযোজ্য। একটি সাধারণ Ubuntu 24.04 সার্ভার বা ক্লাউড ইমেজে এখনো rsyslog ইনস্টল করা থাকে, যার ডিফল্ট রুলগুলো auth,authpriv.*-কে /var/log/auth.log-এ লেখে। তাই বেশিরভাগ VPS-এ SSH ব্যর্থতার লগগুলো systemd journal-এর পাশাপাশি ওই ফাইলে জমা হয়। মিনিমাল ইমেজগুলোতে (Ubuntu 24.04 মিনিমাল ক্লাউড ইমেজে rsyslog থাকে না) এবং বেশিরভাগ কন্টেইনারে SSH লগ কেবল journal-এ জমা হয়, সেখানে টেক্সট ফাইলটি সত্যিই অনুপস্থিত থাকে। যাই হোক, Ubuntu 24.04-এ Fail2ban প্যাকেজটি এটি আগেই বিবেচনায় নেয়। প্যাকেজটি /etc/fail2ban/jail.d/defaults-debian.conf ফাইলটি যুক্ত করে এবং আপস্ট্রিম ডিফল্টের পরিবর্তে এই ফাইলটিই আপনার সার্ভারে কার্যকর থাকে:
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd
[sshd]
enabled = trueএটি মনোযোগ দিয়ে পড়ুন, কারণ কোনো কিছু পরিবর্তন করার আগেই এটি দুটি প্রশ্নের সমাধান দেয়। backend = systemd মানে হলো SSH jail journal থেকে তথ্য পড়ে, তাই আপনার ইমেজ auth.log লেখে কি না তা কোনো পার্থক্য তৈরি করে না। banaction = nftables মানে হলো নিষেধাজ্ঞাগুলো nftables-এর মাধ্যমে কার্যকর করা হয়, যা Ubuntu 24.04-এর বর্তমান ফায়ারওয়াল (legacy iptables-এর পরিবর্তে)। আর [sshd] enabled = true মানে হলো jail প্রথম বুট থেকেই চালু থাকে। সারকথা হলো: Ubuntu 24.04-এ একটি সাধারণ apt install fail2ban ডিফল্টভাবেই SSH brute-force আক্রমণ ঠেকায়। আপনার বেশিরভাগ কাজ হবে এটি নিশ্চিত করা, পলিসি টিউন করা এবং নিজেকে লক-আউট হওয়া থেকে রক্ষা করা।
পুরোনো auth.log ফাঁদটি এখনো তিনটি পরিস্থিতিতে সমস্যা তৈরি করতে পারে এবং সেগুলো চিনে রাখা জরুরি: আপনি apt-এর পরিবর্তে pip দিয়ে Fail2ban ইনস্টল করেছেন, তাই সেখানে কোনো defaults-debian.conf নেই; আপনি এমন একটি unprivileged কন্টেইনারের ভেতরে আছেন যেখানে পড়ার মতো কোনো systemd journal নেই; অথবা আপনি কোনো পুরোনো টিউটোরিয়াল অনুসরণ করে backend = auto-কে আপনার নিজের jail.local-এ পেস্ট করেছেন, যা কার্যকর ডিফল্ট সেটিংসকে ওভাররাইড করে ফেলেছে। প্রথম এবং তৃতীয় পরিস্থিতিটি কেবল rsyslog ছাড়া ইমেজের ক্ষেত্রে (যেমন মিনিমাল ইমেজ) SSH ব্যানিং ভেঙে দেয়, কারণ যেখানে rsyslog চলে, সেখানে ফাইল ব্যাকএন্ড /var/log/auth.log খুঁজে পায় এবং কাজ করে। ব্যর্থতার মোডগুলো (failure-modes) অংশে প্রতিটি সমস্যার স্বরূপ স্পষ্টভাবে দেখানো হয়েছে।
ধাপ 1: ইনস্টল করুন এবং নিশ্চিত করুন যে এটি ইতিমধ্যে নিষিদ্ধ করছে
sudo apt update
sudo apt install -y fail2banUbuntu 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 তার আপস্ট্রিম ডিফল্ট সেটিংস /etc/fail2ban/jail.conf ফাইলে রাখে। এই ফাইলটি এডিট করবেন না। প্যাকেজ আপগ্রেডের সময় এটি প্রতিস্থাপিত হতে পারে, যেমনটি ফাইলের হেডারেই সতর্ক করা হয়েছে, এবং আপনার করা পরিবর্তনগুলো হারিয়ে যেতে পারে। Fail2ban একটি নির্দিষ্ট ক্রমে ফাইলগুলো পড়ে: প্রথমে jail.conf, এরপর বর্ণানুক্রমিকভাবে jail.d/*.conf, তারপর jail.local, এবং সবশেষে বর্ণানুক্রমিকভাবে jail.d/*.local; এক্ষেত্রে সর্বশেষ মানটি কার্যকর হয়। তাই jail.local প্যাকেজকৃত defaults-debian.conf-কে ওভাররাইড করে, কিন্তু jail.d/ ডিরেক্টরিতে আপনি যে কোনো *.local ফাইল রাখলে তা পরবর্তীতে পড়া হয় এবং সেটিই কার্যকর হয়; আপনার ওভাররাইডগুলো এক জায়গায় রাখুন যাতে আপনি নিশ্চিত থাকতে পারেন কোন মানটি বর্তমানে সক্রিয়। .local ফাইলটি আপনার নিজস্ব, এবং প্যাকেজ আপগ্রেড কখনোই এটি পরিবর্তন করে না। ফিল্টারের ক্ষেত্রেও একই নিয়ম প্রযোজ্য, যেখানে একটি *.local ফাইল সরবরাহকৃত filter.d/*.conf-কে ওভাররাইড করে।
তাই আপনি একটি ছোট jail.local ফাইল তৈরি করুন যা শুধুমাত্র আপনার প্রয়োজনীয় কয়েকটি সেটিং ওভাররাইড করবে, এবং রেফারেন্স হিসেবে jail.conf ও প্যাকেজকৃত jail.d/defaults-debian.conf উভয়কেই অপরিবর্তিত রাখুন।
ধাপ 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নীতির নিয়ম নির্ধারণ করে। সরবরাহ করা defaultbantimeমাত্র দশ মিনিট; এক ঘণ্টা বেশি যুক্তিসংগত ন্যূনতম সময়। দশ মিনিটের মধ্যে একই ঠিকানা থেকে পাঁচবার ব্যর্থতা ঘটলে 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 করতে পারেন:
ধাপ 4: রিস্টার্ট করুন এবং এটি জার্নাল পড়ছে কি না যাচাই করুন
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: 203.0.113.66যে সংখ্যাটি প্রমাণ করে যে Fail2ban প্রকৃতপক্ষে আপনার লগইনগুলো পড়ছে তা হলো Total failed। যদি এটি শূন্যের উপরে থাকে, অথবা অন্য কোনো মেশিন থেকে ইচ্ছাকৃতভাবে ভুল লগইন করার সময় এটি বাড়তে থাকে, তবে বুঝতে হবে জার্নাল পড়া হচ্ছে এবং আপনার কাজ শেষ। যদি বারবার ভুল লগইন করার পরেও এটি 0-এ আটকে থাকে এবং আপনি নিশ্চিত হন যে আপনি ignoreip-এ থাকা অ্যাড্রেস থেকে টেস্ট করছেন না, তবে নিচের ফেইলিয়র মোডগুলোতে যান।
লক্ষ্য করুন যে Journal matches লাইনটিতে এখনও sshd.service নাম রয়েছে। Ubuntu-তে SSH ইউনিটটি মূলত ssh.service, কিন্তু সরবরাহকৃত ফিল্টারটি _COMM=sshd-এর সাথেও ম্যাচ করে এবং OpenSSH 24.04-এ এর ব্যর্থতার লগগুলো sshd নামের একটি প্রসেস থেকে আসে, তাই ম্যাচিংটি কাজ করে। এই বিষয়টি কেবল তখনই গুরুত্বপূর্ণ যদি আপনি নতুন কোনো OpenSSH (9.8 বা তার পরবর্তী সংস্করণ, যেখানে পার-কানেকশন ওয়ার্কার হলো sshd-session) ব্যবহার করেন; ফেইলিয়র মোডগুলো সেই ক্ষেত্রটিও কভার করে।
ধাপ 5: একটি বাস্তব ban পর্যবেক্ষণ করুন অথবা পরীক্ষার জন্য জোরপূর্বক প্রয়োগ করুন
যেকোনো পাবলিক VPS-এ কয়েক মিনিটের মধ্যেই স্বয়ংক্রিয়ভাবে ban কার্যকর হয়। এটি পর্যবেক্ষণ করতে লগ ফাইলটি tail করুন:
sudo tail -f /var/log/fail2ban.logএকটি ban দেখতে অনেকটা এরকম হয়:
2026-07-15 10:31:40,502 fail2ban.filter [812]: INFO [sshd] Found 203.0.113.66 - 2026-07-15 10:31:40
2026-07-15 10:31:44,118 fail2ban.actions [812]: NOTICE [sshd] Ban 203.0.113.66অপেক্ষা না করে পুরো প্রক্রিয়াটি যাচাই করতে, নিজের আইপি বাদে অন্য কোনো ডকুমেন্টেশন অ্যাড্রেস ম্যানুয়ালি ban করুন। 203.0.113.66 ঠিকানাটি TEST-NET-3 ব্লকের অন্তর্ভুক্ত, যা ডকুমেন্টেশনের জন্য সংরক্ষিত। তাই এটি কোনো বাস্তব হোস্ট বা আপনার প্রোভাইডারের নেটওয়ার্কের প্রাইভেট অ্যাড্রেস হতে পারে না:
sudo fail2ban-client set sshd banip 203.0.113.66এটি 1 আউটপুট দেয় এবং ঠিকানাটি fail2ban-client status sshd-এর Banned IP list-এর অধীনে প্রদর্শিত হয়। এখন নিশ্চিত করুন যে firewall-এ ব্লকটি সত্যিই বিদ্যমান আছে কি না। Ubuntu 24.04-এ এটি iptables নয়, বরং nftables ব্যবহার করে:
sudo nft list table inet f2b-tableআপনি 203.0.113.66 ধারণকারী addr-set-sshd নামের একটি সেট এবং f2b-chain নামের একটি চেইন দেখতে পাবেন, যা ওই সেটের যেকোনো সোর্সকে প্রত্যাখ্যান করে। যদি fail2ban-client কোনো অ্যাড্রেসকে banned হিসেবে দেখায় কিন্তু nft list-এ কিছু না পাওয়া যায়, তবে বুঝতে হবে আপনার ban অ্যাকশনটি firewall-এর সাথে সামঞ্জস্যপূর্ণ নয়। সেক্ষেত্রে ব্যর্থতার কারণসমূহ (failure modes) অংশে nftables/iptables সংক্রান্ত নোটটি দেখুন।
ধাপ 6: নিজেকে unban করা এবং লক আউট হলে পুনরুদ্ধার করা
আপনি যদি ভুলবশত কোনো IP address ban করে ফেলেন, তবে নিচের কমান্ডটি দিয়ে তা সরিয়ে ফেলুন:
sudo fail2ban-client set sshd unbanip 203.0.113.66সফল হলে এটি 1 আউটপুট দেয়। প্রতিটি jail থেকে সব ban মুছে ফেলতে নিচের কমান্ডটি ব্যবহার করুন:
sudo fail2ban-client unban --allআগে থেকে খোলা SSH session আপনাকে বাঁচাবে এমনটা ভাববেন না: nftables ban পোর্ট 22-এ আসা banned address-এর প্রতিটি packet প্রত্যাখ্যান করে, এমনকি প্রতিষ্ঠিত সংযোগগুলোও (established connections)। তাই ban কার্যকর হওয়ার সাথে সাথে বিদ্যমান session ফ্রিজ হয়ে যায়। আপনি যদি নিজেকে ban করে ফেলেন এবং আপনার কোনো ignoreip এন্ট্রি না থাকে, তবে ban-এর মেয়াদ শেষ না হওয়া পর্যন্ত আপনি লক আউট থাকবেন। সেক্ষেত্রে আপনার প্রোভাইডারের ওয়েব কনসোল (VNC বা serial) ব্যবহার করে পুনরুদ্ধার করুন, যা SSH-এর ওপর নির্ভর করে না। এরপর হয় bantime শেষ হওয়া পর্যন্ত অপেক্ষা করুন অথবা সেখান থেকেই unban কমান্ডটি চালান।
ধাপ 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-এ আপনি কেবল তখনই এটি পাবেন যখন /var/log/auth.log বিদ্যমান নেই (যেমন কোনো minimal image বা container যেখানে rsyslog নেই) এবং journal পড়া হচ্ছে না: একটি pip ইনস্টলেশন যেখানে defaults-debian.conf নেই, journal ছাড়া কোনো container, অথবা jail.local-এ ভুলবশত পেস্ট করা কোনো backend = auto। /var/log/auth.log ছাড়া কোনো file backend-এ sshd jail তার লগ খুঁজে পায় না এবং পুরো 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 তার লগ খুঁজে পায়নি। [DEFAULT]-এ backend = systemd সেট করলে (যা Ubuntu প্যাকেজে আগে থেকেই করা থাকে) উভয় বার্তা একসাথে ঠিক হয়ে যায়।
Jail সক্রিয় কিন্তু Total failed কখনোই বাড়ে না। daemon চলছে এবং journal পড়া হচ্ছে, তবুও journalctl -u ssh-এ ব্যর্থতার সংখ্যা বাড়ছে কিন্তু counter 0-এই আটকে আছে। প্রথমে সাধারণ কারণটি যাচাই করুন: আপনি এমন একটি address থেকে পরীক্ষা করছেন যা ignoreip-এ তালিকাভুক্ত, তাই আপনার ব্যর্থতাগুলো নিয়ম অনুযায়ীই বাদ দেওয়া হয়েছে। যদি তা না হয়, তবে আপনি এমন একটি 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। আপনি ignoreip-এ নিজের address যোগ করতে ভুলে গেছেন, কয়েকটি ভুল login পরীক্ষা করেছেন এবং এখন:
ssh: connect to host 10.0.0.10 port 22: Connection refusedsilent timeout-এর পরিবর্তে এই refusal হলো nftables action-এর ডিফল্ট reject verdict, যা তার কাজ করছে। Step 6-এর মতো এটি ঠিক করুন: অন্য কোনো unbanned address থেকে session খুলে অথবা provider console ব্যবহার করে ban তুলে নিন, কারণ banned address থেকে খোলা session-ও জমে যাবে। এরপর আপনার address-টি ignoreip-এ যোগ করুন যাতে এটি আর না ঘটে।
Fail2ban বলছে একটি address banned, কিন্তু সেটি এখনো connect করতে পারছে। status sshd-এ counter বাড়ছে, তবুও address-টি port 22-এ পৌঁছাতে পারছে। এটি ban-action এবং firewall-এর মধ্যে অমিল। Ubuntu 24.04-এ এর মানে প্রায় সবসময়ই হলো যে আপনি কোনো পুরনো গাইড থেকে কপি করা banaction = iptables-multiport দিয়ে কার্যকর banaction = nftables-কে override করেছেন, এমন একটি বক্সে যেখানে iptables লেয়ার নেই। fail2ban.log এটি দেখায়:
fail2ban.actions [812]: ERROR Failed to execute ban jail 'sshd' action 'iptables-multiport'সেই override মুছে ফেলুন এবং প্যাকেজ করা nftables action-টি ব্যবহার করুন। অথবা, যদি আপনি সম্পূর্ণ firewall ufw দিয়ে পরিচালনা করেন এবং চান যে bans সেখানে দেখাক, তবে [DEFAULT]-এ banaction = ufw সেট করুন। Restart করুন এবং sudo nft list ruleset | grep f2b দিয়ে নিশ্চিত করুন যে rule-টি দেখা যাচ্ছে।
jail.local এডিট করার পর Fail2ban চালু হচ্ছে না। কোনো টাইপো, ভুল heading বা ভুল time value-এর কারণে service চালু হতে অস্বীকার করে। Fail2ban-কে চালানোর আগে configuration পরীক্ষা করতে বলুন:
sudo fail2ban-client -tএটি সমস্যাযুক্ত ফাইল এবং jail-এর নাম বলে দেয়, উদাহরণস্বরূপ Errors in jail 'sshd'. Skipping..., যাতে আপনি অনুমান না করে সরাসরি উৎসটি ঠিক করতে পারেন।
FAQ
Ubuntu 24.04-এ Fail2ban-এর ডিফল্ট ইনস্টলেশন কি আসলেই SSH আক্রমণ প্রতিরোধ করে?
হ্যাঁ। এই প্যাকেজটি /etc/fail2ban/jail.d/defaults-debian.conf প্রদান করে, যা sshd জেল (jail) সক্রিয় করে। এটি backend = systemd সেট করে যাতে আপনার ইমেজ /var/log/auth.log লিখুক বা না লিখুক, এটি systemd journal থেকে তথ্য পড়তে পারে। এছাড়া এটি banaction = nftables সেট করে যাতে Ubuntu-এর মূল ফায়ারওয়ালের মাধ্যমে ব্যান কার্যকর হয়। একটি সাধারণ apt install fail2ban প্রথম বুট থেকেই SSH-কে সুরক্ষিত রাখে। sudo fail2ban-client status sshd চালিয়ে এটি নিশ্চিত করুন এবং একটি শূন্য নয় এমন Total failed মান খুঁজুন।
আমার সার্ভারে Fail2ban কেন কোনো কিছু ব্যান করছে না?
ক্রমানুসারে তিনটি সাধারণ কারণ যাচাই করুন। আপনি হয়তো এমন একটি অ্যাড্রেস থেকে পরীক্ষা করছেন যা ignoreip-এর অন্তর্ভুক্ত, যা ডিজাইনের কারণেই ব্যান থেকে মুক্ত। আপনি হয়তো কোনো পুরনো গাইড থেকে backend = auto কপি করে jail.local-এ পেস্ট করেছেন, যা এমন ইমেজে SSH ব্যান প্রক্রিয়া ভেঙে দেয় যেখানে rsyslog নেই এবং তাই auth.log-ও নেই। অথবা আপনি হয়তো এমন একটি কন্টেইনারের ভেতরে আছেন যেখানে পড়ার মতো কোনো systemd journal নেই। fail2ban-client status sshd-এ Total failed চেক করুন: যদি journalctl -u ssh-এ প্রকৃত ব্যর্থতার তথ্য থাকা সত্ত্বেও এটি না বাড়ে, তবে বুঝতে হবে জেলটি ভুল জায়গা থেকে তথ্য পড়ছে।
আমি কীভাবে আমার নিজের IP অ্যাড্রেস আনব্যান করব?
sudo fail2ban-client set sshd unbanip YOUR.IP.HERE চালান, যা সফল হলে 1 রিটার্ন করবে, অথবা সব ব্যান মুছে ফেলতে sudo fail2ban-client unban --all ব্যবহার করুন। যদি আপনি SSH থেকে লক হয়ে যান, তবে আপনার প্রোভাইডারের ওয়েব বা VNC কনসোল ব্যবহার করে একই কমান্ড চালান। ব্যানটি আপনার অ্যাড্রেস থেকে পোর্ট 22-এ আসা প্রতিটি প্যাকেট প্রত্যাখ্যান করে, তাই আগে থেকে খোলা সেশনও কাজ করা বন্ধ করে দেয়। এরপর আপনার অ্যাড্রেসটি ignoreip-এ যোগ করুন যাতে এটি পুনরায় না ঘটে।
jail.conf এবং jail.local-এর মধ্যে পার্থক্য কী?
jail.conf-এ Fail2ban-এর আপস্ট্রিম ডিফল্ট সেটিংস থাকে এবং প্যাকেজ আপগ্রেডের সময় এটি প্রতিস্থাপিত হতে পারে, তাই সেখানে কোনো পরিবর্তন করা ঝুঁকিপূর্ণ। Debian/Ubuntu প্যাকেজ jail.d/defaults-debian.conf-এর মাধ্যমে নিজস্ব সেটিংস এর ওপর প্রয়োগ করে। আপনার পরিবর্তনগুলো jail.local-এ রাখা উচিত, যা উভয় ফাইলের পরে পড়া হয় এবং অগ্রাধিকার পায়; আপগ্রেডের সময় এটি কখনোই পরিবর্তিত হয় না। শুধুমাত্র jail.d/-এর ভেতরের একটি *.local ফাইল আরও পরে পড়া হয়, তাই সেখানে অপ্রয়োজনীয় ফাইল রাখবেন না। jail.conf-কে শুধুমাত্র পড়ার জন্য রেফারেন্স হিসেবে রাখুন।
Fail2ban কি key-based SSH authentication-এর বিকল্প?
না। Fail2ban একটি নির্দিষ্ট অ্যাড্রেস থেকে বারবার ব্যর্থ হওয়ার হার সীমিত করে; এটি ধীরগতির বা ডিস্ট্রিবিউটেড অনুমানের (distributed guess) বিরুদ্ধে কাজ করে না, যেখানে প্রতিটি অ্যাড্রেস থ্রেশহোল্ডের নিচে থাকে। শুধুমাত্র কি-ভিত্তিক অথেনটিকেশন (PasswordAuthentication no) পাসওয়ার্ড অনুমান করাকে পুরোপুরি অসম্ভব করে তোলে, এবং Fail2ban তখন লগের অপ্রয়োজনীয় তথ্য কমিয়ে স্ক্যানারদের দ্রুত সরিয়ে দেয়। উভয়ই ব্যবহার করুন এবং আদর্শগতভাবে SSH-কে পাবলিক ইন্টারনেট থেকে সম্পূর্ণ দূরে রাখুন।