%20%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%BE%D0%B9%20IP%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0.png)
У меня есть сервер 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, чтобы все заработало правильно. Смотрите следующее