IP Salat --> Firewall Regel Script
Hallo List, irgendwie bin ich mal wieder am Ende mit meinem "Latein" und hoffe auf die Skriptgurus *hint* *hint* David :D ich habe eine Liste von IP Adressen die etwa wie folgt aussieht <LISTE> [...]belangloser Text[...] Beschreibung:123.123.123.0-123.123.123.255 Andere Beschreibung:222.222.0.0-222.222.255.255 nocheine:124.0.0.0-124.0.0.0 nocheine:122.1.1.0-122.1.1.127 </LISTE> Anmerkung zur den letzten: die fallen leider auch real aus dem Rahmen. diese IP Adressen sollen nun der Grundstock für eine dynamische ipchains Blacklist sein. D.h. ich mache ersteinmal folgende: cat <textfile> | awk 'BEGIN { FS=":" } /[0-9]-[0-9]/ { print $2 }' <Ausgabe> 123.123.123.0-123.123.123.255 222.222.0.0-222.222.255.255 <Ausgabe> jetzt habe ich zumindest mal eine Liste aller IPs. Um das ganze jetzt aber ordentlich in IP und Netmask zu unterteilen bräuchte ich etwas das mir z.B. alle Nullen aus dem ersten Teil summiert. Evtl. auch schaut ob an der Stelle im 2. Teil eine 255 oder etwas anderes steht und mir daraus dann eine korrekte Netmask berechnet. Ich bin mir eigentlich ziemlich sicher das ich das nicht in C programmieren muss, AWK sollte das doch können oder? #!/bin/bash awk 'BEGIN {FS=":"} /\.[0-9]-[0-9]/ { print $2 } ' | awk 'BEGIN {FS="-" printf("#\n# Ipchains -- Blacklist\n#\n"); } { printf "/sbin/ipchains -A input -j DENY -l -p all\ -s %s/24 -d 192.168.10.10\n", $1 } ' # EOF Bis auf die Tatsache das das irgendwie unschön aussieht (2*awk) und keine ordentliche Netmask berechnet wird funktioniert es. <Ausgabe> /sbin/ipchains -A input -j DENY -l -p all -s 123.123.123.0/24 -d 192.168.10.10 /sbin/ipchains -A input -j DENY -l -p all -s 222.222.0.0/24 -d 192.168.10.10 </Ausgabe> Wie man sieht nicht wirklich schön und auch nicht sehr effizient. Momentan werden zwar eher zu wenig als zu viele Adressen geblockt aber ich hätte das doch gerne *genau* Greetings Daniel PS.: Sorry für den langen Post && David bitte nicht lachen.... -- ... yesterday I met the woman I couldn't drink pretty ...
Hallo, On Sun, 08 Jun 2003, Daniel Lord wrote:
irgendwie bin ich mal wieder am Ende mit meinem "Latein" und hoffe auf die Skriptgurus *hint* *hint* David :D
*g*
ich habe eine Liste von IP Adressen die etwa wie folgt aussieht <LISTE> [...]belangloser Text[...]
Beschreibung:123.123.123.0-123.123.123.255 Andere Beschreibung:222.222.0.0-222.222.255.255 nocheine:124.0.0.0-124.0.0.0 nocheine:122.1.1.0-122.1.1.127 </LISTE>
Anmerkung zur den letzten: die fallen leider auch real aus dem Rahmen.
diese IP Adressen sollen nun der Grundstock für eine dynamische ipchains Blacklist sein. D.h. ich mache ersteinmal folgende:
[..]
{ printf "/sbin/ipchains -A input -j DENY -l -p all\ -s %s/24 -d 192.168.10.10\n", $1 } '
==== #!/usr/bin/gawk -f BEGIN { FS=":"; } /[0-9]-[0-9]/ { split($2, a, "-"); # $2 in untere (a[1]) und obere (a[2]) IP teilen split(a[1], l, "\."); # IP a[1] an den '.' nach l[1] - l[4] teilen split(a[2], h, "\."); # IP a[2] an den '.' nach h[1] - h[4] teilen x = l[1] * 2^24 + l[2] * 2^16 + l[3] * 2^8 + l[4]; # numerische IP y = h[1] * 2^24 + h[2] * 2^16 + h[3] * 2^8 + h[4]; # numerische IP m = y - x; # Differenz der IPs if(m < 0) { exit(1); } # Fehler, wenn 2te IP "kleiner" war mask = 32 - (log(m+1) / log(2)); # IPv4 Netzmaske berechnen print "/sbin/ipchains -A input -j DENY -l -p all -s "a[1]"/"mask; } ==== Das AWK-script passend benennen und ausfuehrbar machen... Eingabe: ==== Beschreibung:123.123.123.0-123.123.123.255 Andere Beschreibung:222.222.0.0-222.222.255.255 nocheine:124.0.0.0-124.0.0.0 nocheine:122.1.1.0-122.1.1.127 ==== Ausgabe (ist die richtig so???): ==== /sbin/ipchains -A input -j DENY -l -p all -s 123.123.123.0/24 /sbin/ipchains -A input -j DENY -l -p all -s 222.222.0.0/16 /sbin/ipchains -A input -j DENY -l -p all -s 124.0.0.0/32 /sbin/ipchains -A input -j DENY -l -p all -s 122.1.1.0/25 ==== Noch Fragen? Allerdings gebe ich zu bedenken, dass du mit der FW den falschen Ansatz verfolgst. Generell gilt IMO: Alles dicht machen, und dann nur das oeffnen, was benoetigt wird. HTH, -dnh --
Programmieren in C++ hält die grauen Zellen am Leben. Es schaerft alle fuenf Sinne: den Schwachsinn, den Bloedsinn, den Wahnsinn, den Unsinn und den Stumpfsinn. [Felix von Leitner und Holger Veit in doc]
Hallo David, On Sun, Jun 08, 2003 at 09:06:40PM +0200, David Haller wrote:
Ausgabe (ist die richtig so???):
==== /sbin/ipchains -A input -j DENY -l -p all -s 124.0.0.0/32
^^^^^^^^^^^^ das ist zwar vom Algorithmus her richtig aber ich denke da ist was anderes damit gemeint. Das werde ich wohl noch austüfteln. Sprich da gehört eine 124.0.0.0/8 hin.
/sbin/ipchains -A input -j DENY -l -p all -s 122.1.1.0/25 ^^^^^^^^^^^^ bei der hätte ich eigentlich eine 122.1.1.0/28 erwartet aber das bekomme ich dann *hoffentlich* auch noch hin.
Noch Fragen?
Nein, wunschlos glücklich. Werde mich jetzt mal daran machen zu *verstehen* was Du da zauberst. ;D
Allerdings gebe ich zu bedenken, dass du mit der FW den falschen Ansatz verfolgst. Generell gilt IMO: Alles dicht machen, und dann nur das oeffnen, was benoetigt wird.
jup, ist richtig. Läuft auch so aber da ich einige Dienste anbiete und weis das gewisse Leute aus gewissen Netzbereichen diese Dienste häufiger missbrauchen als andere bleiben die aussen vor. Ich möchte/kann aber nicht von vornherein einem grossteil der User den Zugriff verwehren. Wiederspricht irgendwie dem Zweck des offenen Informationsaustauschs ;D
--
Programmieren in C++ hält die grauen Zellen am Leben. Es schaerft alle fuenf Sinne: den Schwachsinn, den Bloedsinn, den Wahnsinn, den Unsinn und den Stumpfsinn. [Felix von Leitner und Holger Veit in doc]
.... alles klar :) Danke für die Hilfe und noch schöne Feiertage. Greetings Daniel -- 01010111 01101111 01101111 01101000 01101111 01101111 00100000 00110001 00110000 00110000 00110000 00100000 01010000 01110101 01101110 01101011 01110100 01100101
Hallo, On Sun, 08 Jun 2003, Daniel Lord wrote:
On Sun, Jun 08, 2003 at 09:06:40PM +0200, David Haller wrote:
Ausgabe (ist die richtig so???):
==== /sbin/ipchains -A input -j DENY -l -p all -s 124.0.0.0/32
^^^^^^^^^^^^ das ist zwar vom Algorithmus her richtig aber ich denke da ist was anderes damit gemeint. Das werde ich wohl noch austüfteln. Sprich da gehört eine 124.0.0.0/8 hin.
Nein. Flasche 2te IP:
nocheine:124.0.0.0-124.0.0.0
Du wolltest wohl:
nocheine:124.0.0.0-124.0.0.255
Ansonsten muesstest du das script so aufbohren, dass ein ".0" als
C-Netz erkannt wird, und das widerspricht dem Ansatz mit der (CIDR?)
Angabe von '
/sbin/ipchains -A input -j DENY -l -p all -s 122.1.1.0/25 ^^^^^^^^^^^^ bei der hätte ich eigentlich eine 122.1.1.0/28 erwartet aber das bekomme ich dann *hoffentlich* auch noch hin.
Hm. Mit dem (CIDR?) Kram kenn ich mich ja eigentlich auch nicht aus, aber "122.1.1.0-122.1.1.127" sind doch die "Ausgangs IP" plus 0 bis 7 gesetzte bits... Bzw. anders gesagt: die ersten 25 bit der IPs.
Noch Fragen?
Nein, wunschlos glücklich. Werde mich jetzt mal daran machen zu *verstehen* was Du da zauberst. ;D
*g* Im Prinzip ganz einfach. Ich wandle die IPs in 32bit Integer, bilde deren Differenz (also die nicht gesetzten Bits). Dann rechne ich die Differenz in Bits um '(log(m+1) / log(2))'[1] und ziehe diese Bitzahl von den 32 moeglichen Bits ab und erhalte damit also die gesetzten Bits. Das awk-script funktioniert aber sowieso nur mit "glatten" IP-Bereichen, d.h. die sich "glatt" auf eine (CIDR?) "/bits" Netzmaske umsetzen lassen. Man sollte also wohl pruefen, ob "mask" ganzzahlig ist: mask = ... if( mask != int(mask) ) { exit(1); } oder sowas aehnliches ;)
Allerdings gebe ich zu bedenken, dass du mit der FW den falschen Ansatz verfolgst. Generell gilt IMO: Alles dicht machen, und dann nur das oeffnen, was benoetigt wird.
jup, ist richtig. Läuft auch so aber da ich einige Dienste anbiete und weis das gewisse Leute aus gewissen Netzbereichen diese Dienste häufiger missbrauchen als andere bleiben die aussen vor. Ich möchte/kann aber nicht von vornherein einem grossteil der User den Zugriff verwehren. Wiederspricht irgendwie dem Zweck des offenen Informationsaustauschs ;D
Achso, verstehe. Das wiederum ist IMO sinnvoll ;) -dnh [1] log(x) (sollte 'ln' heissen) liefert den natuerlichen Logarithmus von x, durch das '/log(2)' wird das nun auf die Basis 2 umgerechnet, d.h. man erhaelt log_2(x), also das y, das man bei '2^y = x' verwendet... Nochmal genauer: mask = (ln(m+1) / ln(2)) = log_2(m+1) <=> m+1 = 2^(mask) Da kommt dann eben die Frage ins Spiel, wie die (CIDR?) Netzmasken berechnet/definiert werden... Ein "normales" Class-C Netz (z.B. 10.0.0.0 - 10.0.0.255) entspricht einem /24, also 10.0.0.0/24 AFAIK... Vielleicht kann hier ja jemand nochmal das (CIDR) Zeug erklaeren, dann kann man das script wohl noch verbessern ;) -- "And 1.1.81 is officially BugFree(tm), so if you receive any bug-reports on it, you know they are just evil lies." -- Linus Torvalds
participants (2)
-
Daniel Lord
-
David Haller