Code PHP:
#!/usr/bin/php
<?php
// ####################################################
// #                                                  #
// #           4sipviciuous VER 0.1 | 2011            #
// #                   DOTSMART                       #
// #            http://www.dot-smart.com              #
// #                                                  #
// ####################################################
//
// L intérêt de ce script est de pouvoir analyser les fichiers log d'1 asterisk et de partager les informations des scans sur la grappe entière.
// Les nœuds de la  grappe connaitrons avant le scan les ip susceptibles de les scanners
// Pourquoi php-cli ? pourquoi pas !
// ereg = deprecated
//
//
// Structure de la table 4sipvicious
//  CREATE TABLE IF NOT EXISTS `ip_blocked2` (
//  `id` int(11) NOT NULL AUTO_INCREMENT,
//  `date_insert` datetime NOT NULL,
//  `date` varchar(30) NOT NULL,
//  `ip` varchar(30) NOT NULL,
//  `port` varchar(5) NOT NULL,
//  `autorise` int(11) NOT NULL,
//  PRIMARY KEY (`id`),
//  KEY `ip` (`ip`,`port`,`date_insert`)
//  ) ENGINE=MyISAM  DEFAULT
//
// Crontab -e | */5 * * * * sudo /usr/bin/php ../../4sipvicious2.php > /dev/null 2>&1
//
// Penser au logrotate pour éviter des traitements de logs trop volumineux
//
// roadmap :    ajouter exp. regulieres pour iptables et gestion du port
//              ajouter la gestion de l’état 2 pour autoriser une ip depuis la database + iptables + suppression dans iptables si présente
//              centraliser les clients ipbx
//              passe 1 ip en défaut au bout de X tentatives, he oui les  utilisateurs ont le droit de se tromper ! (gestion, peut être envoyer un émail a l utilisateur ?)

$host           "LA DB";
$login          "LE LOGIN MYSQL";
$mdp            "LE MDP MYSQL";
$db             "4sipvicious";
$action         NULL;
$stack_ip       = array();                                                                               // Création de la stack ip
$stack_info     = array();                                                                               // Création de la stack info
$fichier        "/var/log/asterisk/messages";                                                          // Fichier de log asterisk
if (!$fp fopen($fichier,"r"))                                                                          // Ouverture du fichier,
        
{       print "Error open file\n"; exit;                                                         // si problème on affiche et exit les pointes seches
}else   {       print "Read file $fichier ...\n";                                                        // Pas de problème ... la suite
        
while(!feof($fp)) {                                                                              // La boucle du fichier
                
$Ligne fgets($fp,4096);                                                                // Lecture des ligne
                
ereg("\[(.*){1}\].*\].*failed for '(.*):(.*)' - No matching peer found",$Ligne,$askip);  // On recherche exp reg pour 1.8 supprimer :.* pour les < 1.8
                
if ($askip == TRUEarray_push($stack_info, array($askip[1], $askip[2], $askip[3]));     // On push l'ip trouvee dans la stack avec les infos correspondantes
        
}                                                                                                // Fin de la boucle
        
fclose($fp);                                                                                     // On ferme le fichier de log
}                                                                                                        // fin de lecture du fichier log
                                                                                                         // Maintenant on verifie et integre Ã* la BD
$link mysql_connect($host$login$mdp);                                                              // CX a la mysql
if (!$link) { die('Could not connect: ' mysql_error()); exit; }                                        // piti erreur pour la DB ?
mysql_select_db($db,$link);                                                                              // on sélection la DB 4sipvicious
print 'DB connected successfully\n';
                                                                                                         
// Ah le (if not exist) de mysql quel bonheur
reset($stack_info);                                                                                      // on reset la stack
foreach ($stack_info as $v1) {                                                                           // On boucle la stack ip_info
$da=$v1[0];     print "date:"   .$da."|";
$ip=$v1[1];     print "ip:"     .$ip."|";
$po=$v1[2];     print "port:"   .$po."\n";

$query  mysql_query("select `id` from `ip_blocked2` where `date` = '".$da."' and `ip` = '".$ip."' and `port` = '".$po."';");
$num    mysql_num_rows($query);

if(
$num == 0)
        {                                                                                                
// Si inexistante,ajout
                
$sql "INSERT INTO  `4sipvicious`.`ip_blocked2` (`id` ,`date_insert` ,`date` ,`ip` ,`port` ,`autorise`) VALUES (NULL , NOW( ) ,  '$da',  '$ip',  '$po',  '0');";
                
$result mysql_query($sql);
                print 
"record insert for ".$ip;
} elseif(
$num 0) {
                print 
"record exit, remember 1 per seconde :(, we are not not reference ";               // inexistante
        
}

}
                                                                                                         
// On s'occupe d'iptables
$commande       popen('iptables-save -c 2>&1''r');                                                   // Facile
$iptables       = (fread($commande8096));                                                              // c'est fini !
pclose($commande);                                                                                       // Fermeture popen
                                                                                                         // Bouclage de des ips et verification de son existance dans iptables
                
$sql mysql_query("SELECT DISTINCT(ip), port FROM `4sipvicious`.`ip_blocked2`");        // On liste les ip unique avec le port
                
while ($result mysql_fetch_array($sql)) {
if (
preg_match("/".$result['ip']."/",$iptables))        {                                                // ip db est elle existante dans iptables ?
                
print $result['ip']." is present, next\n";
} else{
                
$action .= "/sbin/iptables -I INPUT -s ".$result['ip']." -p udp --dport ".$result['port']." -j DROP\n";
                print 
$result['ip']." is not present, next\n";
        }

}
if (
$action == TRUE)            system($action);                                                         // On lance iptables avec toutes les ip a dropper
if (mysql_close($link))                                                                                  // On ferme tout et sortie
print 'down connected successfully\n';
exit;
?>