Server yang terhubung ke internet publik adalah magnet bagi upaya brute force attack SSH. Serangan ini biasanya berupa percobaan login berulang-ulang dengan kombinasi username dan password acak oleh bot otomatis.
Jika tidak diblokir, aktivitas ini tidak hanya berisiko membobol akun dengan password lemah, tetapi juga membebani resource server.
Untuk mengatasinya, SSHGuard hadir sebagai solusi ringan dan sederhana yang memblokir IP penyerang secara otomatis melalui log sistem.
Debian/ Ubuntu
Install SSHGuard
Update package terlebih untuk memperbarui repository, lalu install package SSHGuard
sudo apt update sudo apt install sshguard -y
Start dan Enable Service SSHGuard
sudo systemctl enable --now sshguard sudo systemctl status sshguard

Configuration SSHGuard
sudo nano /etc/sshguard/sshguard.conf
Isi configuration file sshguard.conf
BACKEND="/usr/libexec/sshguard/sshg-fw-iptables" LOGREADER="LANG=C journalctl -afb -p info -n1 -t sshd -o cat" THRESHOLD=3 BLOCK_TIME=120 DETECTION_TIME=1800 WHITELIST_FILE=/etc/sshguard/whitelist
Keterangan:
- Backend : Menggunakan iptables sebagai backend firewall untuk memblokir IP
- LOGREADER : Membaca log SSH secara real-time dari journalctl.
- THRESHOLD : 3 kali percobaan gagal login, lalu IP langsung diblokir.
- BLOCK_TIME : IP diblokir selama 120 detik (2 menit) saja. Ini adalah waktu pemblokiran yang singkat.
- DETECTION_TIME : Pemantauan 1800 detik (30 menit). Jika dalam 30 menit ada 3 percobaan gagal, IP diblokir.
Configuration Firewall
netfilter/iptables
Configuration firewall dengan bash script
IPv4
#!/bin/bash clear sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT sudo iptables -A INPUT -p icmp -j ACCEPT sudo iptables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -j sshguard sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo netfilter-persistent save sudo netfilter-persistent reload sudo iptables -L
IPv6
#!/bin/bash clear sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo ip6tables -A INPUT -s ::1/128 -j ACCEPT sudo ip6tables -A INPUT -p icmp -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 51234 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT sudo iptables -A INPUT -j sshguard sudo ip6tables -P INPUT DROP sudo ip6tables -P FORWARD DROP sudo netfilter-persistent save sudo netfilter-persistent reload sudo ip6tables -L
Jika firewall digabungkan dengan cloudflare dan menggunakan file bash script untuk configuration.
IPv4
#!/bin/bash clear sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -A INPUT -s 127.0.0.0/8 -j ACCEPT sudo iptables -A INPUT -p icmp -j ACCEPT sudo iptables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT sudo iptables -A INPUT -j sshguard for cfip in `curl https://www.cloudflare.com/ips-v4/`; do sudo iptables -A INPU> sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo netfilter-persistent save sudo netfilter-persistent reload sudo iptables -L
IPv6
#!/bin/bash clear sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo ip6tables -A INPUT -s ::1/128 -j ACCEPT sudo ip6tables -A INPUT -p icmp -j ACCEPT sudo ip6tables -A INPUT -p tcp --dport NOMOR_PORT_SSH -j ACCEPT sudo iptables -A INPUT -j sshguard for cfip in `curl https://www.cloudflare.com/ips-v6/`; do sudo ip6tables -A INPUT -s $cfip -m comment --comment 'Cloudflare IP' -j ACCEPT; done sudo ip6tables -P INPUT DROP sudo ip6tables -P FORWARD DROP sudo netfilter-persistent save sudo netfilter-persistent reload sudo ip6tables -L
Bash script clear rule configuration firewall
#!/bin/bash clear sudo iptables -P INPUT ACCEPT sudo ip6tables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo ip6tables -P FORWARD ACCEPT sudo iptables -F sudo ip6tables -F sudo netfilter-persistent save sudo netfilter-persistent reload echo "=========================" echo "RULES IPTABLES IPv4" echo "=========================" sudo iptables -L echo "" echo "=========================" echo "RULES IPTABLES IPv6" echo "=========================" sudo ip6tables -L
Setelah melakukan configuration, lakukan restart service SSHGuard.
sudo systemctl restart sshguard
Pengujian
Untuk melakukan pengujian SSHGuard lakukan login ssh dengan username dan password yang berbeda sebanyak 3 kali. Ketika sudah mencapai THRESHOLD secara otomatis sumber ip public terblokir selama 120 detik atau 2 menit.
sudo journalctl -af -u sshguard

sudo tail -f /var/log/auth.log | grep ssh

