PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptabels und dyndns



fl4kus
12.09.05, 20:01
hi,
also ich wollte 2 rechnern zugriff auf meinen pop3 server erlauben. also habe ich in meinen firewall regeln das eingestellt:
iptables -A INPUT -s host1.ath.cx -d meine.server.ip -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -s host2.ath.cx -d meine.server.ip -p tcp --dport 110 -j ACCEPTDas klappt auch schoen und gut, aber nur solang keiner von beiden nen 24 reconnect hat. wird die ip geupdatet, bekommt das die firewall regel leider nicht mit.
hat jemand vielleicht eine idee, wie man das lösen könnte ?
danke

mfg
fl4kus

xanlosch
12.09.05, 22:26
Folgender Denkanstoss:

1. Ermittle die beiden entsprechenden IP's der Rechner
2. Starte / Aktualisiere dein Script mit den beiden IP's
3. warte eine längere Zeit
4. GOTO 1

fl4kus
12.09.05, 23:55
jau also hab nen kleines script dafuer geschrieben :)
#!/usr/bin/perl

my @ports = (110,25);
my @newRules =
(
'iptables -I INPUT -s host1.ath.cx -d die.ip.vom.server -p tcp --dport 110 -j ACCEPT',
'iptables -I INPUT -s host2.ath.cx -d die.ip.vom.server -p tcp --dport 110 -j ACCEPT',
'iptables -I INPUT -s host1.ath.cx -d die.ip.vom.server -p tcp --dport 25 -j ACCEPT',
'iptables -I INPUT -s host2.ath.cx -d die.ip.vom.server -p tcp --dport 25 -j ACCEPT'
);


my $ipTabelle = `iptables -nvL INPUT`;

my @ipTable = split("\n", $ipTabelle);

foreach $rule(@ipTable) {
foreach $port(@ports) {
if ($rule =~ /dpts?:\s?$port/) {
# 0 0 ACCEPT tcp -- * * 80.80.80.80 82.82.82.82.82 tcp dpt:25
($a,$a,$method,$protokoll,$a,$a,$a,$ip,$host, @args) = split(" ", $rule);
if ($ip eq '0.0.0.0/0') { $strTarget = '' }
else {$strTarget = '-s ' . $ip }
if ($host eq '0.0.0.0/0') { $strHost = '-i eth0' }
else { $strHost = '-d ' . $host }
if ($which = in_array('state', @args)) {
$strState = '-m state --state ' . $args[$which];
}
print "iptables -D INPUT $strTarget $strHost $strState -p $protokoll --dport $port -j $method\n";
system("iptables -D INPUT $strTarget $strHost $strState -p $protokoll --dport $port -j $method");

}
}

}

foreach $rule(@newRules) {
print $rule . "\n";
system($rule);
}

sub in_array() {
my $val = shift(@_);
$i = 1;
foreach $elem(@_) {
if($val eq $elem) {
return $i;
}
$i++;
}
return ;
}lass ich als 10 minuetigen cron laufen ;)

xanlosch
13.09.05, 00:07
Ich kenn mich in Perl nicht aus, aber wenns geht, dann Glückwunsch !