๐ Fail2Ban + iptables ้ฒๆดๅ็ ด่งฃๅฏฆๆฐ(SSH ่ๅธธ่ฆๆๅ)
ๆดๅ็ ด่งฃ(Brute-force)ๆปๆๆฏๅธธ่ฆ็ๅ ฅไพตๆๆณ,็นๅฅ้ๅฐ SSH、FTP、ๅๅ็จฎ็ถฒ่ทฏๆๅ。ๆฌๆ็จๅฏฆๅๆไฝๆไฝ ๅฆไฝ็จ Fail2Ban ๆญ้ iptables ๅฟซ้ๅปบ็ซ้ฒ่ญทๆฉๅถ,ๅซ่จญๅฎ็ฏไพ、ๆธฌ่ฉฆๆนๅผ่ๆณจๆไบ้ ,้ฉ็จๆผไผบๆๅจ็ฎก็่ ่่ณๅฎ็ถญ้ไบบๅก。
๐ ๆ็ซ ้้ป(ๅฟซ้ๅฐ่ฆฝ)
- Fail2Ban ๆฏไป้บผ,ไปฅๅๅฆไฝ่ iptables ๆดๅ
- ๅฎ่ฃ่ๅบๆฌ่จญๅฎ(Debian/Ubuntu ่ RHEL/CentOS ็ฏไพ)
- ็ฏไพ jail ่่ช่จ action(block via iptables)
- ๆธฌ่ฉฆๆปๆ、ๆฅ็ๅฐ้่จ้่่งฃ้คๅฐ้
- ้จ็ฝฒๅปบ่ญฐ่้ฒ้้ฒ่ญท่ฆ้ป
1️⃣ Fail2Ban ่ iptables:็ฐก็ญ่ชชๆ
Fail2Ban ๆ็ฃๆงๆฅ่ช(ๅฆ /var/log/auth.log、/var/log/secure),็ถๅตๆธฌๅฐ้่คๅคฑๆ็ป้ๆๅฏ็่ก็บๆ,้้「action」ๅผๅซ็ณป็ตฑ้ฒ็ซ็(ไพๅฆ iptables)ๆๆปๆไพๆบ IP ๆซๆๅฐ้。้็จฎ「ๅณๆๅตๆธฌ+ๅๆ ๅฐ้」ๅฐๆๆดๅ็ ด่งฃ้ๅธธๆๆ。
2️⃣ ๅฎ่ฃ(ๅฟซ้ๆไปค)
ไปฅไธๆไพ Debian/Ubuntu ่ RHEL/CentOS ็ๅฎ่ฃๆไปค:
# Debian / Ubuntu
sudo apt update
sudo apt install -y fail2ban iptables
# RHEL / CentOS / AlmaLinux
sudo yum install -y epel-release
sudo yum install -y fail2ban iptables
sudo systemctl enable --now iptables # ่ฅไฝฟ็จ legacy iptables
3️⃣ ๅบๆฌ่จญๅฎๆชไฝ็ฝฎ่ๅทฅไฝๆต็จ
/etc/fail2ban/jail.conf:้ ่จญๆจฃๆฟ(ไธ่ฆ็ดๆฅๆน,ๆน็จ jail.local)/etc/fail2ban/jail.local:ๆพไฝ ็่ช่จ jail ่ๅๆธ/etc/fail2ban/action.d/:ๅฎ็พฉๅฐ้ๆนๅผ(iptables、firewalld、ufw ็ญ)
4️⃣ ็ฏไพ:้ๅฐ SSH ็ jail.local
ๆไปฅไธๅ
งๅฎนๅ ๅ
ฅ /etc/fail2ban/jail.local(ๆๅจ jail.d/ ๅปบๆช):
[DEFAULT]
# ๅ
จๅ้ ่จญ
bantime = 3600 # ๅฐ้ๆ้(็ง)— 1 ๅฐๆ
findtime = 600 # ๅจๅคๅฐ็งๅ
ง่จ็ฎๅคฑๆๆฌกๆธ — 10 ๅ้
maxretry = 5 # ่ถ
้ๅคฑๆๆฌกๆธๅๅฐ้
backend = auto
usedns = no
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
5️⃣ iptables action ็ฏไพ(้ ่จญ้ๅธธๅทฒๅญๅจ)
Fail2Ban ๆไฝฟ็จ action.d/ ไธ็ๅไฝ。็ณป็ตฑ้ๅธธๅทฒๆไพ iptables-multiport。่ฅไฝ ๆณ็ขบ่ชๆ่ช่จ,ๅฏๅ่:
# ็ฏไพๅไฝ็ๆฎต(็ฐกๅ)
/sbin/iptables -I f2b- 1 -s -j DROP
# ๆไฝฟ็จ REJECT
/sbin/iptables -I f2b- 1 -s -j REJECT --reject-with icmp-port-unreachable
6️⃣ ๅปบ็ซๅฐ็จ iptables chain(Fail2Ban ่ชๅๅปบ็ซ)
ๅ็จ Fail2Ban ไธฆๅๅ jail ๅพ,Fail2Ban ๆ่ชๅๅปบ็ซๅๆฏ f2b-sshd ็้(chain),ไธฆๆๅฐๆ่ฆๅๅ ๅ
ฅ INPUT。ไฝ ๅฏไปฅ็จไปฅไธๆไปคๆชข่ฆ:
sudo iptables -L -n --line-numbers
sudo iptables -L f2b-sshd -n --line-numbers # ๆชขๆฅ f2b ๅฐ้ๆธ
ๅฎ
7️⃣ ้ๅฐๅคๆๅ(HTTP / vsftpd / postfix)็ฏไพ jail
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 86400
[vsftpd]
enabled = true
port = ftp
filter = vsftpd
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 7200
[postfix]
enabled = true
port = smtp
filter = postfix
logpath = /var/log/mail.log
maxretry = 5
bantime = 7200
8️⃣ ๆธฌ่ฉฆ่้ค้ฏ
ๆธฌ่ฉฆๅฐ้ๅฏไปฅ็จๆจกๆฌๅคฑๆ็ปๅ ฅๆ็ดๆฅ็จๆธฌ่ฉฆ IP ่งธ็ผ:
# ้ๅ fail2ban ๅพๆชขๆฅ็ๆ
sudo systemctl restart fail2ban
sudo systemctl status fail2ban
# ๆฅ็ jail ็ๆ
sudo fail2ban-client status
sudo fail2ban-client status sshd
# ๆฅ็ๆ jail ็ๅฐ้ IP ๅ่กจ
sudo fail2ban-client status sshd
# ๆๅๅฐ้ / ่งฃๅฐ
sudo fail2ban-client set sshd banip 1.2.3.4
sudo fail2ban-client set sshd unbanip 1.2.3.4
9️⃣ ้ฒ้:่ช่จ filter(็ฏไพ็บ SSH)
Filter ๅฎ็พฉๅจ /etc/fail2ban/filter.d/sshd.conf。่ฅ่ฆๅ ๅ
ฅ่ช่จๅตๆธฌ,ๅฏๅปบ็ซ่ช่จ filter:
# /etc/fail2ban/filter.d/custom-ssh.conf
[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from (?: port \d*)?(?: ssh\d*)?$
^%(__prefix_line)sFailed password for .* from port \d+
ignoreregex =
๐ ๆธฌ่ฉฆๆปๆ(ๅฎๅ จๆธฌ่ฉฆๆญฅ้ฉ)
่ซๅชๅจไฝ ่ชๅทฑ็ๆธฌ่ฉฆ็ฐๅขๆๅๅพ่จฑๅฏ็็ณป็ตฑไธๅท่กๆจกๆฌๆปๆ。ไธ้ข็คบ็ฏๅฆไฝ็จ sshpass ๅๅคๆฌก้ฏ่ชคๅฏ็ขผๅ่ฉฆ(ๆ่ขซๅฐ้):
# ๅฎ่ฃๆธฌ่ฉฆๅทฅๅ
ท(ๆธฌ่ฉฆ็ฐๅข)
sudo apt install -y sshpass
# ๆจกๆฌ้ฏ่ชค็ปๅ
ฅ 6 ๆฌก(ๆ่งธ็ผ maxretry)
for i in {1..6}; do
sshpass -p "wrongpassword" ssh -o StrictHostKeyChecking=no user@your-server.example.com exit
done
1️⃣1️⃣ ๆฅ่ช่่ฟฝ่นค
Fail2Ban ็ๆดปๅๆๅฏซๅ
ฅ็ณป็ตฑๆฅ่ช(้ๅธธๆฏ /var/log/fail2ban.log),ๅๆๆๅจ systemd journal ไธญๆ็ธ้็ด้:
sudo tail -n 200 /var/log/fail2ban.log
sudo journalctl -u fail2ban -f
1️⃣2️⃣ ้จ็ฝฒๆณจๆไบ้ ่ๆไฝณๅฏฆๅ
- ้ฟๅ
่ชคๅฐ้ๅ
ง้จ IP:ๅฐๆผๅฏไฟกไปป็ๅ
ง้จ็ถฒๆฎตๅฏๅจ
ignoreipไธญๅ ๅ ฅ,ๅฆignoreip = 127.0.0.1/8 10.0.0.0/8。 - ๆดๅ fail2ban ่ firewalld / nftables:่ฅ็ณป็ตฑไฝฟ็จ firewalld ๆ nftables,่ซ้ธๆ็ธๅฎน็ action(ๅฆ
firewalldaction ๆ nftables action),้ฟๅ ๅๆๆทท็จ iptables legacy ่ nft。 - ็ฃๆง่ๅ่ญฆ:ๆ fail2ban log ่ๅฐ้ไบไปถๆจๅฐ้ไธญๅๆฅ่ชๆ็ฃๆง(ๅฆ ELK / Grafana Loki),ไปฅไพฟ็ตฑ่จๆปๆไพๆบ่่ถจๅข。
- ่ชฟๆด bantime ่ maxretry:ๆ นๆๆๅ็้่ฆๆง่ๆต้ๆจกๅผๆฑบๅฎๅฐ้ๆ้;ๅฐๆผ้ซ้ขจ้ชๆๅๅฏๆก้ทๆ้ๅฐ้。
- ๆญ้ ๅคๅ ็ด ่ช่ญ (MFA):Fail2Ban ๆฏ้ปๆ่ชๅๅๆปๆ็ๅฅฝๅทฅๅ ท,ไฝๆ่ SSH key + 2FA ไธ่ตทไฝฟ็จ,ๆ่ฝ้ๅฐๆดๅผท็ไฟ่ญท。
1️⃣3️⃣ ๅธธ่ฆๅ้ก(FAQ)
- Q:Fail2Ban ็กๆๆไธๅฐ้?
A:ๆชขๆฅ logpath ่ filter ็ failregex ๆฏๅฆๅฐๆฅ่ชๆ ผๅผๅน้ ,ไธฆ็ขบ่ช fail2ban ๆๆฌ่ฎๅ log ๆช。 - Q:ๅฆไฝๆฐธไน
ๅฐ้็นๅฎ IP?
A:ๅฏ็ดๆฅๅจ้ฒ็ซ็ๅ ๅ ฅ DROP ่ฆๅ,ๆๅจ fail2ban action ๆน็บๆฐธไน ๅฐ้(bantime = -1)。 - Q:ไฝฟ็จ cloud provider(ๅฆ AWS)ๆๆ้บผๅ?
A:ๅจ cloud ไธญๅปบ่ญฐๆญ้ security group、WAF、ไปฅๅ้ไธญๅ้ฒ่ญท,fail2ban ้ฉ็จๆผ instance ๅฑค้ข็ๅณๆๅฐ้。
๐ ็ต่ช
Fail2Ban ่ iptables ็ๆญ้ ่ฝๅฟซ้ๅปบ็ซๅฐๆๆดๅ็ ด่งฃ็็ฌฌไธ้้ฒ็ท。้ๅฅๆนๆก้จ็ฝฒๆๆฌไฝ、ๅ้ฅๅฟซ,ๆฏๅคงๅคๆธ Linux ไผบๆๅจ็ๅฟ ๅ้ฒ่ญทๅทฅๅ ท。ไธไธๆญฅๅฏ่ๆ ฎ็ตๅ้ไธญๆฅ่ช、WAF ่ IAM ๆไฝณๅฏฆๅ,ๅปบ็ซๅคๅฑคๆฌก็่ณๅฎ้ฒ่ญท。
๐ ๅปถไผธ้ฑ่ฎ
- ๐ง Linux systemd ๆทฑๅ ฅ่งฃๆ่ๅๅๆต็จ็ฎก็
- ๐ง Linux Proxy Server ๅปบ็ฝฎๆๅญธ(Squid)
- Linux ๆ ธๅฟๅๆธ่ชฟๆ ก:sysctl ๅธธ็จๅๆธ
— WWFandy・็ณป็ตฑๅฎๅ จ่็ถญ้็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ