listar todas as tabelas de rotas

3

Eu preciso saber como listar os IDs de todas as tabelas de rotas. Por exemplo, posso executar:

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

Uma chamada para ip rule list mostra:

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

E uma chamada para ip route show table 104 mostra:

default via 192.168.3.7 dev eth0

Se eu chamar o ip rule del table 104 , uma chamada subseqüente para ip rule list mostrará:

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

No entanto, uma chamada para ip route show table 104 ainda mostra:

default via 192.168.3.7 dev eth0

Eu sei que posso liberar a tabela usando ip route flush table 104 . Gostaria de liberar todas as tabelas que não são local , main e default . Assim, quero poder listar as tabelas existentes.

Eu vi pessoas usarem cat /etc/iproute2/rt_tables , mas isso só produz:

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

O que posso fazer para obter todos os nomes de tabelas existentes atualmente? Obrigado antecipadamente!

    
por nic 08.08.2014 / 01:20

3 respostas

10

Existe uma maneira de listar todas as entradas de roteamento de todas as tabelas. ip route show table all

Usando alguma mágica de shell, você pode extrair todos os nomes de tabelas e IDs assim:

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

ou

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

Se você se importa apenas com os nomes das tabelas numéricas, adicione alguns filtros grep:

ip route show table all | grep "table" | sed 's/.*\(table.*\)//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]"
    
por 08.08.2014 / 18:26
4

What can I do to get all the table names that currently exist?

O arquivo /etc/iproute2/rt_tables é a única fonte de tabela nomes no sistema. Internamente, as tabelas de roteamento têm identificadores inteiros.

O resto da sua pergunta é um pouco confuso. Se uma tabela não for referenciada por uma regra, ela será efetivamente "excluída" porque não terá impacto no roteamento do sistema. Então você pode listar todas as tabelas de roteamento ativas como esta:

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

Isso procura toda a ação lookup nas regras de roteamento e imprime o alvo.

Parece que a tabela de roteamento é identificada por um inteiro de 64 bits. Se você realmente queria encontrar todas as tabelas de roteamento com regras, mesmo as inativas que não causam impacto em seu sistema, você poderia simplesmente iterar um loop de 1 a 2 ^ 64:

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

... mas isso vai durar para sempre, porque 64 bits cobre muito espaço.

    
por 08.08.2014 / 03:55
2
(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.*\)//g' | awk '{if($0 ~ /table/) print $2; else print "main";}' | sort -u) | sort | uniq -c

Gratidão por este encadeamento que leva a essa combinação que mostra todas as tabelas de roteamento que atualmente contêm rotas, que são referenciadas por regras e que são nomeadas, com um 3 ao lado de cada tabela que tenha conteúdo, seja referenciado e seja nomeado ou 2 ou 1 se uma ou duas das três condições se aplicarem.

    
por 22.09.2016 / 19:48