Não é possível ligar a um endereço IPv4 específico ao fazer conexões TCP de saída, a nomes de host que resolvem endereços IPv4 e IPv6

3

Acabei de passar cerca de 6 horas tentando descobrir isso, e agora acredito que o CentOS / Linux não pode se ligar a um endereço IPv4 virtual específico ao se conectar a um nome de host que tenha um endereço IPv6. Este é um problema em servidores com vários endereços IP.

Estou usando o Centos 6 (kernel Linux 2.6.32-573.12.1.el6.x86_64)

Para reproduzir isso:

  1. Encontre uma máquina Linux com pelo menos um espaço de endereço público IPv4 / 29 e um IP público IPv6.
  2. Alias, pelo menos, um IPv4 adicional à interface principal (eth0 ou outro). Para este exemplo, direi 30.0.0.1 como o endereço IPv4 principal eth0 da máquina e 30.0.0.2 é um alias ligado a eth0: 2 em uma rede de 30.0.0.0/29.
  3. Encontre um nome de host que tenha endereços IPv4 e IPv6. Por exemplo, www.microsoft.com.
  4. telnet -b 30.0.0.2 www.microsoft.com 80 (testa a realização de uma conexão de saída usando um endereço ipv4 específico)
  5. A solicitação IPv4 se conecta com êxito após tentar sem êxito os endereços IPv6 do nome do host, mas a conexão TCP realmente é iniciada a partir do IP principal da máquina (30.0.0.1), não do IP desejado (30.0.0.2). Netstat diz o contrário, mas está errado. Se você se conectar a um nome de host que você possui e puder visualizar seus logs, a conexão será proveniente do IP principal (30.0.0.1) e não do IP desejado (30.0.0.2).
  6. Tente outro domínio que não tenha um endereço IPv6, como: telnet -b 30.0.0.2 serverfault.com . Funciona. Faz a conexão do IP que você quer.

Isso é um problema, porque certos programas, como o correio (exim), precisam usar determinados IPs ao fazer solicitações TCP de saída, o que não é necessariamente o IP da máquina principal. Certos clientes / programas na máquina dependem de ACLs ou DNS reverso para corresponder corretamente ao fazer conexões TCP de saída.

Então, se alguém mais está percebendo o mesmo problema estranho em que seu programa não pode se ligar à interface correta ao fazer conexões de saída, provavelmente é por isso.

Esse problema afeta somente conexões IPv4. As conexões IPv6 vinculam-se corretamente a qualquer IP de saída que você tenha na máquina.

Isso não é um problema com o telnet. Eu testei esse problema usando meu servidor de email (exim) também e obtive resultados semelhantes. Ele faz conexões IPv4 do IP incorreto se o nome do host de destino tiver um endereço IPv6.

Talvez alguém tenha uma solução para esse problema estranho, mas, no momento, acho que pode ser um bug de rede do Linux.

Ps- Se alguém se pergunta por que não apenas estabelecer uma conexão IPv6 se o nome do host resolver para um endereço IPv6 ... às vezes o endereço IPv6 está inativo ou a conexão não pode ser estabelecida, então ele retorna ao seu endereço IPv4.

    
por Crash Override 29.12.2015 / 09:48

1 resposta

3

Você pode confiar em netstat para fornecer informações corretas sobre os endereços IP (pelo menos enquanto -n for usado).

Se os terminais de uma conexão TCP não concordarem com os endereços IP em uso, isso significa que existe um NAT entre os dois.

A partir das informações adicionais fornecidas nos comentários, aprendemos que, neste caso em particular, uma regra supérflua do iptables -A POSTROUTING -j MASQUERADE foi a causa do problema.

    
por 29.12.2015 / 18:40