Du könntest auch alles via DynDNS auf bestimmte IPs beschränken.
Ich hatte mal sowas auf einem meiner Server, um den SSH Zugang zu beschränken:
File: firewall.conf
[src=perl]#! /usr/bin/perl
$enableFirewall = 1;[/src]
File: 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"
#################################################################
# Ab hier nichts mehr ändern
#################################################################
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 85.25.128.62 -j ACCEPT
###########################################################
# SSH - Accept from I-net
###########################################################
$FIREWALL -A INPUT -i eth0 -p tcp -s 213.239.195.198/32 --dport ssh -j ACCEPT
$FIREWALL -A INPUT -i eth0 -p tcp -s 80.61.115.64/32 --dport ssh -j ACCEPT
$FIREWALL -A INPUT -i eth0 -p tcp -s 193.111.199.212 --dport ssh -j ACCEPT
###########################################################
# Domain - Server
###########################################################
# $FIREWALL -A INPUT -i eth0 -p tcp --dport domain -j ACCEPT
# $FIREWALL -A INPUT -i eth0 -p udp --dport domain -j ACCEPT
###########################################################
# 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
###########################################################
# ETW
###########################################################
$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 27961 -j ACCEPT
$FIREWALL -A INPUT -i eth0 -p udp --dport 27961 -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]
Filename: 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";
@URL = ( "/bin/ping -c 1 -w 1 user1.mine.nu |" ,
"/bin/ping -c 1 -w 1 user2.mine.nu |",
"/bin/ping -c 1 -w 1 user3.dnsalias.com |" );
@ENV = ( "User1", "User2" ,"User3");
# -----------------------------------------------------------------
# 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]
Das ganze müsste natürlich noch für die entsprechenden Dienste eingerichtet werden (hier war es in erster Linie für Gameserver, Webserver, Teamspeak und SSH ausgelegt, wobei nur SSH durch das updatefirewall - Skript erlaubt wird, der Rest durch die rcfirewall.