Listen Sie alle Routentabellen auf

14

Ich muss wissen, wie man die IDs aller Routentabellen auflistet. Zum Beispiel kann ich ausführen:

ip rule add fwmark 2 table 104
ip route add dev eth0 default via 192.168.3.7 table 104

Ein Aufruf zu ip rule listzeigt:

0:  from all lookup local 
32765:  from all fwmark 0x2 lookup 104 
32766:  from all lookup main 
32767:  from all lookup default

Und ein Aufruf zu ip route show table 104Shows:

default via 192.168.3.7 dev eth0

Wenn ich dann anrufe ip rule del table 104, zeigt ein nachfolgender Anruf an ip rule list:

0:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default

Ein Aufruf von ip route show table 104zeigt jedoch immer noch:

default via 192.168.3.7 dev eth0

Ich weiß, dass ich den Tisch mit spülen kann ip route flush table 104. Ich möchte in der Lage sein, alle Tabellen zu leeren, die nicht localsind main, und default. Daher möchte ich die vorhandenen Tabellen auflisten können.

Ich habe gesehen, wie Leute es benutzen cat /etc/iproute2/rt_tables, aber das erzeugt nur:

#
# reserved values
#
255 local
254 main
253 default
0   unspec
#
# local
#
#1  inr.ruhep

Was kann ich tun, um alle derzeit vorhandenen Tabellennamen abzurufen? Danke im Voraus!

schön
quelle

Antworten:

20

Es gibt eine Möglichkeit, alle Routing-Einträge aller Tabellen aufzulisten. ip route show table all

Mit etwas Shell-Piping-Magie können Sie alle Tabellennamen und IDs wie folgt extrahieren:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq

oder

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u

Wenn Sie sich nur für die numerischen Tabellennamen interessieren, fügen Sie eine Grep-Filterung hinzu:

ip route show table all | grep "table" | sed 's/.*\(table.*\)/\1/g' | awk '{print $2}' | sort | uniq | grep -e "[0-9]"

oder

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]"
schön
quelle
5

Was kann ich tun, um alle derzeit vorhandenen Tabellennamen abzurufen?

Die Datei /etc/iproute2/rt_tablesist die einzige Quelle der Tabellennamen auf dem System. Intern haben Routing-Tabellen ganzzahlige Bezeichner.

Der Rest Ihrer Frage ist etwas verwirrend. Wenn eine Tabelle nicht von einer Regel referenziert wird, wird sie effektiv "gelöscht", da sie keine Auswirkungen auf das Routing des Systems hat. So können Sie alle aktiven Routing-Tabellen wie folgt auflisten:

ip rule list | awk '/lookup/ {print $NF}'

Das sucht nach allen lookupAktionen in den Routing-Regeln und druckt das Ziel.

Es sieht so aus, als würden Routing-Tabellen durch eine 64-Bit-Ganzzahl identifiziert. Wenn Sie wirklich, wirklich alle Routing-Tabellen mit Regeln finden möchten, auch die inaktiven, die keine Auswirkungen auf Ihr System haben, können Sie einfach eine Schleife von 1 bis 2 ^ 64 iterieren:

seq 0 $(echo '2 64 ^ p' | dc) | xargs -iTABLE sh -c 'echo === TABLE ===; ip route show table TABLE'

... aber das wird ewig dauern, denn 64 Bit decken viel Platz ab.

Larsks
quelle
Eine nicht mit der Regel korrelierte Tabelle wird zwar nicht verwendet, bedeutet jedoch nicht, dass sie "gelöscht" wird. Es verbraucht immer noch Systemressourcen. Und ja, das Durchlaufen von 2 ^ 64 Werten ist verrückt!
Nic
4
(egrep '^\s*[0-9]' /etc/iproute2/rt_tables | awk '{print $2}' | sort -u; ip rule list | awk '/lookup/ {print $NF}' | sort -u; ip route show table all | sed 's/.*\(table.*\)/\1/g' | awk '{if($0 ~ /table/) print $2; else print "main";}' | sort -u) | sort | uniq -c

Dankbarkeit für diesen Thread, der zu dieser Kombination führt, die alle Routingtabellen anzeigt, die derzeit Routen enthalten, auf die durch Regeln verwiesen wird und die benannt sind, wobei eine 3 neben jeder Tabelle mit Inhalt referenziert und benannt wird oder eine 2 oder eine 1, wenn eine oder zwei der drei Bedingungen zutreffen.

Königlicher Administrator
quelle