Назад | Перейти на главную страницу

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

У меня есть сервер CentOS, настроенный с 4 последовательными IP-адресами:
eth0 5.x.x.251
eth0: 0 5.x.x.252
eth0: 1 5.x.x.253
eth0: 2 5.x.x.254

Проблема в том, что весь трафик уходит в Интернет с eth0: 0 (5.x.x.252) в качестве исходного IP-адреса вместо 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?

Из этот документ похоже, что по крайней мере в 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, которую можно было бы протестировать.

Похоже, вы стали жертвой настройки в новых ядрах. Включение alias promotion пройдет это.

Установите это в своем /etc/sysctl.conf

net.ipv4.conf.all.promote_secondaries = 1

Кстати, а у вас есть фанки SNAT/MASQUERADE iptables правила, которые изменяют исходящий IP-адрес источника?

Сначала очистите шлюз по умолчанию 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 всегда твой друг!

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

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

 ip addr list dev eth0

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

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

route и ifconfig использовать старые, устаревшие сетевые интерфейсы в ядре, которые не знают о маршрутизации на основе политик. Вы должны использовать ip , особенно для информации, связанной с маршрутизацией.

Что, как говорится, ip ro li или полная команда ip route list table main, выводит фактическую таблицу маршрутизации, используемую ядром. ip rule list покажет вам все используемые таблицы маршрутизации (по крайней мере, должно быть local, main и default).

Как вы писали (с http://pastebin.com/A1KRiWTz):

# 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

вам необходимо удалить маршрут по умолчанию и воссоздать его с правильным исходным адресом:

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

Я не знаю, как это сделать с помощью RedHat (где разместить его в файлах конфигурации, специфичных для RedHat), используя /etc/rc.local должно работать, хотя это несколько хакерское решение. Вы можете попробовать использовать system-config-network

Вам нужно написать правило PREROUTING для входящего и исходящего трафика в iptable, вам нужно сказать, что любой трафик tcp или UDP или порт 80 или 8080 (только для Интернета по умолчанию) должен идти на желаемый eth.