firewall.conf
[src=perl]
#! /usr/bin/perl
$enableFirewall = 1;
[/src]
rcfirewall
[src=bash]
#! /bin/sh
FIREWALL="/usr/sbin/iptables"
LOGFILE="/etc/firewall/updateFirewall.log"
DATAFILE="/etc/firewall/updateFirewall.data"
CONFFILE="/etc/firewall/firewall.conf"
UPDATESCRIPT="/etc/firewall/updatefirewall"
##################################################################################
##################################################################################
# KONFIGURATION:
##################################################################################
# Je nach Bedarf, die entsprechenden Zeilen (aus) kommentieren bzw. eigene hinzufügen
#
# GGF Pfade zu FIREWALL, LOGFILE, DATAFILE, CONFFILE und UPDATESCRIPT anpassen
# Ich rate aber, die Files einfach unter /etc/firewall abzulegen
# Files ausführbar machen nicht vergessen
##################################################################################
##################################################################################
case "$1" in
start)
echo "Enable Firewall"
###########################################################
# global DROP rule
###########################################################
$FIREWALL -P INPUT DROP
###########################################################
# Allow all on Loopback Device
###########################################################
$FIREWALL -A INPUT -i lo -j ACCEPT
###########################################################
# Allow icmp
###########################################################
$FIREWALL -A INPUT -i eth0 -p icmp -j ACCEPT
###########################################################
# Download-Server
###########################################################
#$FIREWALL -A INPUT -i eth0 -s 127.0.0.1 -j ACCEPT
###########################################################
# SSH - Accept from I-net
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp -s 127.0.0.1 --dport ssh -j ACCEPT #BACKUP IP-> hat immer Zugriff
###########################################################
# Domain - Server
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport domain -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport domain -j ACCEPT
###########################################################
#PING
###########################################################
###########################################################
# Mail - Server (POP - SMTP - IMAP)
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport smtp -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport pop3 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport pop2 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport imap -j ACCEPT
###########################################################
# Web - Server
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp --dport http -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport https -j ACCEPT
###########################################################
# IRC
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 6667 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 6667 -j ACCEPT
##########################################################
# FTP
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
$FIREWALL -A INPUT -i eth0 -p udp --dport 21 -j ACCEPT
###########################################################
# Teamspeak
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 8767 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 8767 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 14534 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 51234 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 51234 -j ACCEPT
###########################################################
# GAMESERVER
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27960 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27960 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27733 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27733 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27964 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27964 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 27970 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 27970 -j ACCEPT
###########################################################
# WEBMIN
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 10000 -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport 10000 -j ACCEPT
###########################################################
# Antwortpakete generell erlauben
###########################################################
$FIREWALL -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
###########################################################
# Logging
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport 23:65535 -j LOG
# $FIREWALL -A INPUT -i eth0 -p udp --dport 23:65535 -j LOG
###########################################################
# Start updateFirewall all 5 minutes
###########################################################
echo "#! /usr/bin/perl" > $CONFFILE;
echo "\$enableFirewall = 1;" >> $CONFFILE;
# echo "1" >> $CONFFILE;
$UPDATESCRIPT;
;;
stop)
echo "Disable Firewall"
# If File exists
[ -f $DATAFILE ] && rm $DATAFILE
echo "#! /usr/bin/perl" > $CONFFILE;
echo "\$enableFirewall = 0;" >> $CONFFILE;
# echo "1" >> $CONFFILE;
$FIREWALL -F INPUT
$FIREWALL -F OUTPUT
$FIREWALL -F FORWARD
$FIREWALL -P INPUT ACCEPT
;;
status)
$FIREWALL -L -n
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage ( start | stop | status | restart )"
;;
esac
[/src]
updatefirewall
[src=perl]
#! /usr/bin/perl
require '/etc/firewall/firewall.conf';
$iptables_bin = "/usr/sbin/iptables";
$dataFile = "/etc/firewall/updateFirewall.data";
$logFile = "/etc/firewall/updateFirewall.log";
#
#Hier können DynDNS Adressen eingefügt werden, denen
#Zugang zum ssh gewährt wird
#Diese Datei per Cron ausführen (z.b. alle 5 Minuten)
#
#Beim Ausführen werden die in @URL gelisteten DynDNS Addis in iptable aufgenommen
#
#
##################################################################################
# KONFIGURATION:
##################################################################################
# DYNDNSADDI1 bis 4 mit validen DynDNS Adressen ersetzen
# AllowedUser1 bis 4 mit griffigen Usernamen ersetzen
# GGF Pfade zu FIREWALL, LOGFILE, DATAFILE, CONFFILE und UPDATESCRIPT anpassen
# Ich rate aber, die Files einfach unter /etc/firewall abzulegen
# Files ausführbar machen nicht vergessen
##################################################################################
@URL = ( "/bin/ping -c 1 -w 1 DYNDNSADDI1 |" ,
"/bin/ping -c 1 -w 1 DYNDNSADDI2 |",
"/bin/ping -c 1 -w 1 DYNDNSADDI3 |",
"/bin/ping -c 1 -w 1 DYNDNSADDI4 |" );
@ENV = ( "AllowedUser1", "AllowedUser2" ,"AllowedUser3", "AllowedUser4");
# -----------------------------------------------------------------
# Ab hier nichts mehr aendern
# -----------------------------------------------------------------
sub RemoveRule
{
# open(OUTFILE, ">>$logFile") or die print "error with logfile\n";
# printf OUTFILE "Remove Rule for User: $user[$i] with IP: $data[$i]\n";
open(INFILE, "$iptables_bin -D INPUT -i eth0 -s $data[$i]/32 -p tcp --dport ssh -j ACCEPT |") or die printf OUTFILE "error with iptables\n";
close(INFILE);
# close(OUTFILE);
}
sub AddRule
{
# open(OUTFILE, ">>$logFile") or die print "error with logfile\n";
# printf OUTFILE "Add Rule for User: $user[$i] with IP: $data[$i]\n";
open(INFILE, "$iptables_bin -A INPUT -i eth0 -s $data[$i]/32 -p tcp --dport ssh -j ACCEPT |") or die printf OUTFILE "error with iptables\n";
close(INFILE);
# close(OUTFILE);
}
sub updateDataFile
{
open(OUTFILE, ">$dataFile") or die "Cant createFile\n";
for ($a=0; $a<$counter; $a++)
{
printf OUTFILE "$user[$a] : $data[$a]\n";
}
close(OUTFILE);
}
sub CheckFirewall
{
$changes = 0;
for ($i=0; $i<$counter; $i++)
{
if ($data[$i] ne $ip[$i])
{
$changes = 1;
RemoveRule;
$data[$i] = $ip[$i];
AddRule;
}
}
if ($changes == 1)
{
updateDataFile;
}
}
sub ReadLog
{
open(INFILE, "<$dataFile") or die "File not Found!\n";
@FILE = <INFILE>;
close(INFILE);
$counter = 0;
foreach $line (@FILE)
{
chomp($line);
@DATA = split( / : /, $line);
$user[$counter] = $DATA[0];
$data[$counter] = $DATA[1];
$counter++;
}
CheckFirewall;
}
if (!(-e $dataFile))
{
open(OUTFILE, ">$dataFile") or die "Cant create File\n";
foreach $line (@ENV)
{
printf OUTFILE "$line : 0.0.0.0\n";
}
close(OUTFILE);
}
$index = -1;
foreach $url (@URL)
{
open(INFILE, $url) or die "File not Found!\n";
$line = <INFILE>;
close(INFILE);
if ($line =~ /.* \([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\) .*/)
{
$index++;
@fields = split( / \(/ , $line);
@IP = split( /\) / , $fields[1]);
$ip[$index] = $IP[0];
}
else
{
print "No IP found";
}
}
if ($enableFirewall > 0)
{
if ($index > 0)
{
ReadLog;
}
}
else
{
}
[/src]
updateFirewall.data --> leere Datei (vorerst)