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

Linux добавляет неправильный маршрут по умолчанию

По какой-то причине мой Centos 5.9 Linux 2.6.18 x86_64 хочет, чтобы у меня было два маршрута по умолчанию.

Всякий раз, когда я перезагружаю сервер, моя таблица маршрутизации выглядит так:

[root@server1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
255.255.255.255 0.0.0.0         255.255.255.255 UH    0      0        0 bond0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 bond1
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 bond0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 bond1
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0        0 bond0
0.0.0.0         192.168.0.254   0.0.0.0         UG    0      0        0 bond1

bond1 - это локальная сеть, поэтому наличие последнего маршрута по умолчанию, указывающего на эту сеть, приводит к сбою всех интернет-запросов.

Это легко исправить, выполнив route del default gw 192.168.0.254 и я мог бы добавить эту команду в какой-нибудь сценарий запуска. Однако я хотел бы понять, что происходит, и разобраться в корне проблемы.

Надеюсь, кто-нибудь мне скажет, почему это происходит. Мои исследования подтверждают, что всегда должен быть только один шлюз по умолчанию, но я не могу найти ответа на вопрос, почему их автоматически должно быть два.

Вот несколько файлов конфигурации:

[root@server1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=myhostname.com

[root@server1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.10.11
NETMASK=255.255.255.0
NETWORK=192.168.10.0
BROADCAST=192.168.10.255
GATEWAY=192.168.10.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

[root@server1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond1
DEVICE=bond1
IPADDR=192.168.0.15
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
GATEWAY=192.168.0.254
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

Я понимаю, что замена bond0 и bond1 приведет к тому, что два маршрута по умолчанию также поменяются местами, что фактически предоставит мне доступ в Интернет при загрузке. Но я все равно считаю, что это не лучшее решение.

В Интернете люди говорят о файлах в /etc/sysconfig/network-scripts/route-X, Но у меня их нет.

Спасибо за ваше время.

Маршруты "по умолчанию" устанавливаются на основе линий ШЛЮЗА в вашем ifcfg-<interface> файлы. Как упомянул Дом в своем комментарии, если вы удалите неправильную строку GATEWAY, ваша таблица маршрутизации будет такой, как вы ожидаете.

Есть разница между GW и Default GW. Исходя из вашей конфигурации, похоже, вы хотите, чтобы оба интерфейса имели доступ к внешним сетям. Вы можете удалить линию GATEWAY, как было рекомендовано, но это предотвратит любую внешнюю связь с bond1.

Как только вы переходите на многосетевой, я считаю, что лучше использовать маршрутизацию на основе политик. Также известна как маршрутизация с разделенным доступом. Это хорошая привычка, которая требуется, когда вы хотите разместить несколько интерфейсов в одной подсети.

В частности, для вашего случая я бы:

  • редактировать /etc/iproute2/rt_tables
  • Внизу файла добавьте:
    • 100 bond0tbl
    • 101 bond1tbl

Теперь вы определили свои внутренние таблицы с именами bond0tbl и bond1tbl соответственно. Теперь вам нужно создать правила для этих таблиц.

  • Открыть / Создать /etc/sysconfig/network-scripts/rule-bond0
  • Добавьте следующее: from 192.168.10.11 table bond0tbl
  • Открыть / Создать /etc/sysconfig/network-scripts/rule-bond1
  • Добавьте следующее: from 192.168.0.15 table bond1tbl

Теперь, когда вы определили правила, пришло время определить маршруты.

  • Открыть / Создать /etc/sysconfig/network-scripts/route-bond0
  • Добавьте следующее:
    • по умолчанию через 192.168.10.1 dev bond0 table bond0tbl
    • 192.168.10.0/24 через 192.168.10.11 dev bond0 table bond0tbl
    • 192.168.10.0/24 через 192.168.10.11 dev bond0 table main
  • Открыть / Создать /etc/sysconfig/network-scripts/rule-bond1
  • Добавьте следующее:
    • по умолчанию через 192.168.0.254 dev bond1 table bond1tbl
    • 192.168.0.0/24 через 192.168.0.15 dev bond1 table bond1tbl
    • 192.168.0.0/24 через 192.168.0.15 dev bond1 table main

Наконец, я бы удалил строку GATEWAY из ОБОИХ файлов ifcfg-devX и добавил ее в /etc/syconfig/network.

Легко запутаться в GW, который конкретный интерфейс должен использовать для маршрутизации, и в GW по умолчанию, который должен использовать ВСЕ ... в случае, если желаемый маршрут не существует. Установка его в /etc/sysconfig/network всегда казался мне более «глобальным».

Когда твои утки все в ряд, ты service network restart или ifup/ifdown или reboot чтобы все было создано. Чтобы узнать, сработало ли это, вы можете:

  • ip route show table bond0tbl
  • ip route show table bond1tbl
  • ip route show table main
  • ip rule show

Напомним,

  1. Определите таблицы с осмысленным соглашением об именах
  2. Определите правила для принудительной передачи трафика с определенного IP-адреса на конкретный интерфейс.
  3. Определите маршрут по умолчанию для этого интерфейса / IP
  4. Определите маршрут, который будет добавлен во вновь созданную таблицу
  5. Определите маршрут, который будет добавлен в «основную» таблицу.
  6. Пусть перезапуск / перезагрузка сети ifup / service сделает свою работу

Поместите эти строки в свой файл / etc / sysconfig / network, если вы хотите использовать bond0 в качестве шлюза по умолчанию. Если вы хотите использовать bond1 в качестве шлюза по умолчанию, укажите GATEWAYDEV = bond1.

NETWORKING=yes
HOSTNAME=mydbserver
GATEWAYDEV=bond0
GATEWAY=192.168.xxx.xxx