IP secundário (eth0:0) atua como IP do servidor principal

IP secundário (eth0:0) atua como IP do servidor principal

Tenho um servidor CentOS configurado com 4 IPs consecutivos:
eth0 5.xx251
eth0:0 5.xx252
eth0:1 5.xx253
eth0:2 5.xx254

O problema é que todo o tráfego sai para a internet com eth0:0 (5.xx252) como IP de origem, em vez de eth0.
# curl ifconfig.me
5.x.x.252

Como posso corrigir isso, para que todo o tráfego saia via eth0, ou seja, meu IP principal?

PS: Meu servidor é um VPS rodando em um Xen dom0, sendo este último configurado em modo roteado de rede.

Desde já, obrigado!

Configuração do servidor

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.251  Bcast:5.x.x.255  Mask:255.255.255.255
          inet6 addr: fe80::x:x:x:x/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14675569 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9463227 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4122016502 (3.8 GiB)  TX bytes:25959110751 (24.1 GiB)
          Interrupt:23 

eth0:0    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE   
          inet addr:5.x.x.252  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:1    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.253  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23 

eth0:2    Link encap:Ethernet  HWaddr 00:x:x:x:x:AE  
          inet addr:5.x.x.254  Bcast:5.x.x.255  Mask:255.255.255.224
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:23  

# cat /etc/hosts
127.0.0.1       localhost.localdomain localhost
5.x.x.251       [fqdn] [hostname]

# cat ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.251
NETMASK=255.255.255.224
SCOPE="peer 5.x.y.82"

# cat ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=static
ONBOOT=yes
IPADDR=5.x.x.252
NETMASK=255.255.255.224

# cat route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
5.x.y.82        0.0.0.0         255.255.255.255 UH        0 0          0 eth0
5.x.x.224       0.0.0.0         255.255.255.224 U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         5.x.y.82        0.0.0.0         UG        0 0          0 eth0

Atualização 29 de agosto de 2012
Quando executo /etc/init.d/network restartrecebo um RTNETLINK answers: File existserro, o que me leva a acreditar que existe outra rota para outra rede usando o gateway padrão, como vistoaqui.

# /etc/init.d/network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  RTNETLINK answers: File exists
                                                           [  OK  ]

O certo é que quando eu excluo pela primeira vez ip route del default via 5.x.y.82 dev eth0e depois adiciono novamente com o IP .251, tudo funciona conforme o esperado.
Existe alguma maneira de adicionar um route delcomando aos ifcfg-eth0arquivos route-eth0? Posso ver que isso pode ser feito pre-up ip addr del ...no Debian (mais informações), mas e o CentOS?

Responder1

Deesse documentoparece que pelo menos no CentOS 5 e eu suspeito acima você pode especificar suas rotas simplesmente fornecendo os argumentos corretos do comando iproute2. (veja a seção sobre IP Command Arguments Format)

Então, em vez de escrever algo como:

# route-eth0 
ADDRESS0=0.0.0.0
NETMASK0=0.0.0.0
GATEWAY0=5.x.y.82

Você poderia simplesmente ter um arquivo como este:

default via 5.x.y.82 dev eth0  src 5.x.x.251

Eu não tenho uma caixa derivada do Redhat/Redhat à mão para testar.

Responder2

Se os endereços IP com alias não forem usados ​​como endereços de origem para destinos não locais, eles não deverão estar na mesma sub-rede que o destino da sua rota padrão. Portanto, mude suas máscaras de rede 255.255.255.255e remova seus endereços de transmissão.

Responder3

Primeiro limpe seu gateway padrão 0.0.0.0

route del -net default

Em seguida, declare o eth0 padrão como dispositivo de gateway padrão

route add -net default gw 5.x.y.82 dev eth0

Deveria funcionar. Verifique com

ip ro li

Para salvar isso como regra, tente esta coisa confusa:

Abra /etc/sysconfig/network-scripts/network-functions, localize a função add_default_route ()e nessa função, após a chamada, find_gateway_devadicione uma linha com GATEWAYDEV="eth0".

O que acontece é que o network-functionsscript decide qual dispositivo será o gateway padrão. Ele examina a rota para o IP do gateway ip get route to GATEWAYe, usando sed, corresponde ao dispositivo. Parece que eth0:0 é sempre o mesmo, então, ao codificar, GATEWAYDEV="eth0"você garante que eth0 esteja sempre selecionado como o dispositivo de gateway.

Nas versões mais antigas do RH você poderia simplesmente editar /etc/sysconfig/static-routese adicionardefault via 5.x.y.82 dev eth0

Como último recurso /etc/rc.localé sempre seu amigo!

Responder4

Como eles estão todos na mesma sub-rede, o kernel escolherá um para usar. Você pode verificar isso executando

 ip addr list dev eth0

Você precisa fazer alguma mágica com o iptables para que funcione corretamente. Veja o seguinte

Ao usar o alias de IP, como o sistema operacional determina qual endereço IP será usado como origem para conexões TCP/IP de saída?

informação relacionada