Qual é a maneira portátil de obter o endereço de origem da rota padrão?

5

Eu preciso do endereço IP usado como origem dos pacotes enviados via default route . (EDIT) Por favor, note que estou me referindo à rota default , aquela marcada como default em ip r (veja no final a rota real que os pacotes tomarão sob minha configuração de VPN).

Minha primeira ideia foi usar ip r e deduzir isso de lá:

# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev enxb827eb4297a4 src 10.237.77.206 metric 202
10.0.2.0/24 dev tun0 proto kernel scope link src 10.0.2.100
10.81.102.133 via 10.237.76.1 dev enxb827eb4297a4
10.237.76.0/22 dev enxb827eb4297a4 proto kernel scope link src 10.237.77.206 metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0

Parecia bom, um ip r | grep default | cut -d" " -f7 me deu o esperado 10.237.77.206 .

Então, em outro sistema (ambos são derivados do Debian) eu consegui

# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev eth0  metric 202
10.0.2.0/24 dev tun0  proto kernel  scope link  src 10.0.2.5
10.81.102.133 via 10.237.76.1 dev eth0
10.237.76.0/22 dev eth0  proto kernel  scope link  src 10.237.76.56  metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0

Aqui a solução não é tão simples: eu preciso extrair o IP de rota padrão ( 10.237.76.1 ), combiná-lo com a rota apropriada ( 10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202 ) que esperançosamente incluirá o src .

Em última análise, o corte da saída de ip não reterá água no termo lng (alterações na saída, variações na saída entre distros ou versões, ...)

Existe uma maneira mais portátil de obter esse IP?

Por "portáteis" quero dizer:

  • idealmente "funciona em qualquer Linux"
  • menos ideal mas ainda bom "funciona no Debian e seus derivados"

Observe que o dispositivo está em uma VPN exclusiva, portanto não posso analisar diretamente a rota real que o pacote tomará quando a VPN estiver ativa (ou seja, na maioria das vezes): a rota default é mascarada por outras duas rotas, que efetivamente cobrem toda a faixa de IP. Por favor, corrija-me se estou enganado aqui.

    
por WoJ 12.02.2018 / 17:59

3 respostas

7

Você pode escolher um endereço arbitrário que, na sua opinião, será sempre acessado por meio da rota padrão, por exemplo, DNS do Google, e imprimir o endereço de origem da rota :

ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'
    
por 12.02.2018 / 18:35
7

Para mostrar seu endereço de origem da rota padrão:

ip route get 8.8.8.8  | awk ' /^[0-9]/ { print $7 }'  
  • O { print $7 } está selecionando o sétimo campo da ip... output;
  • O ^[0-9] está selecionando linhas que começam com um número, pois ip gera duas linhas para escolher a linha correta.

Nota: Eu prefiro esta primeira solução, porém mostrando outras alternativas para mostrar alternativas.

Ou:

ip route get 8.8.8.8 |  cut -f7 -d" " | grep '^[0-9]'

Novamente:

  • o cut seleciona o sétimo campo;

Ou:

 ip route get 8.8.8.8 | grep ^[0-9] |  cut -f7 -d" " 

Ou:

ip route get 8.8.8.8 | fgrep src |  cut -f7 -d" "

Ou também:

 ip route get 8.8.8.8 | awk ' /src/ { print $7 }' 

Para esclarecer um pouco, aqui está a saída de ip :

$  ip route get 8.8.8.8 
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.249 
   cache  

Existem vários métodos para obter a rota padrão no Linux, via ip , procfs ou netstat . netstat está se tornando obsoleto e IMO, ip é uma opção melhor que está presente em qualquer distribuição recente do Linux.

    
por 12.02.2018 / 18:16
0

Com base na intenção real (encontrar o IP de saída original) e nas respostas feitas, aqui está um one-liner (bastante longo) que deve fazer o seguinte:

ip route get 8.8.8.8 oif $(ip route | sed -n '/^default/s/^.* dev \([^ ][^ ]*\) *.*$//p')  | sed -n 's/^.* src \([^ ][^ ]*\) *.*$//p'

1º passo dentro de $() : obter a rota padrão, recuperar somente sua interface após a palavra-chave dev (porque dependendo das condições que possam depender ou não da distribuição, a rota será ou não ganha t mostra o ip de origem nesta etapa)

2º passo: obter uma rota para um endereço IP público "conhecido" que não deve ter nenhuma configuração de rota especial para adulterá-lo, mas pedindo para usar a interface recuperada anterior, pedindo ao kernel para usar a rota padrão original real enterrado sob 0.0.0.0/1 e 128.0.0.0/1 para fazer o calc. Recupere o IP após a palavra-chave src

    
por 16.02.2018 / 23:50