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

Несколько восходящих каналов DHCP - как игнорировать DNS и маршрут по умолчанию на всех, кроме одного?

Для многосетевого устройства необходимо настроить более одного восходящего канала для DHCP. Он должен игнорировать маршрут по умолчанию и DNS для все кроме одного Восходящий канал DHCP.

Здесь есть аналогичный вопрос [ Файл интерфейсов Debian - игнорировать записи шлюза и DNS из dhcp ], но ответы там не решают мою проблему:

Кроме того, я надеюсь, что с 2009 года все изменилось.

Обратите внимание, что я говорю о встроенных системах без головы. NetworkManager не вариант.

Предпочтительным решением будет только /etc/network/interfaces{.d/}. Я ищу что-то вроде этого:

auto  eth0
iface eth0 inet dhcp

auto  eth1
iface eth1 inet dhcp
    ignore-dhcp-option routers domain-name-servers domain-name

Дополнение:

У нас есть десятки таких боксов, установленных в различных средах. Сети не находятся под нашим контролем. В некоторых случаях ящики должны использовать DHCP более чем на одном интерфейсе. Маршрут по умолчанию и DNS обычно не известны нам заранее, и даже если они были известны, они могут измениться со временем без предварительного уведомления. Следовательно, мы не можем устанавливать их статически, но должны настраивать их через «основной» DHCP-клиент.

(Меня все еще интересуют решения, которые касаются только /etc/network/interfaces{,.d/}, но нет /etc/dhcp/. При отсутствии таких решений пользуюсь вот этим.)

В /etc/dhcp*/dhclient.conf, удалите параметры routers, domain-name-servers, domain-name, domain-search из глобального request заявление. Затем добавьте это (при условии eth0 это устройство, на котором должен быть установлен маршрут по умолчанию и DNS. не игнорируются):

interface "eth0" {
    also request routers, domain-name-servers, domain-name, domain-search;
}

Это решение работает как минимум для isc-dhcp-client версии 4.2.2.dfsg.1-5 + deb70u8, поскольку оно поставляется с Debian 7. Я предполагаю, что оно работает и для более поздних версий.


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

  • Подтверждено, что первоначальная идея работает с небольшими изменениями (eth0 должны быть процитированы, и это должно быть requestне required)
  • Указана версия dlclient, для которой это работает

Вместо того, чтобы использовать inet dhcp ты можешь использовать inet manual чтобы затем указать свой собственный dhclient вызов, на который вы можете передать пользовательский dhclient.conf файл (обратите внимание на -cf <file> аргумент):

iface eth0 inet manual
    up /sbin/dhclient -4 -v -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}
    down /sbin/dhclient -4 -v -r -pf /run/dhclient.${IFACE}.pid \
        -lf /var/lib/dhcp/dhclient.${IFACE}.leases -I \
        -df /var/lib/dhcp/dhclient6.${IFACE}.leases \
        -cf /etc/dhcp/dhclient_no_routers.conf ${IFACE}

В вашем обычае dhclient.conf (/etc/dhcp/dhclient_no_routers.conf в этом случае) вы можете затем установить желаемые параметры DHCP.

Чтобы увидеть, что еще inet dhcp метод, см. inet.defn файл в исходном коде (вот где я получил некоторые dhclient звонок сверху от).

(превращая мои предыдущие комментарии в ответ)

Обновить:

Добавление сценария, как предлагается ниже, действительно приводит к рабочей исходной ситуации. Однако есть сценарии (например, отключение, а затем подключение кабеля), когда dhclient с радостью повторно добавит маршрут по умолчанию, и сценарий не будет запущен, поэтому он больше не будет удален. В результате у вас будет два маршрута по умолчанию.

Короче говоря: этот подход (к сожалению) не работает.

Старый ответ - игнорируйте это

Возникновение в dhclient.conf имеет для меня два недостатка

  • Я должен указать каждый интерфейс, для которого я хочу "нормальное" поведение, вместо того, чтобы указывать, для какого интерфейса я хочу игнорировать значения по умолчанию.
  • isc dhclient (пробовал 4.3.3) будет пытаться получить адрес для каждого интерфейса, о котором он «знает», а указание интерфейсов в dhclient.conf заставляет его «знать» об этом интерфейсе (см. документацию по ключевому слову «interface» в справочную страницу dhclient.conf). Поскольку сетевой менеджер и ifup / down ожидают, что dhclient получит адрес только для интерфейса, указанного в командной строке, это приводит к запутанному поведению.

Поэтому я выбрал сценарий в /etc/network/if-up.d:

#!/bin/sh

if [ x"$IFACE" = x"enp7s4" ]
then
    route del default enp7s4
fi

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

Та же проблема решается добавлением в /etc/dhcp/dhcliet.conf:

interface "eth0" {
    prepend domain-search "my.domain";
    prepend domain-name-servers 127.0.0.1; # for using dnsmasq without -r option
    request subnet-mask, broadcast-address, time-offset, 
            routers, domain-name-servers, domain-name, domain-search, host-name,
            dhcp6.name-servers, dhcp6.domain-search,
            netbios-name-servers, netbios-scope, interface-mtu,
            rfc3442-classless-static-routes, ntp-servers,
            dhcp6.fqdn, dhcp6.sntp-servers;
    require routers, domain-name-servers, domain-name, domain-search, host-name;

}

и удалите глобальный параметр request из конфигурации