Можно ли предотвратить добавление маршрута по умолчанию при открытии интерфейса?

12

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

    eth0:
    - 10.x.x.x address space
    - no internet gateway
    - only a few devices

eth1 (when used):
- 172.16.x.x or 192.168.x.x or other address spaces
- access to the gateway from LAN to internet

ppp0 (when used):
- internet access through dialup using KPPP

Я использую ifconfig для повышения или понижения интерфейсов (кроме ppp0, который обрабатывается KPPP).

Если я сначала включу eth1, он получит адрес от своего DHCP и получит шлюз, который добавляется к маршрутизации, поэтому нет проблем с подключением к локальной сети и Интернету.

Если я сначала укажу eth0, он получит свой адрес и установит шлюз по умолчанию в пределах своего адресного пространства (в диапазоне 10.xxx). Если я сначала укажу eth0, а за секунду eth1, шлюз по умолчанию все еще будет находиться в диапазоне 10.xxx.

Поэтому независимо от того, что я делаю, eth0 переопределит eth1 и «потребует» шлюз в маршрутизации.

Есть ли какой-нибудь способ либо запретить eth0 запрашивать шлюз, либо удостовериться, что eth1 (если он установлен 2nd) использует свой шлюз? Или я могу как-то расставить приоритеты в ранжировании того, какой интерфейсный шлюз должен использоваться поверх других?

Я в основном хочу убедиться, что шлюз адресного пространства eth1 используется по умолчанию, если он активен, а если нет, то используется шлюз ppp0 по умолчанию. Я бы хотел, чтобы у eth0 никогда не было шлюза по умолчанию.

Танго
источник
Странно, что использование ifconfigприведет к какому-либо взаимодействию DHCP. Как правило, ifupбудет делать это, начиная dhclient. Возможно, ваши интерфейсы eth * запускаются процессом загрузки системы, скажем /etc/init.d/network, или NetworkManager?
Марк Плотник
@MarkPlotnick: это после того, как я загрузился и использую "ifconfig eth1 up" (или down или eth0 ...). Я предполагаю, что самая простая форма того, что я хочу сделать, это вызвать eth0 без добавления каких-либо маршрутов, кроме адресного пространства 10.xxx.
Танго

Ответы:

5

Конфигурация DHCP-сервера неверна. Он не должен отправлять параметр шлюза по умолчанию, если он не может обеспечить маршрутизацию для остального мира. Если он отправляет эту опцию, то любой клиент может предположить, что он может отправлять пакеты для любого получателя вне линии связи на указанный шлюз по умолчанию.

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

Сандер Штеффанн
источник
Хорошо, это имеет большой смысл. К сожалению, DHCP-сервер - это DLink DNS-321, который не допускает много вариантов управления. Кажется, требуется включить шлюз. Я должен посмотреть, смогу ли я как-то взломать и отредактировать файл конфигурации. Но есть еще одна проблема: почему он всегда берет шлюз от DHCP-сервера 10.xxx и не всегда берет шлюз от другого сервера?
Танго
1
Я не уверен, как Linux выбирает между одинаковыми маршрутами. Это, вероятно, основано на метрике. Можете ли вы показать свою таблицу маршрутизации, когда у вас есть несколько маршрутов по умолчанию?
Сандер Штеффанн
Это не позволит несколько маршрутов по умолчанию. Разочарование в том, что по какой-то причине eth0 всегда слушает DHCP и обновляет шлюз. С eth1 он только слушает и использует шлюз, если это первый и единственный интерфейс, который работает. Если шлюз eth0 не всегда перекрывает eth1, то я просто напишу сценарий, чтобы, когда eth0 был поднят, eth1 был снят, а затем поднят.
Танго
Это почти звучит как странно закодированный странный клиент DHCP. Какой вы используете? В качестве альтернативы: может быть проще просто поменять eth0 и eth1;)
Сандер Штеффанн
Это на D-Link DNS-321. Но я прошел через / var / logs / syslog и вижу, что DHCP для eth1 также каждый раз отправляет в шлюз. Я просто не могу понять, почему eth1 всегда берет шлюз и добавляет его к маршруту, а eth1 - нет. Я собираюсь попробовать ограничить диапазон для использования DHCP eth0, чтобы начать с 10.0.0.3, а затем сделать eth0 статичным, используя 10.0.0.2, и посмотреть, не приводит ли это к игнорированию этого грубого DHCP-сервера.
Танго
16

Я столкнулся с подобной проблемой на Raspbian (полагаю, что приведенное ниже решение будет применимо и к Debian). Raspberry Pi 3 имеет 2 встроенные сетевые карты: Wi-Fi и Ethernet. Я использую их обоих, они wlan0 и eth0, соответственно. wlan0 подключен к моей домашней сети Wi-Fi, и доступ к Интернету осуществляется через этот интерфейс. Он получает свои настройки через DHCP от моего домашнего роутера. eth0 подключен напрямую к моему компьютеру с Windows и ему назначен статический IP-адрес. Доступ к Интернету через eth0 не был доступен, так как я не настроил его на своем компьютере с Windows.

В Raspbian демон dhcpcd отвечает за настройку сетевых интерфейсов. Чтобы установить статический IP для интерфейса eth0, в конце были добавлены следующие строки /etc/dhcpcd.conf:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1

С этими настройками dhcpcd создал 2 маршрута по умолчанию, и маршрут через eth0 имел более высокий приоритет, чем через wlan0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.2.1     0.0.0.0         UG    202    0        0 eth0
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

Таким образом, у меня не было доступа к Интернету, потому что система пыталась маршрутизировать его через eth0, и у него не было доступа к Интернету, как я упоминал выше.

Чтобы решить эту проблему, я использовал nogatewayопцию в /etc/dhcpcd.confинтерфейсе for eth0. Итак, конфигурация eth0 стала выглядеть так:

interface eth0

static ip_address=192.168.2.2/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
nogateway

После сохранения этой конфигурации и перезагрузки не было никакого маршрута по умолчанию через eth0:

pi@raspberrypi:~ $ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.254   0.0.0.0         UG    303    0        0 wlan0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     202    0        0 eth0

Доступ в интернет появился, и проблема была решена.

Роман Я
источник
1
Это была именно моя ситуация, и это было именно то решение.
PNDA
Спасибо, nogatewayэто путь в последних дистрибутивах Debian
Алессандро Диониси
Вы не можете себе представить, что мешает столкнуться с этой проблемой в Raspbian Pi, и вы просто дали самое элегантное и правильное решение. Спасибо, мужик.
TechNyquist
7

На RHEL6 / Fedora 22 было проверено следующее.

В / etc / sysconfig / network-scripts / ifcfg-eth1 добавьте строку:

DEFROUTE=no

Замените eth1 на имя интерфейса, где маршрутизация по умолчанию не нужна.

Это также можно сделать через графический интерфейс Network Manager, установив флажок «Использовать это соединение только для ресурсов в своей сети» в нижней части вкладки IPv4.

DEFROUTE = no предотвращает добавление маршрута по умолчанию (пункт назначения 0.0.0.0) в таблицу маршрутизации, когда интерфейс включен. то есть. следующая запись не будет добавлена.

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         172.16.x.x      0.0.0.0         UG        0 0          0 eth1
user3489409
источник
1
Пожалуйста, объясните, почему это решает проблему. И когда это работает. Он будет работать на дистрибутивах на основе Debian (я полагаю), но не на дистрибутивах с разными именами интерфейсов (или дистрибутивах, использующими systemd для организации сервисов).
Грохмал
1
Больше похоже на Red Hat, чем на системы Debian.
ilkkachu
4

Итак, вы хотите, чтобы машина никогда не вызывала шлюз по умолчанию, когда она вызывает eth0 и получает свой адрес через DHCP.

Вот решение:

Редактировать файл:

/etc/dhcp/dhclient-up-hooks

и заполните:

#!/bin/sh
## Prevent DHCP server on eth0 from forcing a default route on us

case ${interface} in
  eth0)
     printf "executing ip route delete default via $new_routers\n" 
     ip route delete default via $new_routers
  ;;
     *)
  ;;
esac

перед:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.4.1     0.0.0.0         UG    20     0        0 eth0
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

после ifdown eth0, ifup eth0:

[root@centos7lab dhcp]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
Рикардо
источник
Это удаляет маршрут со шлюзом после того, как он установлен, что означает, что он уже уничтожил любой другой маршрут со шлюзом по умолчанию. Или я неправильно понял?
Танго
он удалит только тот шлюз, который DHCP-клиент создал при запуске eth0, он не повлияет на любой другой шлюз, уже установленный в системе. Из вашего описания я бы предположил, что ваша проблема заключается в том, что вы одновременно получаете два шлюза по умолчанию (один для eth0 и один для eth1), и вам нужно избавиться от одного для eth0 до того, как он будет помещен в таблицу маршрутизации. Если вы опубликуете свой маршрут -n на момент выпуска, я могу изменить свое предположение.
Рикардо
1

Вы можете редактировать файл dhcpclient.conf и не запрашивать какой-либо маршрут по умолчанию с удаленного DHCP-сервера.

Небольшой пример того, что я сделал, и это работает для моего случая

send host-name = "random-hostname";

запросить маску подсети, широковещательный адрес, смещение по времени, interface-mtu, rfc3442-classless-static-routs, ntp-серверы;

Netboy
источник