O IP secundário (eth0: 0) age como o IP do servidor principal

5

Eu tenho um servidor CentOS, configurado com 4 IPs consecutivos:
eth0 5.x.x.251
eth0: 0 5.x.x.252
eth0: 1 5.x.x.253
eth0: 2 5.x.x.254

O problema é que todo o tráfego sai para a Internet com eth0: 0 (5.x.x.252) como o 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 por meio da eth0, ou seja, meu IP principal?

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

Obrigado antecipadamente!

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 restart , recebo um erro RTNETLINK answers: File exists , o que me leva a acreditar que há outra rota para outra rede usando o gateway padrão, como visto aqui .

# /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  ]

A certeza é que quando eu excluo ip route del default via 5.x.y.82 dev eth0 e depois a adiciono novamente com o IP .251, tudo funciona como esperado.
Existe alguma maneira de adicionar um comando route del aos arquivos ifcfg-eth0 ou route-eth0 ? Eu posso ver que isso pode ser feito com pre-up ip addr del ... no Debian ( mais informações ), mas e o CentOS?

    
por George Tasioulis 29.08.2012 / 00:27

7 respostas

7

De este documento , parece que menos no CentOS 5 e eu suspeito acima você pode especificar suas rotas, simplesmente dando os argumentos do comando correto iproute2. (veja a seção sobre o 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ê pode ter apenas um arquivo como este:

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

Eu não tenho uma caixa derivada de Redhat / Redhat para testar.

    
por 29.08.2012 / 01:13
2

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 de sua rota padrão. Então mude suas máscaras de rede para 255.255.255.255 e remova seus endereços de transmissão.

    
por 29.08.2012 / 01:59
2

Primeiro limpe seu gateway padrão 0.0.0.0

route del -net default

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

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

Deve funcionar. Verifique com

ip ro li

Para salvar isso, tente essa coisa confusa:

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

O que acontece é que o script network-functions decide qual dispositivo será o gateway padrão. Ele examina a rota para o IP do gateway com ip get route to GATEWAY e, usando sed, corresponde ao dispositivo. Parece que a eth0: 0 é a única de cada vez, portanto, codificando GATEWAYDEV="eth0" , certifique-se de que a eth0 esteja sempre selecionada como o dispositivo de gateway.

Em versões mais antigas do RH, você poderia apenas editar /etc/sysconfig/static-routes e adicionar default via 5.x.y.82 dev eth0

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

    
por 29.08.2012 / 01:50
1

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

 ip addr list dev eth0

Você tem que fazer algumas mágicas de iptables para fazê-lo funcionar corretamente. Veja o seguinte

Quando o alias de IP, como o SO determina qual endereço IP será usado como fonte para conexões TCP / IP de saída?

    
por 29.08.2012 / 00:32
1

Parece que você pode ser vítima de uma configuração em novos kernels. A ativação de alias promotion ultrapassará isso.

Defina isso no seu /etc/sysctl.conf

net.ipv4.conf.all.promote_secondaries = 1

Por acaso, você tem alguma regra funk SNAT/MASQUERADE iptables que esteja alterando o IP de origem de saída?

    
por 05.09.2012 / 19:21
0

route e ifconfig usam interfaces de rede antigas e obsoletas no kernel que não conhecem roteamento baseado em política. Você deve estar usando o comando ip , especialmente para informações relacionadas ao roteamento.

Dito isto, ip ro li ou o comando completo ip route list table main , gera a tabela de roteamento real usada pelo kernel. ip rule list mostrará todas as tabelas de roteamento em uso (deve haver pelo menos local , main e default ).

Como você postou (de link ):

# ip ro li
5.x.y.82 dev eth0  proto kernel  scope link  src 5.x.x.251 
5.x.x.224/27 dev eth0  proto kernel  scope link  src 5.x.x.252 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 5.x.y.82 dev eth0  src 5.x.x.252

você precisa remover a rota padrão e recriá-la com o endereço de origem correto:

ip route del default 
ip route add default via 2.x.y.82 dev eth0 src 5.x.x.251 scope global

Eu não sei como fazer o caminho RedHat embora (onde colocá-lo em arquivos de configuração específicos do RedHat), usando /etc/rc.local deve funcionar, embora seja uma solução um pouco hacky. Você poderia tentar usar system-config-network

    
por 05.09.2012 / 16:39
-3

Você precisa escrever uma regra PREROUTING para o tráfego de entrada e saída no iptable, você precisa dizer que qualquer tráfego TCP ou UDP ou a porta 80 ou 8080 (somente para a Internet padrão) deve ir para a eth desejada.

    
por 05.09.2012 / 16:01