PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kleines Problem



Frank#
02-01-2003, 16:15
Hallo

ich hab das was kniffliges vor wo meine Kenntnisse nicht mehr reichen scheint mir.
Problemstellung ist, auf einen hostnamen einen /usr/bin/host zu machen und die ausgelesene IP in eine Iptables Chain zu packen. Soweit so gut. Nun machte es aber wenig Sinn dies ständig zu tuen und alte Regeln nicht vorher zu löschen. Also quasi: Eben ausgelesene IP neuer als die vor 5 Minuten ? wenn nein dann mche garnix, wenn ja lösche die vorhin angelegte iptables Chain und ersetzte sie mit einer neuen und der actuellen IP

Mein kläglischer technischer Lösungsansatz wäre demnach :

Target="target_hostname"
IP_ADRESSE=$(/usr/bin/host $TARGET)

wenn neu (checken aller 5 Minuten) dann:

$IPTABLES -t mangle -F TARGET //lösche alte Chain

//bilde neu CHAIN
iptables-t mangle -N Target (wobei noch 2-3 andere Regeln nötig wären wodurch man wohl den Iptables Part wieder in ne Variable packen müsste)

wenn gleich dann mache schlicht nichts


Wäre super wenn mir da jemand Hilfestellung bieten könnte


Viele Grüße
Frank

tomes
02-01-2003, 19:40
eine Hilfsfile zum Speichern der IP und sed zum aendern der Firewall- Regeln.
sed --> http://www.tu-harburg.de/rzt/tuinfo/oberflaechen/UNIX_Script/node52.html
kleines Beispiel:


alte_IP=`cat hilfsfile.txt`
if ($alte_IP -eq $neue_IP ); then
sed -e 's/$alte_IP/$neue_IP/g' firewall.sh > neue_firewall.sh
fi


T;o)Mes

Frank#
02-01-2003, 20:59
[QUOTE]Original geschrieben von tomes
alte_IP=`cat hilfsfile.txt`

stimmt, nur wie krieg ich die da rein ?

if ($alte_IP -eq $neue_IP ); then
sed -e 's/$alte_IP/$neue_IP/g' firewall.sh > neue_firewall.sh
fi

und was steht in der firewall.sh ?
ich verstehs leider nicht und meine Kenntnisse sind mangelhaft in der Beziehung


das Prinzip leuchtet mir aber ein


Viele Grüße
Frank

tomes
03-01-2003, 20:43
Original geschrieben von Frank#
alte_IP=`cat hilfsfile.txt`
stimmt, nur wie krieg ich die da rein ?

z.B. vielleicht mit -->
echo "$IP_ADRESSE" > hilfsfile.txt ;)


und was steht in der firewall.sh ?

Das ist dein Firewallscript, ich weiss ja nicht wie das bei dir heist.

T;o)Mes

Frank#
03-01-2003, 20:49
Merci, alles klar. Fehlt nur noch die IP korrekt aus zu filter von dem Befehl host zb kernel.org denn dann kommt als Antwort

hbash-2.05b$ host kernel.org
kernel.org has address 204.152.189.116


Viele Grüße
Frank

panzi
04-01-2003, 14:22
Also mit'n vim könnte man so alles bis auf'd Adresse weglöschen, vieleicht hilft dir das ja weiter (kenn mich mit shell-scripting nicht so aus, muss ich mir auch mal anschaun wenn ich zeit hab):

:%s/^.* address \(\d\+\.\d\+\.\d\+\.\d\+\)$/\1/

das funktioniert aber genauso:

:%s/^.* address \(.*\)$/\1/

tomes
04-01-2003, 15:10
Original geschrieben von Frank#
Merci, alles klar. Fehlt nur noch die IP korrekt aus zu filter von dem Befehl host zb kernel.org denn dann kommt als Antwort

hbash-2.05b$ host kernel.org
kernel.org has address 204.152.189.116


Viele Grüße
Frank


hbash-2.05b$ host kernel.org | awk '{ print $4}'
204.152.189.116

Also insgesamt


hbash-2.05b$ host kernel.org | awk '{ print $4}' > hilfsfile.txt

;)

T;o)Mes

Frank#
04-01-2003, 15:52
Ja Danke, das bringt mich fast ans Ziel. Hab mir jetzt folgendes zusammengebastelt wo es noch an einer einzigen Stelle kränkelt.

host kernel.org | awk '{ print $4}'
Kernelip=???
IPTABLES="/usr/local/sbin/iptables"
$IPTABLES -t mangle -F Kernel //bestehende Cain löschen
$IPTABLES -t mangle -X Kernel //richtig löschen
$IPTABLES -t mangle -N Kernel //neue anlegemn
$IPTABLES -t mangle -A PREROUTING -i ppp0 -s $Kernelip -j RETURN
$IPTABLES -t nat -A Kernel -j Action

das ganze per Cron alle paar Minuten ausgeführt reich mir eigentlich und kostet nix.

Ich hab eineiges versuch ... per >> in ein File schreiben geht,aber das brauch ich garnicht und mit Kernelip="host kernel.org | awk '{ print $4}'" funtioniert nicht. Ich hänge echt fest :)

Viele Grüße
Frank

panzi
04-01-2003, 16:01
Würd sagen folgendes müsste gehn:


Kernelip=´host kernel.org | awk '{ print $4}'´

Frank#
04-01-2003, 16:09
leider nicht, es kommt

./test2: kernel.org: command not found


Viele Grüße
Frank

Frank#
04-01-2003, 17:43
habs

Kernelip=$(/usr/bin/host kernel.org | awk '{ print $4}')

und danke nochmal :)

Viele Grüße
Frank

micha
04-01-2003, 17:49
Original geschrieben von Frank#
leider nicht

Dann hast Du keine Backticks (`...`) verwendet.
Setz den Befehl in $(...), damit geht´s auch:


ip=$(host kernel.org | awk '{ print $4}')

Gruß micha

zu langsam ;)

tomes
04-01-2003, 20:08
das es *funct* Zum Abschluss noch deine *Ueberpruefung*

Also quasi: Eben ausgelesene IP neuer als die vor 5 Minuten ?
Deshalb doch die Hilfsfile ;)


#!/bin/sh
#
if [ -e hilfsfile.txt ] ; then
echo "File existiert"
else
´host $1 | awk '{ print $4}' > hilfsfile.txt `
fi
alte_ip=`cat hilfsfile.txt`
neue_ip=´host $1 | awk '{ print $4}'
if [ "$neue_ip -eq $alte_ip ] ; then
echo "IP hat sich nicht geandert"
else
IPTABLES="/usr/local/sbin/iptables"
$IPTABLES -t mangle -F Kernel //bestehende Cain löschen
....
$IPTABLES -t mangle -A PREROUTING -i ppp0 -s $neue_ip -j RETURN
$IPTABLES -t nat -A Kernel -j Action
fi
exit 0

$1 ist der erste Parameter das dem Script mit uebergeben wird.
Also z.B. dein Script heist neue_ip.sh, dann lautet der Eintrag in der cronttab -->
neue_ip.sh kernel.org ;)

T;o)Mes

Frank#
04-01-2003, 22:24
Dankesehr vielmals das macht es natürlich noch viel perfekter
und ich freue mich drüber ;)

Viele Grüße
Frank

Frank#
06-01-2003, 16:44
Original geschrieben von tomes
das es *funct* Zum Abschluss noch deine *Ueberpruefung*

Deshalb doch die Hilfsfile ;)


#!/bin/sh
#
if [ -e hilfsfile.txt ] ; then
echo "File existiert"
else
´host $1 | awk '{ print $4}' > hilfsfile.txt `
fi
alte_ip=`cat hilfsfile.txt`
neue_ip=´host $1 | awk '{ print $4}'
if [ "$neue_ip -eq $alte_ip ] ; then
echo "IP hat sich nicht geandert"
else
IPTABLES="/usr/local/sbin/iptables"
$IPTABLES -t mangle -F Kernel //bestehende Cain löschen
....
$IPTABLES -t mangle -A PREROUTING -i ppp0 -s $neue_ip -j RETURN
$IPTABLES -t nat -A Kernel -j Action
fi
exit 0

$1 ist der erste Parameter das dem Script mit uebergeben wird.
Also z.B. dein Script heist neue_ip.sh, dann lautet der Eintrag in der cronttab -->
neue_ip.sh kernel.org ;)

T;o)Mes


Guten Tag

ich hab mal dein Script ausgetestet und werde leider nur mit Fehlermeldungen überhäuft. Hab dann mehrere Zeichen geändert bis es ging. Mit der Ausnahme das wenn sich die IP geändert hat er immer noch sagt echo "IP hat sich nicht geandert"
Also alles läuft ohne Fehlermeldung bis zum Check.

Hier die Ausgabe mit /bin/sh -x

+ '[' -e hilfsfile.txt ']'
+ echo 'File existiert'
File existiert
++ cat hilfsfile.txt
+ alte_ip=204.152.189.116
++ host rs.servebeer.com
++ awk '{ print $4}'
+ neue_ip=80.129.111.130
+ '[' '123.123.123.123 -eq 456.456.456.456' ']'
+ echo 'IP hat sich nicht geandert'
IP hat sich nicht geandert
+ exit 0


Viele Grüße
Frank

tomes
07-01-2003, 20:22
noch keine Loesung gefunden hast, schau mal ins "Scriptsprachen FAQ"
Muss mich leider Entschuldigen, bin nicht der "Super" Shell Scripter,
deshalb hab ich mal ein kleines Perl-Script zusammen gebastelt.
Bei mir *funct* es.

T;o)Mes

P.S.: ein kleines Perl Beispiel, wird noch verschoben ;)

Frank#
07-01-2003, 23:45
na und ich erst ;-)
Verstanden vom Prinzip her hab ich dein Script aber es scheitert an Syntaxfehlern, die ich nicht weg kriege deshal bin sehr gespannt auf die Lösung in Perl.

Viele Grüße
Frank

tomes
08-01-2003, 12:33
Ich weiss leider auch nicht wie die IP im Shell-Script zu schuetzen ist, deshalb lieber Perl.
Solange es noch nicht verschoben ist, hier der Link --> http://www.mrunix.de/forums/showthread.php?s=&threadid=30864

T;o)Mes

Frank#
08-01-2003, 23:51
Also ich hab perl 5.8.0 und die benötigten Module ganz sicher drauf. Dennoch krieg ich wieder Fehlermeldungen. Ich hab nur das geändert:

$path = "/tmp";
$host = "gnu.org";
$firewall = "/root/firewall.sh";

und es kommt beim ersten UND exact auch nach zig wiederholten Aufrufen:

# ./test
neue Hilfsfile wird angelegt
IP ist die selbe
mv: Aufruf von stat für »/tmp/firewall« nicht möglich: Datei oder Verzeichnis nicht gefunden
/root/firewall.sh: -t: command not found
/root/firewall.sh: -t: command not found
/root/firewall.sh: -t: command not found
/root/firewall.sh: -t: command not found
/root/firewall.sh: -t: command not found

Das hilfsfile legt er aber prima mit der IP an.
ich weis das die Fehlermeldung nicht von dem script kommt, es ist absicht von mir. Sagen tut mir das eigentlich das er trotz derselben IP das firewall.sh ausführen möchte

und wenn ich mal weiter teste ob er merkt das die Ip sich geändert hat (hierfür ändere ich einfach den host nach kernel.org) und ob er dann das Script startet kommt _haargenau_ der selbe Output wie weiter oben.

Ich hoffe der Bugreport war ausführlich


Viele Grüße
Frank

tomes
09-01-2003, 19:00
Die beiden letzten Zeilen --> mv ... und sh ... muessen natuerlich noch in den else Teil der Abfrage.
Hoffe mal das es das war. ;)

T;o)Mes

Frank#
09-01-2003, 19:08
ein "updated" Script wäre noch idealer ;)
weil ich als Laie würde mich da schwer tuen

Viele Grüße
Frank

Frank#
09-01-2003, 21:38
Ich habe eben grad die letzte Version http://www.mrunix.de/forums/showthread.php?s=&threadid=30232 ausprobiert. Vielen Dank dafür. Leider geht garnix.
Ich ruf es auf und es kommt jetzt

./test
neue Hilfsfile wird angelegt
IP ist die selbe

ich ruf es direkt nochmal auf und es kommt

./test
neue Hilfsfile wird angelegt
IP ist die selbe

dann ändre ich den host im Script um zu schauen ob er eine Änderung der IP registriert und es kommt

./test
neue Hilfsfile wird angelegt
IP ist die selbe


sprich, er legt jedesmal ein neues Hilfsfile an obwohl es schon eines gibt und er registriert keine Änderung der IP und führt die richtige Action dementsprechen aus.

Ich hoffe ich kann mit meinem Bugreport zur Fehlerbereinigung beitragen.


Viele Grüße
Frank

tomes
10-01-2003, 18:37
vorgenommen ;)
Also bei mir *funct* es wunderbar.

T;o)Mes

Frank#
10-01-2003, 22:45
>Also bei mir *funct* es wunderbar.

das glaube ich dir nicht ;)
denn:

line 53 fehlt ein $ vor kernelip
und line 69 ein i vor dem f

und ansonsten legt er immer noch jedesmal eine hilffile and egal was ist und bei geänderter IP meint er immer noch "IP ist die selbe"


Vieleicht würde es helfen wenn du noch postest wie deine frewall.sh aussieht. Und um den Testfall zu simulieren DAS sich die IP geändert hat, ändere ich einfach den HOST und führe das Script erneut aus.


Viele Grüße
Frank

tomes
11-01-2003, 18:47
da hast du wohl recht, ist wohl beim STRG-C STRG-V passiert
Tschuldigung ;)
In Shell-Scripten, was das Firewall Sript ja ist, wird eine Variable ohne vorangestelltes $ inizialisiert, bzw. gefuellt.
Deshalb, kein $ Zeichen vor Kernelip.

In meinem Firewall Script gibt es soetwas in der Art garn nicht, deshalb wuerde es dir nichts nuetzen ;)
Ich habe einfach eine File angelegt, die so heist und wo die Kernelip getauscht wird.

T;o)Mes

Frank#
11-01-2003, 18:55
Das Problem ist nur:

root]# ./test
Unrecognized escape \K passed through at ./test line 53.
neue Hilfsfile wird angelegt

mit $ ist die Fehlermeldung jedenfalls wech

und andererseits, erkennt das Script immer noch nicht wenn sich die IP geändert hat.
Es sagt _JEDESMAL_

neue Hilfsfile wird angelegt
IP ist die selbe


Viele Grüße
Frank

tomes
12-01-2003, 13:54
ist noch uebrig geblieben, da ich erst auch $Kernelip geschrieben hatte.
Mit dem Backslash schuetz man Metazeichen.
Ich haeng dir mal mein fertiges Script mit der Konsolen-Ausgabe hier an.
Die Zeilen 38 (print neue - alte .....) und Zeile 63 (system("more.... ) kannst du loeschen,
sie dienen nur der Ueberprufung.
Mein "firewall-Script" sieht so aus -->
/bin/sh
#
Kernelip="62.180.126.148"

iptabls -A input -d $Kernelip -j deny
exit

T;o)Mes

P.S.: Irgendwie hat das mit dem anhaengen nicht *gefunct*
Hier die Download-Adresse --> http://www.sandtom.net/pub/host.tar.gz

Frank#
12-01-2003, 20:10
Hallo,

Ich hab die 2 Zeilen mal drin gelassen, weil sie doch sehr aufschlussreich sind denn:

ER legt jedesmal egal was ist -> ein neues Hilfsfile an
und jetzt läuft es genau umgekehrt, denn diesmal führt er das firewall Sript aus egal ob sich die IP geändert hat oder nicht. Also quasi genau umgekehrt zu vorher.

Aufrufen tue ich das script mit ./host.pl kernel.org

bei ./host.pl kernel.org kommt :

./host.pl kernel.org
neue Hilfsfile wird angelegt
neue - alte 204.152.189.116 204.152.189.116
IP ist die selbe
/bin/sh
#
Kernelip="217.225.203.xxx"
Action des Scripts
exit



und direkt dannach mit ./host.pl gnu.org


./host.pl gnu.org
neue Hilfsfile wird angelegt
neue - alte 199.232.76.164 199.232.76.164
IP ist die selbe
/bin/sh
#
Kernelip="217.225.203.xxx"
Action des Scripts
exit



die IP 217.225.203.xxx ist die, die Ich zu allererst ausprobiert hatte.


Meinst du wir kriegen das noch hin ?



Viele Grüße
Frank

tomes
14-01-2003, 17:55
wird das Script nicht ;)
system("more f$firewall"); <-- gibt nur den Inhalt des Scripts wieder.

Warum sich die IP nicht aendert ? Kein Ahnung, bei mir macht er es.
Wie sind die Rechte an deinem $firewall ? Darf der jenige der das Script auffuerhrt, darin schreiben ?

T;o)Mes

Frank#
14-01-2003, 18:14
Hallo tomes ;)

ich führe es als root mit den perms root:root 700 ./host.pl so aus
die perms des firewall.sh sehen so aus: 700 root:root
sollte also wirklich nicht an den Rechten liegen ...

>Warum sich die IP nicht aendert ?

Moment, die änderst sich ja. Denn wenn ich das Script mit dem anderen Host ausführe als Parameter im Script oder per Commandline, ist SIE ja anders ( das Hilfsfile bestätigt dies auch durch die actuallisierte neue IP), aber dein Script führt dementsprechend nicht die Action aus die im Script steht.

Vor deiner Änderung meinte er immer ein neues Hilfsfile anlegen zu müssen (der Check funktioniert also auch nicht) UND tat so als ob sich die IP _nicht_ geändert hat.

Nun nach deiner Änderung, führt er das firewall Script IMMER aus obwohl sich die IP _NICHT_ geändert hat. Und das Hilffile legt er nachwievor immer noch JEDSMAL an.

Irgenwas läuft mächtig schief mit dem Script, schade eigentlich, denn wenn man es so liest klingt es sehr vernünftig

Viele Grüße
Frank

tomes
15-01-2003, 19:33
gehabt, mir dass ganze in Ruhe ;) mal durchzusehen.
Da war ja an einigen Stellen ganz schoener Quatsch dabei.
So muesste es jetzt klappen. Du musst dir nur noch ein Perl Paket nach installieren.
Wie, steht ja auch im Scriptsprachen FAQ in dem Beitrag.
Aufpassen !!! Wegen den beiden Leerstellen. Die muessen entfernt werden.
Habe ich deshalb gemacht, weil : und D zusammen --> :D ergibt. :D :D :D
Falls noch was ist, dann melde dich.

T;o)Mes

Frank#
15-01-2003, 21:36
Herzlichen Glückwunsch. ES LÄUFT !!!!
allerding, in Line 28 sollte man ein Leerzeichen noch entfernen sonst hagelt es ne Fehlermeldung beimstarten.

Ich bin begeistert und herzliches Dankeschön tomes ;)

Viele Grüße
Frank

Frank#
15-01-2003, 23:28
ach vieleicht noch als kosmetische Veränderung, könnte man

print "IP ist die selbe \n";

so abändern, das er das genau nicht macht ? denn sonst schreibt mir Cron bei jedem Check ne Mail das sich die IP nicht geändert hat, was doch auf die Dauer lästig wird ;)
Wenn sie sich ändert ist die Action schon in Ordnung so, nur wenn sie sich eben nicht ändert was öfter vorkommt.


Viele Grüße
Frank

tomes
16-01-2003, 11:17
vom Cron unterdruecken >> /dev/null 2&>1 hinterden Aufruf des Scripts im crontab und
dann im letzten Teil des Scripts nach den "system" Aufrufen vor der letzten Geschweiften noch etwas einbauen.
`echo $neue_ip >> /var/log/neue_ip.log` oder mail -s "$neue_ip" ....

Da sind dir theoretisch keine Grenzen gesetzt

T;o)Mes

P.S.:
zu Zeile 28: da steh extra fett --> siehe oben ;)

Frank#
16-01-2003, 13:38
Herrlich. Das klappt wunderbar :)

Viele Grüße
Frank