Вторичный IP (eth0:0) действует как основной IP сервера

Вторичный IP (eth0:0) действует как основной IP сервера

У меня есть сервер CentOS, настроенный с 4 последовательными IP-адресами:
eth0 5.xx251
eth0:0 5.xx252
eth0:1 5.xx253
eth0:2 5.xx254

Проблема в том, что весь трафик выходит в Интернет с исходным IP-адресом eth0:0 (5.xx252), а не eth0.
# curl ifconfig.me
5.x.x.252

Как это исправить, чтобы весь трафик шел через eth0, т.е. мой основной IP?

PS: Мой сервер представляет собой VPS, работающий на Xen dom0, последний настроен в режиме маршрутизации сети.

Заранее спасибо!

Конфигурация сервера

# 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

Обновление 29 августа 2012 г.
При запуске /etc/init.d/network restartя получаю сообщение RTNETLINK answers: File existsоб ошибке, которое наводит меня на мысль, что существует другой маршрут к другой сети, использующей шлюз по умолчанию, как показаноздесь.

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

Точно то, что когда я сначала удаляю ip route del default via 5.x.y.82 dev eth0, а затем снова добавляю его с IP .251, все работает как и ожидалось.
Есть ли способ добавить route delкоманду либо в файлы ifcfg-eth0, либо в route-eth0файлы? Я вижу, что это можно сделать с помощью pre-up ip addr del ...Debian (больше информации), а как насчет CentOS?

решение1

Отэтот документпохоже, что по крайней мере в CentOS 5 и, как я подозреваю, выше вы можете указать свои маршруты, просто указав правильные аргументы команды iproute2. (см. раздел о IP Command Arguments Format)

Поэтому вместо того, чтобы писать что-то вроде:

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

У вас может быть такой файл:

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

Однако у меня нет под рукой Redhat/производного от Redhat компьютера для тестирования.

решение2

Если псевдонимы IP-адресов не будут использоваться в качестве исходных адресов для нелокальных пунктов назначения, они не должны находиться в той же подсети, что и цель вашего маршрута по умолчанию. Поэтому измените их сетевые маски на 255.255.255.255и удалите их широковещательные адреса.

решение3

Сначала очистите шлюз по умолчанию 0.0.0.0

route del -net default

Затем объявите eth0 по умолчанию шлюзом по умолчанию.

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

Должно работать. Проверьте с помощью

ip ro li

Чтобы сохранить это правило, попробуйте сделать вот такую ​​грязную штуку:

Откройте /etc/sysconfig/network-scripts/network-functions, найдите функцию add_default_route ()и в этой функции после вызова find_gateway_devдобавьте строку с GATEWAYDEV="eth0".

Происходит следующее: network-functionsскрипт решает, какое устройство будет шлюзом по умолчанию. Он проверяет маршрут к IP-адресу шлюза ip get route to GATEWAYи, используя sed, сопоставляет устройство. Похоже, что eth0:0 каждый раз становится одним из них, поэтому, жестко кодируя, GATEWAYDEV="eth0"вы гарантируете, что eth0 всегда выбирается в качестве шлюзового устройства.

В старых версиях RH можно было просто редактировать /etc/sysconfig/static-routesи добавлятьdefault via 5.x.y.82 dev eth0

В крайнем случае /etc/rc.local— это всегда ваш друг!

решение4

Поскольку все они находятся в одной подсети, ядро ​​выберет одну для использования. Вы можете проверить это, запустив

 ip addr list dev eth0

Вам придется немного поколдовать с iptables, чтобы все заработало правильно. Смотрите следующее

При IP-алиасинге как ОС определяет, какой IP-адрес будет использоваться в качестве источника для исходящих TCP/IP-подключений?

Связанный контент