Для многосетевого устройства необходимо настроить более одного восходящего канала для DHCP. Он должен игнорировать маршрут по умолчанию и DNS для все кроме одного Восходящий канал DHCP.
Здесь есть аналогичный вопрос [ Файл интерфейсов Debian - игнорировать записи шлюза и DNS из dhcp ], но ответы там не решают мою проблему:
ifmetric
Предложение касается только маршрута, а не DNS.Кроме того, я надеюсь, что с 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
)Вместо того, чтобы использовать 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 имеет для меня два недостатка
Поэтому я выбрал сценарий в /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
из конфигурации