Dois endereços IP na mesma interface, descubra qual deles está em uso

1

Eu tenho um sistema Linux embutido que está configurado para usar DHCP para eth0, mas também tem um endereço IP de link local configurado como um fallback (eth0: 1). Apenas no caso de nenhum endereço IP foi obtido a partir de DHCP

Existe uma maneira simples de verificar, a partir de um script de shell, qual endereço IP está em uso?

O mais próximo que eu tenho é isto:

$ ip route get 1
1.0.0.0 via 192.168.0.100 dev eth0  src 192.168.0.133
    cache
$ ifconfig eth0 0.0.0.0   # Simulate no IP obtained from DHCP
$ ip route get 1                                                       
1.0.0.0 via 192.168.0.100 dev eth0  src 169.254.197.131   
    cache

Isso identifica corretamente o endereço IP em uso (campo 'src'). No entanto, isso só funciona se um gateway padrão estiver configurado, o que não acontecerá se o DHCP não estiver disponível por algum motivo.

Como posso descobrir qual endereço IP está em uso, mesmo que nenhum gateway padrão esteja configurado?

    
por Grodriguez 29.06.2017 / 11:11

1 resposta

1

O comando ip route get ADDRESS funciona , mesmo que nenhum gateway padrão esteja configurado. Por exemplo, se os seguintes endereços estiverem configurados em eth0: 10.0.7.139/24 , 169.254.1.2/16 e a rota padrão for excluída,

$ ip route get 10.0.7.222
10.0.7.222 dev eth0 src 10.0.7.139 
    cache

$ ip route get 169.254.55
169.254.55.0 dev eth0 src 169.254.1.2 
    cache

$ ip route get 1
RTNETLINK answers: Network is unreachable

A última resposta está correta: não há como chegar a um host com qualquer um dos endereços 1.x.x.x, se não houver nenhuma rota para ele. Não é o comando ip route get que não está funcionando, é a configuração de rede que está errada.

Observe que "link-local" significa exatamente isso, um endereço que deve ser usado somente no link Ethernet ao qual a eth0 está conectada. Não é suposto ser usado em uma conexão "de saída".

Editar: esclarecendo comentário adicionado abaixo.

A tabela de roteamento, e apenas a tabela de roteamento, é o que determina como um pacote inicia sua jornada até o seu destino. Uma rota é sempre envolvida ao enviar um pacote IP, mesmo que o destino esteja no link local ou até mesmo no host local. As entradas da tabela de roteamento também contêm um endereço de origem e esse endereço da rota correspondente é escolhido como o endereço IP de origem do pacote transmitido.

Pode haver vários endereços IP atribuídos à mesma interface, mesmo do mesmo intervalo de endereços, mas apenas um deles (o endereço principal) é listado na entrada da tabela de roteamento correspondente.

Assim, ip route get (ou indiretamente ip route ) dá a resposta definitiva à sua pergunta. Na página ip-route man: "este comando obtém uma única rota para um destino e imprime seu conteúdo exatamente como o kernel o vê."

    
por 30.06.2017 / 10:16