У меня есть сервер 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. См. Следующие
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.