<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#!/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, "&lt;$watchfile");

%tries=();      # number of attempts per ip
%blocked=();    # already blocked ip's

# restore iptables configuration
`$iptables_restore &lt; $cfgfile`;

# load currently blocked ips from iptable list
open(IPTPIPE, "$iptables -L -v -n|");
$blockChain=0;
while (&lt;IPTPIPE&gt;){
  $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); $_ = &lt;LFILE&gt;; $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 &gt; $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 &gt; /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
</pre></body></html>