#!/usr/bin/perl -w use Sys::Syslog; $max=10; # maximum permited atempts $watchfile= '/var/log/messages'; $iptables= '/sbin/iptables'; $iptables_save= '/sbin/iptables-save'; $iptables_restore= '/sbin/iptables-restore'; $cfgfile= '/etc/sysconfig/iptables'; open(LFILE, "<$watchfile"); %tries=(); # number of attempts per ip %blocked=(); # already blocked ip's # restore iptables configuration `$iptables_restore < $cfgfile`; # load currently blocked ips from iptable list open(IPTPIPE, "$iptables -L -v -n|"); $blockChain=0; while (){ $blockChain=1 if (/^Chain block \(\d+ references\)$/); next unless $blockChain; last if (/^$/ ); $blocked{$1}=1 if (/(\d+\.\d+\.\d+\.\d+)/); } close IPTPIPE; $blk_ips=join(", ",keys(%blocked)); syslog('warning',"sshwatch.pl started. currently blocked ip's are: $blk_ips"); # watch the messages file while (1) { for ($curpos = tell(LFILE); $_ = ; $curpos = tell(LFILE)) { if (/sshd\[\d+\]: Failed password for .+ from \D+(\d+\.\d+\.\d+\.\d+)/) { $ip=$1; next if defined($blocked{$ip}); $tries{$ip}+=1; if ($tries{$ip} eq $max){ `$iptables -I block -s $ip -j DROP ; $iptables_save > $cfgfile`; $blocked{$ip}=1; syslog('warning', "IP $ip has been blocked !"); } } } sleep 1; seek(LFILE, $curpos, 0); } =head1 NAME sshwatch.pl =head1 Author Dragos Constantinescu, dragos@venus.nipne.ro =head1 DESCRIPTION This script watches the system log file for dictionary sshd attacks and automaticaly block the attacker ip after specified number of attempts before first use: 1. create a new iptables chain "block" : iptables -N block 2. insert a rule in the input chain to send all input packages to "block": iptables -I INPUT -i eth0 -j block 3. save your current iptables configuration: iptables-save > /etc/sysconfig/iptables =head1 README This script watches the system log file for dictionary sshd attacks and automaticaly block the attacker ip after specified number of attempts =head1 PREREQUISITES You need Sys::Syslog and iptables =head1 COPYRIGHT Copyright 2005, Dragos Constantinescu. All rights reserved. This program is free software. It may be used, redistributed, and/or modified under the same terms as Perl itself. =pod SCRIPT CATEGORIES Networking UNIX/System_administration =cut