Ipset ipv6 aus Datei setzen

Ich weiß nicht, ob dies ein Bug ist oder nicht! Ich verwende die gleichen Scripte für IPv4 über lange Zeit und dort funktionieren diese einwandfrei. Angepaßt auf IPv6 solle eine Setzen von IPv6s in einer Sperrliste eigentlich ähnlich möglich sein, aber daß funktioniert überhaupt nicht.

Die Kombination in den Beispielen 9999:9999 ist eine faked IP wegen der Sicherheit!

Das data file (all2_ipv6.txt):

2001:9999:9999:b07::759
2001:9999:9999:b07::760
2001:9999:9999:b07::761

Das Script:

#!/bin/sh

#remarked about security:

# IPv6:
#ipset -exist create blocklist_all-v6 hash:net family inet6
#ipset -exist create blocklist_all-build-v6 hash:net family inet6

#while read host
#do
#echo "HOST: $host"
#ipset add blocklist_all-build-v6 $host
#done < all2_ipv6.txt

#ipset swap blocklist_all-build-v6 blocklist_all-v6
#ipset destroy blocklist_all-build-v6

Die Fehlermeldung im Output:

HOST: 2001:9999:9999:b07::759
' to an IPv6 address: Name or service not known01:9999:9999:b07::759
: resolving to IPv6 address failedd9:9999:b07::759

Ein-Test-Script mit manuellem Setting dagegen funktioniert:

#!/bin/sh

#remarked about security:

#ipset add blocklist_all-build-v6 2001:9999:9999:b07::759
#ipset add blocklist_all-build-v6 2001:9999:9999:b07::760
#ipset add blocklist_all-build-v6 2001:9999:9999:b07::761

Kann jemand helfen?

Komisch, dass überhaupt irgendwas funktioniert, wo doch alles (fast) auskommentiert ist.

hast Du auch schon ein Betriebssystem installiert?

Und Du könntest mal in einer Zeile versuchen, das letzte Zeichen 7 Stellen nach vorne zu verschieben. Wird zwar eh nichts bringen, weil die auskommentiert wurde, aber ich meine ja nur mal so …

Ich dachte, dafür installierst Du Kasperksy? …

Hallo!

Kannst du einmal deine Ausgabe posten, wenn du dein Skript mit dem Parameter -x ausführst? Also so:

$ sh -x meinScript.sh

mfg
christoph

Hallo Christoph,

also bei den IPv4 sieht es ganz normal aus. Bei den IPv6 dann fehlerhaft! Ich habe nur die letzten Zeilen mal aus dem Output angehängt: - Die IPs habe ich aus Sicherheitsgründen verwandelt (*)

+ ipset add blocklist_all-build 223.*.189.148/32
+ read host
+ ipset add blocklist_all-build 223.*.242.90/32
+ read host
+ ipset add blocklist_all-build 223.*.32.73/32
+ read host
+ ipset swap blocklist_all-build blocklist_all
+ ipset destroy blocklist_all-build
+ ipset -exist create blocklist_all-v6 hash:net family inet6
+ ipset -exist create blocklist_all-build-v6 hash:net family inet6
+ read host
' echo 'HOST: 2001:41d0:1004:***::759
HOST: 2001:41d0:1004:***::759
+ ipset add blocklist_all-build-v6 $'2001:41d0:1004:***::759\r'
' to an IPv6 address: Name or service not known01:41d0:1004:***::759
: resolving to IPv6 address failedd0:1004:***::759
+ read host
' echo 'HOST:
HOST:
+ ipset add blocklist_all-build-v6 $'\r'
' to an IPv6 address: Name or service not known
: resolving to IPv6 address failed
+ read host
+ ipset swap blocklist_all-build-v6 blocklist_all-v6
+ ipset destroy blocklist_all-build-v6

Was hier auffällig ist, daß Linux Debian ein $’ einfügt und eine \r und dann aber anschließend $'20
offensichtlich als ASCII-Zeichen interpretiert!

Hier noch mal die Script-Zeilen:

while read host
do
echo "HOST: $host"
ipset add blocklist_all-build-v6 $host
done < $SCRIPTPATH/all2_ipv6.txt

In der all2_ipv6.txt steht nur diese Zeile wie folgt drin:

2001:41d0:1004:***::759

Eine leere Host-Zeile muß noch raus - war eine Leerzeile am Ende noch in der Liste der IPv6 !
Man sieht, daß der Echo funktioniert! Daß mit dem $’\r’ war nur die Leerzeile. Ich füge daher noch mal das Ergebnis an, jetzt sogar mit einem Leerzeichen in den Anführungszeichen:

+ ipset add blocklist_all-build 223.*.242.90/32
+ read host
+ ipset add blocklist_all-build 223.*.32.73/32
+ read host
+ ipset swap blocklist_all-build blocklist_all
+ ipset destroy blocklist_all-build
+ ipset -exist create blocklist_all-v6 hash:net family inet6
+ ipset -exist create blocklist_all-build-v6 hash:net family inet6
+ read host
' echo 'HOST: 2001:41d0:1004:***::759
HOST: 2001:41d0:1004:***::759
' ipset add blocklist_all-build-v6 ' 2001:41d0:1004:***::759
' to an IPv6 address: Name or service not known001:41d0:1004:***::759
: resolving to IPv6 address failed1d0:1004:***::759
+ read host
+ ipset swap blocklist_all-build-v6 blocklist_all-v6
+ ipset destroy blocklist_all-build-v6
root@pm4-host:~/scripte/blocklist.de$

Also warum wird bei ipset aus einer Variablen der Inhalt dieser verändert und eine IP-Auflösung probiert?

Hallo!

Fehlt dir vielleicht da ein Strichpunkt am Ende des do-Blocks?

while read host
do
echo „HOST: $host“
ipset add blocklist_all-build-v6 $host;
done < $SCRIPTPATH/all2_ipv6.txt

Habe ich auch probiert mit ; hinter $host und nicht in Anführungszeichen, aber bringt auch nichts!
Auch nicht, wenn die IPv6 als volle IPv6 umgewandelt wurde:
Statt **** steht z.B. 1234 oder 01ab drin

+ read host
' echo 'HOST: 2001:41d0:1004:****:0000:0000:0000:0759
HOST: 2001:41d0:1004:****:0000:0000:0000:0759
+ ipset add blocklist_all-build-v6 $'2001:41d0:1004:****:0000:0000:0000:0759\r'
' to an IPv6 address: Name or service not known01:41d0:1004:****:0000:0000:0000:0759
: resolving to IPv6 address failedd0:1004:****:0000:0000:0000:0759
+ read host

Es muß also irgendwo an dem ipset liegen, daß die Variable verändert, denn im Echo wird die Variable sauber aufgelöst! Die $’ und \r’ werden eingefügt und dann wird beim Prüfen der IPv6 die 20 vorne entfernt, also gehe ich davon aus, daß die ersten 2 Stellen der IPv6 dabei in ein ASCII - Zeichen gewandelt werden

Hallo!

Sehr eigenartig. So sieht es bei mir aus:

while read host
do
echo „HOST: $host“
ipset add blocklist_all-build-v6 $host
done < v6.txt

Ausgabe natürlich anders, da ich hier kein ipset habe. Aber die von der bash aufgelösten Zeilen schauen gut aus:

$ sh -x six

  • read host
  • echo ‚HOST: 2001:9999:9999:b07::759‘
    HOST: 2001:9999:9999:b07::759
  • ipset add blocklist_all-build-v6 2001:9999:9999:b07::759
    six: Zeile 6: ipset: Kommando nicht gefunden.
  • read host
  • echo ‚HOST: 2001:9999:9999:b07::760‘
    HOST: 2001:9999:9999:b07::760
  • ipset add blocklist_all-build-v6 2001:9999:9999:b07::760
    six: Zeile 6: ipset: Kommando nicht gefunden.
  • read host
  • echo ‚HOST: 2001:9999:9999:b07::761‘
    HOST: 2001:9999:9999:b07::761
  • ipset add blocklist_all-build-v6 2001:9999:9999:b07::761
    six: Zeile 6: ipset: Kommando nicht gefunden.
  • read host

Was mir noch aufgefallen ist: Wurde deine Textdatei auf einem Windows-System erstellt? Ich tippe darauf, da bei deiner Ausgabe das Zeichen „\r“ (Carriage return) auftaucht.

mfg
christoph

Hallo Christoph,

danke für Deine Hilfe! Ich habe eine Lösung gefunden, die mit IPv6 funktioniert!

Hierbei muß via Script eine Textdatei im Format einer ipset save Liste erzeugt werden,
die dann mit ipset restore < ipset-save.liste eingelesen wird!

Weil Du dei Variable innerhalb der Anführungszeichen hast. Habe ich Dir schonmal geschrieben

Nunja …

echo "HOST:"  $host

hätte wohl funktioniert. Und die spannende Frage ist: wie kommen die Daten in die Datei all2_ipv6.txt?

Wie schon geschrieben, ist es egal, ob bei ipset die Variable $host in Anführungszeichen gesetzt ist oder nicht und in meiner Anwort vom 27.07.2016 - 13:42 Uhr ist diese Variante so aufgeführt! Mit einfachen ’ wird die Variable nicht aufgelöst! Also alles probiert! Bei der IPv4 - Variante funktioniert das Script sauber - es ist im Prinzip dort der gleiche Weg und auf dem gleichen Weg werden auch die notwendigen Text-Dateien erzeugt! Aber selbst wenn diese über den VI in Linux erzeugt werden, ändern sich nichts daran, daß ipset hier einen Fehler macht!

Die andere Variante mit einem Restore zu arbeiten, funktioniert dabei korrekt und sauber!

Danke für Deine Mithilfe