Lumayan susah sebenarnya untuk melakukan ini, tapi kita akan coba lakukan yang termudah. Walaupun bukan yang teraman.

Yang membuat susah karena pun selalu memperbaiki metode scan port nya. Misal nmap yang bisa otomatis menaikkan nilai scan delay jika ternyata server tersebut melakukan rate limit. Yang tapi mau bagaimana lagi, memang begitu keadaannya. Untuk sementara yang saya tahu berikut cara terbaik dengan iptables yang bisa dibuat.

1. Install dahulu ipset

sudo apt update
sudo apt install ipset

2. Buat list dengan ipset

ipset create port_scanners hash:ip family inet hashsize 32768 maxelem 65536 timeout 600
ipset create scanned_ports hash:ip,port family inet hashsize 32768 maxelem 65536 timeout 60

3. Kemudian buat iptables rules

iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -m state --state NEW -m set ! --match-set scanned_ports src,dst -m hashlimit --hashlimit-above 1/hour --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name portscan --hashlimit-htable-expire 10000 -j SET --add-set port_scanners src --exist
iptables -A INPUT -m state --state NEW -m set --match-set port_scanners src -j DROP
iptables -A INPUT -m state --state NEW -j SET --add-set scanned_ports src,dst

4. Perintah tambahan

# To list all tables rules : 
sudo iptables -L -v -n | more.
# To list ipset : 
sudo ipset list

5. How this works:

Pertama kita list port di scanned_ports, dan hashlimit rule akan mulai menghitung proses scan port yang baru. Jika scanner melakukan pemeriksaan di 5 port yang berbeda (lihat --hashlimit-burst 5) maka ip scanner akan dimasukkan ke port_scanners. Timeout dari ip yang kita masukkan dalam port_scanners tadi adalah 10 menit. Rules akan mulai menghitung waktu (lihat --exist) setelah scanners berhenti selama 10 detik. (lihat --hashlimit-htable-expire 10000)

Sesuaikan dengan kebutuhan kita masing masing. Jangan terlalu lama waktu blokirnya, takut kita tanpa sengaja keblok...