%20atua%20como%20IP%20do%20servidor%20principal.png)
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 restart
recebo um RTNETLINK answers: File exists
erro, 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 eth0
e depois adiciono novamente com o IP .251, tudo funciona conforme o esperado.
Existe alguma maneira de adicionar um route del
comando aos ifcfg-eth0
arquivos 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.255
e 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_dev
adicione uma linha com GATEWAYDEV="eth0"
.
O que acontece é que o network-functions
script decide qual dispositivo será o gateway padrão. Ele examina a rota para o IP do gateway ip get route to GATEWAY
e, 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-routes
e 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