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!
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]"
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.
(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.