This repository has been archived on 2020-01-20. You can view files and clone it, but cannot push or open issues or pull requests.
evoauth/admin/lib/Evoauth/Iptables.pm

267 lines
6 KiB
Perl
Raw Normal View History

2005-09-12 21:51:19 +02:00
package Evoauth::Iptables;
use strict;
use warnings;
use Config::Tiny;
use Evoauth::Functions;
2005-09-14 15:24:54 +02:00
use DBI;
2005-09-12 21:51:19 +02:00
my $Config = Config::Tiny->read( '/etc/evoauth/evoauth.conf' );
# Paramètres de configuration
my $activation = $Config->{control}->{enable};
my $timetorem = $Config->{control}->{timetorem};
2005-09-20 09:05:46 +02:00
# Paramètres Base de données
2005-09-12 21:51:19 +02:00
my $db = $Config->{bdd}->{db};
my $username = $Config->{bdd}->{username};
my $userpass = $Config->{bdd}->{userpass};
2005-09-20 09:05:46 +02:00
# Règles firewall
open(RULES, "/etc/evoauth/evoauth.rules") ||
&ecriture("L'ouverture du fichier de règles a échoué.");
our @rules = <RULES>;
close(RULES);
2005-09-12 21:51:19 +02:00
sub Alter() {
my $action = shift;
2005-09-24 11:49:16 +02:00
my $login = shift;
2005-09-12 21:51:19 +02:00
my $ip = shift;
# mode ajout
2005-09-12 21:51:19 +02:00
if ($action == 1) {
2005-09-15 11:47:10 +02:00
system("/sbin/iptables -I EVOAUTH -s $ip -j ACCEPT 2>/dev/null");
&Evoauth::Functions::Log("Ajout de $ip aux connectés.") &&
2005-09-12 21:51:19 +02:00
&Evoauth::Functions::Mail("Connexion", $ip);
}
# mode vérification
2005-09-12 21:51:19 +02:00
elsif ($action == 2) {
&check_iptables;
&check_timestamp;
}
# mode suppression
2005-09-12 21:51:19 +02:00
else {
2005-09-15 07:44:29 +02:00
my $dbh = DBI->connect( $db, $username, $userpass ) ||
&Evoauth::Functions::Log("La connexion a échoué : $DBI::errstr");
2005-09-12 21:51:19 +02:00
my $sql = qq{ UPDATE users set statut = 0 where ip = '$ip' };
my $sth = $dbh->prepare($sql);
2005-09-15 10:34:48 +02:00
system("/sbin/iptables -D EVOAUTH -s $ip -j ACCEPT 2>/dev/null");
2005-09-15 07:44:29 +02:00
$sth->execute();
$sth->finish();
2005-09-15 10:43:05 +02:00
2005-09-15 11:47:10 +02:00
&Evoauth::Functions::Log("$ip [supprimée]");
2005-09-15 07:44:29 +02:00
&Evoauth::Functions::Mail("Deconnexion", $ip);
2005-09-12 21:51:19 +02:00
}
}
sub check_iptables() {
my ($ip, @ips);
&Evoauth::Functions::Log("Suppression des règles obsolètes dans iptables.");
# obtention de la liste des ips
system("/sbin/iptables -L EVOAUTH -n | grep ACCEPT | awk '{ print \$4 }' > /tmp/ips.txt");
2005-09-12 21:51:19 +02:00
# on ouvre le fichier des ips
open(IPS, "/tmp/ips.txt") || &ecriture("L'ouverture des IPs a échoué.");
@ips = <IPS>;
close(IPS);
2005-09-13 16:02:17 +02:00
foreach $ip (@ips) {
2005-09-12 21:51:19 +02:00
chomp $ip;
2005-09-15 07:44:29 +02:00
my $dbh = DBI->connect( $db, $username, $userpass ) ||
&Evoauth::Functions::Log("La connexion a échoué : $DBI::errstr");
2005-09-12 21:51:19 +02:00
my $sql = "SELECT statut FROM users where ip = '".$ip."'";
my $sth = $dbh->prepare( $sql );
$sth->execute();
my $statut;
$sth->bind_columns(undef, \$statut);
$sth->fetch();
2005-09-15 10:43:05 +02:00
# si entrée iptables présente mais statut non connecté, on supprime
2005-09-15 13:46:08 +02:00
if (defined($statut)) {
if ($statut != 1) {
&Evoauth::Functions::Log("$ip [supprimée]\n") &&
&Evoauth::Functions::Mail("Suppression", $ip);
&Alter(3, $ip);
}
}
2005-09-15 13:39:53 +02:00
2005-09-15 13:46:08 +02:00
else {
2005-09-15 11:47:10 +02:00
&Evoauth::Functions::Log("$ip [supprimée]\n") &&
&Evoauth::Functions::Mail("Suppression", $ip);
2005-09-13 16:45:43 +02:00
&Alter(3, $ip);
2005-09-12 21:51:19 +02:00
}
}
}
sub check_timestamp() {
&Evoauth::Functions::Log("Suppression des règles obsolètes dans iptables.");
# on travaille sur tous les utilisateurs présents
2005-09-15 07:44:29 +02:00
my $dbh = DBI->connect( $db, $username, $userpass ) ||
&Evoauth::Functions::Log("La connexion a échoué : $DBI::errstr");
2005-09-12 21:51:19 +02:00
my $sql = "SELECT * FROM users";
my $sth = $dbh->prepare($sql);
$sth->execute();
my($id, $login, $pass, $groupe, $utype, $credit, $ip, $statut,
$actif, $firstcon, $lastupdate, $kick);
$sth->bind_columns(undef, \$id, \$login, \$pass, \$groupe,
\$utype, \$credit, \$ip, \$statut, \$actif, \$firstcon,
\$lastupdate, \$kick);
&Evoauth::Functions::Log("Vérification de la base.");
my ($newtime, $oldtime, $cpt);
2005-09-13 16:02:17 +02:00
while ($sth->fetch() && $sth != 0) {
if ($statut == 1) {
2005-09-12 21:51:19 +02:00
$newtime = time();
$oldtime = $lastupdate;
# si le dernier update est trop ancien, on supprime
2005-09-12 21:51:19 +02:00
my $timestamp = $newtime - $oldtime;
2005-09-15 12:02:16 +02:00
if ($timestamp > $timetorem) {
2005-09-12 21:51:19 +02:00
# dernière connexion est < 1 min -> suppresion
2005-09-15 11:55:54 +02:00
&Alter(3, $ip);
&Evoauth::Functions::Log("$ip [supprimée]") &&
2005-09-12 21:51:19 +02:00
&Evoauth::Functions::Mail("Suppression", $ip);
}
# sinon conservation
2005-09-13 16:02:17 +02:00
else {
2005-09-12 21:51:19 +02:00
&Evoauth::Functions::Log("$ip [conservée]");
}
}
}
$sth->finish();
}
sub Control() {
my $action = shift;
# initialisation d'Evoauth
2005-09-12 21:51:19 +02:00
if ($action == 1) {
2005-09-20 09:36:56 +02:00
foreach (@rules) {
next if /^#/;
chomp;
2005-09-20 09:05:46 +02:00
# on supprimer les commentaires
2005-09-20 09:36:56 +02:00
$_ =~ s/#.*//;
2005-09-20 09:05:46 +02:00
# on split la liste des paramètres
2005-09-20 09:42:52 +02:00
my @tmp1 = split (/\t+|\s+/);
2005-09-20 09:05:46 +02:00
2005-09-15 10:34:48 +02:00
system("/sbin/iptables -t nat -A PREROUTING -p $tmp1[2] -i ppp0 --dport $tmp1[1] -j DNAT --to $tmp1[0]:$tmp1[1] 2>/dev/null");
2005-09-12 21:51:19 +02:00
}
&Evoauth::Functions::Log("1 - Règles de PREROUTING charges");
2005-09-12 21:51:19 +02:00
2005-09-15 10:34:48 +02:00
system("/sbin/iptables -N EVOAUTH 2>/dev/null");
system("/sbin/iptables -A EVOAUTH -j DROP 2>/dev/null");
2005-09-12 21:51:19 +02:00
&Evoauth::Functions::Log("2 - Tables crées");
2005-09-20 09:05:46 +02:00
# chargement des règles
2005-09-20 09:36:56 +02:00
foreach (@rules) {
next if /^#/;
chomp;
2005-09-20 09:05:46 +02:00
# on supprimer les commentaires
2005-09-20 09:36:56 +02:00
$_ =~ s/#.*//;
2005-09-20 09:05:46 +02:00
# on split la liste des paramètres
2005-09-20 09:42:52 +02:00
my @tmp2 = split (/\t+|\s+/);
2005-09-20 09:05:46 +02:00
2005-09-15 10:34:48 +02:00
system("/sbin/iptables -A FORWARD -p $tmp2[2] -i ppp0 -o eth0 --dport $tmp2[1] -j EVOAUTH 2>/dev/null");
2005-09-12 21:51:19 +02:00
}
&Evoauth::Functions::Log("3 - Règles chargées");
&Evoauth::Functions::Log("Evoauth vient de démarrer.");
}
# arret
elsif ($action == 2) {
2005-09-15 11:47:10 +02:00
system("/sbin/iptables -F EVOAUTH 2>/dev/null");
&Evoauth::Functions::Log("1 - Flush de la table EVOAUTH");
2005-09-12 21:51:19 +02:00
2005-09-20 09:36:56 +02:00
foreach (@rules) {
next if /^#/;
chomp;
2005-09-20 09:05:46 +02:00
# on supprimer les commentaires
2005-09-20 09:36:56 +02:00
$_ =~ s/#.*//;
2005-09-20 09:05:46 +02:00
# on split la liste des paramètres
2005-09-20 09:42:52 +02:00
my @tmp3 = split (/\t+|\s+/);
2005-09-20 09:05:46 +02:00
2005-09-15 10:34:48 +02:00
system("/sbin/iptables -D FORWARD -p $tmp3[2] -i ppp0 -o eth0 --dport $tmp3[1] -j EVOAUTH 2>/dev/null");
system("/sbin/iptables -t nat -D PREROUTING -p $tmp3[2] -i ppp0 --dport $tmp3[1] -j DNAT --to $tmp3[0]:$tmp3[1] 2>/dev/null");
2005-09-12 21:51:19 +02:00
}
&Evoauth::Functions::Log("2 - Annulation FORWARD + PREROUTING");
2005-09-15 11:47:10 +02:00
system("/sbin/iptables -X EVOAUTH 2>/dev/null");
&Evoauth::Functions::Log("3 - Suppression de la table EVOAUTH");
2005-09-12 21:51:19 +02:00
&Evoauth::Functions::Log("Evoauth vient de s'arreter.");
}
# restart
else {
2005-09-15 10:48:40 +02:00
&Control(2);
&Control(1);
&Evoauth::Functions::Log("Evoauth vient de redémarrer.");
2005-09-12 21:51:19 +02:00
}
}
1;
__END__
=head1 NAME
Evoauth::Iptables - Firewall
=head1 SYNOPSIS
use Evoauth::Iptables;
2005-09-12 21:51:19 +02:00
=head1 DESCRIPTION
Fonctions d'administration d'Evoauth.
=head2 EXPORT
...
=head1 SEE ALSO
...
=head1 AUTHOR
2005-09-15 10:43:05 +02:00
Evolix, E<lt>info@evolix.fr<gt>
2005-09-12 21:51:19 +02:00
=head1 COPYRIGHT AND LICENSE
2005-09-15 10:43:05 +02:00
Copyright (C) 2005 Evolix
2005-09-12 21:51:19 +02:00
2005-09-15 10:43:05 +02:00
Licence GPL.
2005-09-12 21:51:19 +02:00
=cut