traceroute com seleção explícita de gateway

2

Eu tenho um roteador (rodando o Linux) que está conectado a dois ISPs, as rotas são selecionadas usando o BGP, no entanto, eu gostaria de fazer ping / rastrear cada conexão separadamente.

O comando traceroute padrão parece ser capaz de fazer isso (permite a seleção da interface de saída, IP de origem), mas não permite a seleção do gateway. Embora exista uma opção de linha de comando (-g), tudo o que ela faz é definir a opção de roteamento IP em vez de apenas enviar o pacote para lá.

Aqui está o que eu quero: Digamos que meu roteador tenha dois IPs - 10.0.0.1 (dados pelo primeiro ISP), 10.1.0.1 (dados pelo segundo ISP). O gateway padrão (próximo salto) no primeiro ISP é 10.0.0.254 e no segundo é 10.1.0.254. Um deles é selecionado como o gateway padrão atual (por BGP), mas eu também quero poder usar o rastreamento / ping através do outro gateway. Não consigo alterar a tabela de roteamento (sem causar interrupções de conexão, especialmente se o outro ISP tiver um problema).

traceroute_oth --nexthop 10.0.0.254 8.8.8.8 deve dar

1 10.0.0.254
2 some-iother-ip.first-isp.com
...
x 8.8.8.8

traceroute_oth --nexthop 10.1.0.254 8.8.8.8 deve dar

1 10.1.0.254
2 some-ip.second-isp.com
...
x 8.8.8.8

EDIT: "traceroute -i" não funciona porque o roteador não conhece o outro gateway. Basicamente, a tabela de roteamento é esta (simplificada):

0.0.0.0/0 gw 10.0.0.254 eth0

Não há como o programa saber qual é o gateway padrão na eth1 (link para o outro ISP) sem que eu o especifique explicitamente.

    
por Pentium100 15.07.2013 / 09:48

4 respostas

6

Você leu a página man, certo?

   -i interface, --interface=interface
          Specifies  the  interface  through  which traceroute should send
          packets. By default, the interface is selected according to  the
          routing table.
    
por 15.07.2013 / 09:51
2

Eu tive o mesmo problema, mas felizmente consegui corrigi-lo.

Em um computador multihomed, apenas um gateway padrão pode ser definido, independentemente do número de interfaces presentes. Se você tentar traceroute para um host que não esteja na mesma sub-rede da interface que você está especificando com o sinal -i , o traceroute falhará devido à ausência de gateway (supondo que você não tenha a sorte de usar o host interface que tem um gateway padrão definido).

A solução para isso é definir tabelas de roteamento adicionais para cada interface "extra" em sua máquina

Um guia detalhado pode ser encontrado neste link.

Em Resumo, se você tiver duas interfaces com características:

Interface A: IP: 10.0.0.10    subnet: 255.255.255.0 Gateway 10.0.0.1
Interface B: IP: 192.168.0.10 subnet: 255.255.255.0 Gateway 192.168.0.1

e apenas o gateway padrão de A aparece na tabela de roteamento, você faria as seguintes etapas para incluir o gateway de B:

  1. Vá para /etc/iproute2/rt_tables e, no final, a linha a seguir

    1 routingTableB
    
  2. Execute como root os seguintes comandos:

    ip route add 192.168.0.0/24 dev <Interface B> src 192.168.0.10 table routingTableB
    ip route add default via 192.168.0.1 dev <Interface B> table routingTableB
    ip rule add from 192.168.0.10/32 table routingTableB
    ip rule add to 192.168.0.10/32 table routingTableB
    

Depois disso, você poderá usar o sinal -i com a Interface B sem nenhum problema.

Por favor, note que esta configuração será perdida após a reinicialização. Verifique o link acima sobre como torná-lo permanente.

Como observação, o sinalizador -g não determina a qual IP a interface enviará os pacotes. É um parâmetro incluído nos testes destinados a ditar aos nós intermediários como rotear os pacotes.

    
por 12.02.2017 / 11:35
1

Publicando isso caso alguém encontre o mesmo problema que eu:

No Ubuntu, o pacote inetutils-traceroute não permite que você defina a interface de origem, enquanto o pacote traceroute o faz. Você quase certamente quer o último.

    
por 03.03.2016 / 23:55
0

Hum ... Apenas um conceito aqui, mas eu diria - roteamento de políticas:

  1. Adicione uma nova tabela RT ao seu linux

    echo 200 test >> /etc/iproute2/rt_tables

  2. Adicione uma regra de política correspondente a ela

    ip rule add oif <iface_to_second_ISP> table test

  3. Adicionar rota padrão em sua tabela recém-criada

    ip route add 0.0.0.0/0 via <second_ISP_next_hop> dev <iface_to_second_ISP> table test

  4. Liberar os caches e testar

    ip route flush cache

    ping -I <IP_on_second_ISP_iface> google.com

por 16.07.2013 / 19:46