пятница, 4 мая 2012 г.

Обуздание неистового DHCP в Debian 6


Случаются ситуации, когда интрефейс, конфигурируемый по DHCP, не единственный в системе - и настройки маршрутизации и DNS, получаемые автоматически, не должны перезаписывать статических настроек с других интерфейсов. Ниже приводятся два способа, как можно побороться с этой проблемой в Debian 6:

Первый способ. Требует установки дополнительных пакетов.
Для того, чтобы маршрут по умолчанию не перезаписывал значение, сконфигурированное на другом интерфейсе, ставим пакет ifmetric - и в файле /etc/network/interfaces указываем для наших интерфейсов числовые значения metric. Чем значение ниже, тем выше приоритет маршрута через данный интерфейс.
Для того, чтобы DNS и доменное имя, полученные по DHCP, не перезаписывали насмерть файл /etc/resolv.conf, ставим пакет resolvconf - и в файле /etc/network/interfaces в разделе статического интерфейса добавляем строки:
  dns-nameservers A.A.A.A B.B.B.B
 dns-search mydom1.ru mydom2.ru

Второй способ. Правим файл /etc/dhcp/dhclient.conf
В нем есть длинная строчка, начинающаяся со слова request.
Удалив из нее слова: routers, domain-name, domain-name-servers, domain-search, host-name и rfc3442-classless-static-routes, мы как раз запретим запрос этих параметров по DHCP. Способ безусловно проще, но менее гибкий - в случае проблем со статическим интерфейсом мы остаемся вообще без DNS и без маршрута по умолчанию.

А если не лень чуть-чуть попрограммировать, можно изменять поведение DHCP-интерфейса с помощью скриптов, указываемых в соответствующем разделе /etc/network/interfaces в параметрах up и down. Например, нижеприводимый скрипт применяет маршрут, отдаваемый DHCP сервером как маршрут по умолчанию, только к определенному списку сетей:

#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
mynet="10.0.0.0/8 172.16.1.0/24"
case "$MODE" in
start)
gw=`ip route show dev $IFACE | 
  awk '{if ($1 == "default") {print $3; exit(0)}}'`
if [ -n "$gw" ]
then
ip route delete default dev $IFACE
for n in $mynet
do
ip route add $n via $gw dev $IFACE
done
fi
;;
stop)
for n in $mynet
do
ip route delete $n dev $IFACE
done
;;
esac