Hallo,
ich hab das Problem, daß auf dem IPCop die IPsec-Verbindungen nach Verbindungsproblemen nicht wieder neu aufgebaut werden. "Dead Peer Detection" ist zwar eingeschaltet, funktioniert aber nicht richtig. Für einen Workaround bin ich inzwischen soweit gekommen, daß ich mit
ipsec eroute | grep -v tun | awk '{print $4}' | awk -F / '{print $1}'
die fehlerhafte Verbindung identifiziere und die IP(s) der Gegenstelle(n) (rightsubnet ohne netmask) als Ergebnis erhalte. für die 2 awk-Aufrufe gibt es bestimmt auch hier eine bessere Lösung.
# ipsec eroute 362 192.168.0.0/24:0 -> 192.168.20.0/24:0 => tun0x1006@... 36 192.168.0.0/24:0 -> 10.129.4.128/25:0 => %trap ^^^^^^^^^^^^ Die 1. Verbindung steht, die 2. nicht mehr.
Damit kann ich mir aus der config wiederum die zugehörige Connection-ID holen.
Config-Schema: ConnID,aktiv,ConnName,...,rightsubnet,... 1,off,VPN-A,...,10.129.4.128/255.255.255.128,... 2,on,VPN-A2,...,10.129.4.128/255.255.255.128,... 4,on,VPN-B,...,192.168.20.0/255.255.255.0,...
Ich benötige hier demzufolge die Zeile 2, da Zeile 1 eine alte deaktivierte Config ist. Ein grep auf on kommt nicht in Frage, da es noch mehr on/off-Felder in den Zeilen gibt und u.U. auch in ConnName vorkommen könnte. Ein grep auf die IP möchte ich ebenfalls vermeiden, da es auch hier zu unerwünschten Nebeneffekten kommen kann. awk scheint hier erst recht das Mittel der Wahl zu sein:
for CONN in $FAILCONN; do awk -F , '($2 == "on") {printf "%s %s %s\n", $1, $3, $13}' $CONFIG done
ergibt pro fehlender Verbindung ($13 ist rightsubnet): 2 VPN-A2 10.129.4.128/255.255.255.128 4 VPN-B 192.168.20.0/255.255.255.0
Als Rückgabewert braucht ich lediglich $3 für logger bzw. $1 für den Neustart der Verbindung. $13 wird nur zum Vergleich benötigt.
Wie kann ich das jetzt in dem awk-Aufruf noch mit der IP 10.129.4.128 vergleichen? Ich bräuchte innerhalb der Bedingung so etwas wie: ($2 == "on" && $CONN == ( awk -F / '{print $1}' $13 ) )
Kann mir hier jemand auf die Sprünge helfen?
Gruß Rico
----- Ursprüngliche Mail ----
Von: Rico Koerner rico@netbreaker.de An: Linux-User-Group Dresden lug-dd@mailman.schlittermann.de Gesendet: Freitag, den 9. Juli 2010, 18:44:25 Uhr Betreff: awk-Rätsel
Hallo,
ich hab das Problem, daß auf dem IPCop die IPsec-Verbindungen nach Verbindungsproblemen nicht wieder neu aufgebaut werden. "Dead Peer Detection" ist zwar eingeschaltet, funktioniert aber nicht richtig. Für einen Workaround bin ich inzwischen soweit gekommen, daß ich mit
ipsec eroute | grep -v tun | awk '{print $4}' | awk -F / '{print $1}'
die fehlerhafte Verbindung identifiziere und die IP(s) der Gegenstelle(n) (rightsubnet ohne netmask) als Ergebnis erhalte. für die 2 awk-Aufrufe gibt es bestimmt auch hier eine bessere Lösung.
# ipsec eroute 362 192.168.0.0/24:0 -> 192.168.20.0/24:0 => tun0x1006@... 36 192.168.0.0/24:0 -> 10.129.4.128/25:0 => %trap ^^^^^^^^^^^^ Die 1. Verbindung steht, die 2. nicht mehr.
Damit kann ich mir aus der config wiederum die zugehörige Connection-ID holen.
Config-Schema: ConnID,aktiv,ConnName,...,rightsubnet,... 1,off,VPN-A,...,10.129.4.128/255.255.255.128,... 2,on,VPN-A2,...,10.129.4.128/255.255.255.128,... 4,on,VPN-B,...,192.168.20.0/255.255.255.0,...
Ich benötige hier demzufolge die Zeile 2, da Zeile 1 eine alte deaktivierte Config ist. Ein grep auf on kommt nicht in Frage, da es noch mehr on/off-Felder in den Zeilen gibt und u.U. auch in ConnName vorkommen könnte. Ein grep auf die IP möchte ich ebenfalls vermeiden, da es auch hier zu unerwünschten Nebeneffekten kommen kann. awk scheint hier erst recht das Mittel der Wahl zu sein:
for CONN in $FAILCONN; do awk -F , '($2 == "on") {printf "%s %s %s\n", $1, $3, $13}' $CONFIG done
ergibt pro fehlender Verbindung ($13 ist rightsubnet): 2 VPN-A2 10.129.4.128/255.255.255.128 4 VPN-B 192.168.20.0/255.255.255.0
Als Rückgabewert braucht ich lediglich $3 für logger bzw. $1 für den Neustart der Verbindung. $13 wird nur zum Vergleich benötigt.
Wie kann ich das jetzt in dem awk-Aufruf noch mit der IP 10.129.4.128 vergleichen? Ich bräuchte innerhalb der Bedingung so etwas wie: ($2 == "on" && $CONN == ( awk -F / '{print $1}' $13 ) )
Kann mir hier jemand auf die Sprünge helfen?
Also du willst prüfen ob in die Variablen CONN in der Spalte 13 enthalten ist?
$13~"'$CONN'"
kannst jetzt auch noch reguläre ausdrücke bemühen
$13 ~/^'$CONN'/
hoffe habe verstanden was du wolltest
ansonsten frag noch mal nach
andreas
Gruß Rico
Hallo!
Am Freitag 09 Juli 2010 schrieb Rico Koerner:
for CONN in $FAILCONN; do awk -F , '($2 == "on") {printf "%s %s %s\n", $1, $3, $13}' $CONFIG done
ergibt pro fehlender Verbindung ($13 ist rightsubnet): 2 VPN-A2 10.129.4.128/255.255.255.128 4 VPN-B 192.168.20.0/255.255.255.0
Als Rückgabewert braucht ich lediglich $3 für logger bzw. $1 für den Neustart der Verbindung. $13 wird nur zum Vergleich benötigt.
Wie kann ich das jetzt in dem awk-Aufruf noch mit der IP 10.129.4.128 vergleichen? Ich bräuchte innerhalb der Bedingung so etwas wie: ($2 == "on" && $CONN == ( awk -F / '{print $1}' $13 ) )
Mein erster Vorschlag: Auf die erzeugte Datei mit der Ausgabe von awk noch mal grep anzuwenden (also grep '10.129.4.128' $file ...)
Der andere: awk kann Variablen mitnehmen, wenn man das deklariert. awk -F, -v conn=$CONN ... Dann lässt sich der Vergleich so etwa durchziehen, wie du es beschrieben hast.
Gruss Reiner
Am 13.07.2010 06:40, schrieb Reiner Klaproth:
Hallo!
Mein erster Vorschlag: Auf die erzeugte Datei mit der Ausgabe von awk noch mal grep anzuwenden (also grep '10.129.4.128' $file ...)
grep hatte ich verworfen, weil es u.U. fehlerhaft auf z.B. 192.168.0.10 zutreffen könnte, wenn nach 192.168.0.1 gesucht wird und auf das Suchmuster bei der in der config ebenfalls vorhandenen Source-IP treffen könnte. Denkfehler meinerseits war, daß ich die gesuchte IP ja auch mit einem / abschließen könnte, der ja auf jeden Fall folgt. Das Problem mit der Src-IP hätte sich mit der richtigen Reihenfolge gelöst.
Der Ansatz von Grimnin ist natürlich eleganter und etwa das von mir gesuchte. Der Suchbegriff wurde mit ihm zum LUG-Treffen noch um den / vervollständigt und damit war die Lösung komplett.
ID=$( awk -F , '($2 == "on" && $13 ~/^'$CONN'//) {print $1}' $CONFIG )
liefert mir jetzt die gewünschte Information.
Für eine Suche mit grep wäre dagegen folgendes nötig gewesen: ID=$( awk -F , '($2 == "on") {printf "%s %s\n" $1, $13}' $CONFIG | \ grep "$CONN/" | awk '{print $1}' )
Der andere: awk kann Variablen mitnehmen, wenn man das deklariert. awk -F, -v conn=$CONN ... Dann lässt sich der Vergleich so etwa durchziehen, wie du es beschrieben hast.
Interessante Möglichkeit, aber diese verschachtelten awk-Aufrufe wollte ich nicht wirklich haben ;-) Ich hatte nur die awk-Beispielskripte nicht verstanden, in denen mehrere awk-Befehle nacheinander abgearbeitet werden.
Dummerweise hat sich nach 2 Tagen Einsatz gezeigt, daß nicht grundsätzlich nur die bei 'ipsec eroute' gelisteten [HOLD|TRAP]-Verbindungen (also !=tun*) betroffen sind, sondern manchmal zur betroffenen Verbindung kein Eintrag mehr vorhanden ist oder (30 min) nach einer Zwangstrennung + neue DynIP immer noch "=> tun0x1004@<OLD_IP>:0" drin steht.
Dead Peer Detection funktioniert hier anscheinend überhaupt nicht.
Aber jetzt bin ich wenigstens wieder um einiges schlauer. :-)
Gruß Rico
lug-dd@mailman.schlittermann.de