iptables “recent” module and hit limits
iptables “recent” module and hit limits
iptables “recent” module and hit limits
Those annoying ssh attacks
You know those. you have tried blockhosts, denyhosts, fail2ban, and they can still be annoying.
an alternative is to use some feature or features of iptables.
Two possible uses … examples
Your default INPUT chain policy is ACCEPT
This is the version that is found online, typically under tags such as Brute-force.
one adds lines to ones iptables
iptables -N SSHSCAN iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j SSHSCAN iptables -A SSHSCAN -m recent --set --name SSH --rsource iptables -A SSHSCAN -m recent --update --seconds 3600 --hitcount 5 --name SSH --rsource -j LOG --log-prefix "Anti SSH-Bruteforce: " --log-level 6 iptables -A SSHSCAN -m recent --update --seconds 3600 --hitcount 5 --name SSH --rsource -j DROP
Your default INPUT chain policy is DROP
This is a variation of the above, but takes into account the DROP policy. It is a small change, but necessary if you really want to be able to log in via ssh.
iptables -N SSHSCAN iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j SSHSCAN iptables -A SSHSCAN -m recent --set --name SSH --rsource iptables -A SSHSCAN -m recent --update --seconds 3600 --hitcount 5 --name SSH --rsource -j LOG --log-prefix "Anti SSH-Bruteforce: " --log-level 6 iptables -A SSHSCAN -m recent --update --seconds 3600 --hitcount 5 --name SSH --rsource -j LogDrp iptables -A SSHSCAN -j ACCEPT
Discussion
The recent module takes a number of options, and the examples above demonstrate some.
—name
xyz give a name to the particular ‘class
’ you are defining—rsource
in the list you keep, use the remote (source) address—rcheck
see if the address is in the list—update
like rcheck, but update the timestamp for tracking hits—seconds
the number of seconds to track the address—hitcount
the number of hits withing the time defined be—seconds
at which point the rule gets activated.
So, in the examples, after the chain is defined to exist ( -N SSHSCAN), we have an INPUT rule that says ‘go to chain SSHSCAN if the destination port is 22’. In that chain, we set the module’s reference to this as SSH; then we tell it how to log this, if we have gotten 5 hits within 3600 seconds (actually more, as the time is updated rather than checked) and after that, DROP the next packets.
If the address has not gone up to 5 hits, it passes through and gets ACCEPTed.
Depending on your kernel and version of iptables, you can find the current list in
/proc/self/net/xt_recent/SSH
or
/proc/net/ipt_recent/SSH
ipsets
what does one do when one’s iptables rules start to get long? cpu and memory hit hard? convert a table to an ipset.
here is an example of something i need to test:
ipset -N sshban iphash --hashsize 4096 --probes 2 --resize 50 for i in ` cat /proc/net/xt_recent/SSH | awk '{print $1;}' | cut -d '=' -f 2 `; do ipset -A sshban $i; echo -$i > /proc/net/xt_recent/SSH done
where we also have iptables rule
iptables -I INPUT -m set —set sshban src -j DROP
Source: we.riseup.net