web-dev-qa-db-fra.com

répertorier toutes les tables de routage

J'ai besoin de savoir comment répertorier les ID de toutes les tables de routage. Par exemple, je peux exécuter:

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

Un appel à ip rule list montre:

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

Et un appel à ip route show table 104 montre:

default via 192.168.3.7 dev eth0

Si j'appelle alors ip rule del table 104, un appel ultérieur à ip rule list montre:

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

Cependant, un appel à ip route show table 104 montre toujours:

default via 192.168.3.7 dev eth0

Je sais que je peux vider la table en utilisant ip route flush table 104. Je voudrais pouvoir vider toutes les tables qui ne sont pas local, main et default. Je veux donc pouvoir lister les tables existantes.

J'ai vu des gens utiliser cat /etc/iproute2/rt_tables, mais cela ne produit que:

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

Que puis-je faire pour obtenir tous les noms de table qui existent actuellement? Merci d'avance!

13
nic

Il existe un moyen de répertorier toutes les entrées de routage de toutes les tables. ip route show table all

À l'aide de la magie de la tuyauterie Shell, vous pouvez extraire tous les noms et ID de table comme ceci:

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

ou

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

Si vous ne vous souciez que des noms de table numériques, ajoutez un filtrage grep:

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

ou

ip route show table all | grep -Po 'table \K[^\s]+' | sort -u | grep -e "[0-9]"
19
nic

Que puis-je faire pour obtenir tous les noms de table qui existent actuellement?

Le fichier /etc/iproute2/rt_tables est la seule source de table names sur le système. En interne, les tables de routage ont des identifiants entiers.

Le reste de votre question est un peu déroutant. Si une table n'est pas référencée par une règle, elle est effectivement "supprimée" car elle n'a aucun impact sur le routage du système. Vous pouvez donc lister toutes les tables de routage actives comme ceci:

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

Cela recherche toutes les actions lookup dans les règles de routage et imprime la cible.

Il semble que la table de routage soit identifiée par un entier 64 bits. Si vous vouliez vraiment, vraiment trouver toutes les tables de routage avec des règles, même celles inactives qui n'ont aucun impact sur votre système, vous pouvez simplement itérer une boucle de 1 à 2 ^ 64:

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

... mais cela prendra une éternité, car 64 bits couvrent beaucoup d'espace.

5
larsks
(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

Gratitude pour ce fil conduisant à ce combo qui montre toutes les tables de routage qui contiennent actuellement des routes, qui sont référencées par des règles, et qui sont nommées, avec un 3 à côté de chaque table qui a du contenu, est référencé et est nommé ou un 2 ou 1 si une ou deux des trois conditions s'appliquent.

4
Royal Administrator