Настройка клиента

На данный момент есть три различных клиентских DHCP программы для Linux, dhcpcd, pump и dhclient. Этот mini-HOWTO рассматривает главным образом dhcpcd.

Получение клиентского демона (dhcpcd)

В зависимости от вашего дистрибутива, возможно, вам придется загрузить клиентский DHCP демон. Если вы хотите скомпилировать его из исходных кодов, необходимый вам пакет называется dhcpcd, его текущая версия 1.3.18. Он поддерживается Sergei Viznyuk и, на сегодняшний день, поставляется в большинстве дистрибутивов в виде бинарного пакета.

Исходный код dhcpcd может быть загружен со следующих мест

Затем следуйте ниже приведенным инструкциям. Они должны быть таковы.

Slackware

Вы можете загрузить последнюю версию DHCPcd с любого зеркала Metalab или отсюда:

Загрузите последнюю версию dhcpcd.tar.gz.

Будет создан каталог /etc/dhcpc, где DHCPcd будет размещать DHCP информацию, а также будет скопирован в /usr/sbin файл dhcpcd.

Для инициализации системы во время загрузки с помощью DHCP наберите:

cd /etc/rc.d

mv rc.inet1 rc.inet1.OLD

Старый скрипт инициализации сети будет перемещен в rc.inet1.OLD. Вам следует создать новый скрипт rc.inet1, в котором следует поместить следующий код:

#!/bin/sh
#
# rc.inet1      Этот shell скрипт загружает базовую INET систему.

HOSTNAME=`cat /etc/HOSTNAME` #Возможно это не требуется, но я это оставлю 
                             # ак или иначе

# Подключаем устройство loopback.
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

# ЕСЛИ У ВАС ЕСТЬ ETHERNET СОЕДИНЕНИЕ, для настройки интерфейса eth0 
# используйте ниже приведенные строки. Если вы используете только 
# loopback или SLIP, не включайте оставшиеся далее строки в этот файл.

/usr/sbin/dhcpcd

Сохраните его и перезагрузите компьютер.

Когда закончите, переходите к следующему шагу.

RedHat 6.x и Mandrake 6.x

Настройка DHCPcd под RedHat 6.0+ достаточно проста. Все что от вас требуется — запустить панель управления, набрав control-panel.

Заметьте, что в RedHat 6.x, вместо вышеупомянутого dhcpcd, Redhat по умолчанию включила DHCP клиент называемый pump. Установочный CD-ROM также содержит и dhcpcd RPM, так что если вы не удовлетворены pump, попробуйте вместо него dhcpcd. После установки dhcpcd (т.е. rpm -i dhcpcd-1.3.17pl2-1.i386.rpm) вам следует сделать несколько изменений.

Дополнительные заметки от Alexander Stevenson :

Я не доволен DHCPcd. Что привело меня к работе с "pump", который поставляется с Linux Mandrake 6.0 (и, я полагаю, он также включен в RedHat). Я использую команду:

pump -i eth0 -h hostname

Не имеет значение, какой был указан "hostname", но без него сервер не отвечал бы.

Затем, для отражения изменений я меняю строку в моем скрипте /sbin/ifup; версия по умолчанию не содержит ключ -h , и поэтому она у меня не работала.

По существу, если вы используете linuxconf, и после настройки адаптера на использование "DHCP" он все еще не работает, попробуйте добавить "-h hostname" в строку с pump в скрипте /sbin/ifup. Теперь мой скрипт выглядит так:

...
if [ -n "$PUMP" ]; then
    echo -n "Determining IP information for $DEVICE..."
    if /sbin/pump -i $DEVICE -h hostname; then
        echo " done."
    else
        echo " failed."
        exit 1
    fi
else ...

Другой, более элегантный путь добавления поля hostname предоставлен Aad van der Klaauw:

Сейчас дома я настраиваю шлюзовую систему, требуется установить MAC адрес и использовать '-h hostname'. Поэтому я решил *не* изменять скрипт, а использовать конфигурационный файл. В моем /etc/sysconfig/network-scripts/ifcfg-eth0 я добавил следующее

DEVICE="eth0"
MACADDR="00:11:22:33:44:55"
DHCP_HOSTNAME="trigger_for_terayon"

Эти строки пережили обновления системы, и, по моему мнению, это "более правильный" способ.

Перезагрузите вашу машину или наберите в командной строке /sbin/ifup eth0.

RedHat 5.x

Настройка DHCPcd под RedHat 5.0+ достаточно проста. Все что вам нужно — запустить панель управления, набрав control-panel.

Когда закончите, переходите к следующему шагу.

RedHat 4.x и Caldera OpenLinux 1.1/1.2

DHCPcd включен в дистрибутив RedHat в виде RPM, и вы можете его найти на CD-ROM в каталоге RPMS или скачать его с:

ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm

Установите его с помощью rpm -i dhcpcd-0.6-2.i386.rpm.

Или же вы можете скомпилировать вашу собственную версию следуя шагам описанным в Slackware.

Следующая информация поступила ко мне от nothing .

Я удалил мой статический ip и имя из /etc/resolv.conf. Однако я оставил строку search и две моих nameserver строки (по некоторой причине мой dhcpcd никогда не создает /etc/dhcpc/resolv.conf, так что я использую статический файл /etc/resolv.conf).

В /etc/sysconfig/network я удалил элементы HOSTNAME и GATEWAY. Я оставил другие элементы, такие как (NETWORKING, DOMAINNAME, GATEWAYDEV).

В /etc/sysconfig/network-scripts/ifcfg-eth0 я удалил элементы IPADDR, NETMASK, NETWORK, и BROADCAST. Я оставил в исходном виде DEVICE и ONBOOT. Я изменил строку BOOTPROTO на BOOTPROTO=dhcp.

Сохраняем файл. Перезагружаем ваш компьютер.

Если вы закончили, переходите к следующему шагу.

Debian

Существует deb пакет DHCPcd (проверьте, чтобы он начинался с dhcpcd) на:

http://ftp.debian.org/debian/dists/slink/main/binary-i386/net/

Либо, следуйте инструкциям по установке Slackware.

Для распаковки deb пакета наберите dpkg -i /where/ever/your/debian/packages/are/dhcpcd*deb.

Кажется, что больше не требуется никаких настроек для DHCPcd, потому как:

 

Пакет dhcpcd устанавливает свой стартовый скрипт как обычно для debian пакетов в /etc/init.d/package_name, то есть /etc/init.d/dhcpcd, и создает ссылки на него из различных /etc/rc?.d/ каталогов.

 
--From: Heiko Schlittermann  

Содержимое каталогов /etc/rc?.d/ в дальнейшем исполняется при загрузке.

Если вы не перегружались после установки, вы можете запустить демон вручную: /etc/init.d/dhcpcd start.

Когда вы закончили переходите к следующему шагу.

LinuxPPC и MkLinux

Следующая секция была написана R. Shapiro

С выпуска "1999" (R5) release, Linuxppc почти полностью совместим с Redhat 6, с одной оговоркой (смотрите ниже). В общем, инструкции точно такие же, как и для текущего выпуска RedHat 6.x и Mandrake 6.x.

Остается та проблема, что Redhat 6 по умолчанию использует 'pump' клиент для dhcp, а 'pump' не надежно работает на Linuxppc. Чтобы это обойти, вам следует установить последнюю версию dhcpcd от Sergei Viznyuk, и отредактировать /sbin/ifup для использования dhcpcd вместо pump.

Измените

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
     PUMP=true
 fi

 if [ -n "$PUMP" ]; then

на

 if [  "$BOOTPROTO" = bootp ]; then
       echo " done."
     else
       echo " failed."
       exit 1
     fi
 elif [ "$BOOTPROTO" = dhcp ]; then
     echo -n "Determining IP information for $DEVICE..."
     if /sbin/dhcpcd -d $DEVICE ; then
       if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then
           /etc/dhcpc/dhcpcd-${DEVICE}.exe
       fi

и внесите соответствующие изменения для ifdown. Измените

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
....
fi

на

if [ "$BOOTPROTO" = bootp ]; then
fi

if [ "$BOOTPROTO" = dhcp ]; then
      if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then
              kill `cat /var/run/dhcpcd-${DEVICE}.pid`
              rm -f /var/run/dhcpcd-${DEVICE}.pid
      fi
fi

Работающий ppc rpm для dhcpcd включен в Linuxppc 1999 cd; немного позже rpm стал доступен в каталоге contrib на ftp://ftp.linuxppc.org/. Исходный код, из которого скомпилирован пакет для Linuxppc 1999, доступен по ftp://ftp.phystech.com/pub/dhcpcd-1.3.17-pl9.tar.gz.

Пытаемся все совместить

После перезагрузки вашей машины ваш сетевой интерфейс должен быть настроен. Наберите: ifconfig.

Вы должны получить нечто подобное:

          lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:302 errors:0 dropped:0 overruns:0 frame:0
          TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0

eth0      Link encap:Ethernet  HWaddr 00:20:AF:EE:05:45
          inet addr:24.128.53.102  Bcast:24.128.53.255  Mask:255.255.254.0
          ^^^^^^^^^^^^^^^^^^^^^^^
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24783 errors:1 dropped:1 overruns:0 frame:1
          TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96
          Interrupt:10 Base address:0x300 

Если у вас разумные числа в поле inet addr, вы уже настроились. Если вы видите 0.0.0.0 ‐ не отчаивайтесь, это временные настройки, перед тем как dhcpcd получит IP адрес. Если через несколько минут, вы все равно видите 0.0.0.0, то загляните в Поиск неисправностей. DHCPcd ‐ демон, и должен быть запущен все время, пока работает ваша машина. Каждые три часа он связывается с DHCP сервером и пытается продлить аренду используемого IP адреса. Он регистрирует все сообщения в syslog (в Slackware /var/adm/syslog, в RedHat/OpenLinux /var/log/syslog).

Еще одно заключение. Вам следует указать ваш сервер имен. Есть два способа это сделать, вы можете либо попросить вашего провайдера дать вам адреса ваших серверов имен и затем поместить их в /etc/resolv.conf, либо DHCPcd будет получать список с DHCP сервера и будет создавать файл resolv.conf в /etc/dhcpc.

Я решаю использовать DHCPcd resolv.conf и выполняю следующее:

Сохраните ваш старый /etc/resolv.conf: mv /etc/resolv.conf /etc/resolv.conf.OLD

Если каталог /etc/dhcpc не существует — создайте его: mkdir /etc/dhcpc

Создайте ссылку с /etc/dhcpc/resolv.conf на /etc/resolv.conf: ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf

Если это не помогает, попробуйте это (решение предоставлено с небольшими поправками от Henrik Stoerner):

Этот последний шаг я выполнил только из-за того, что мой dhcpcd не создает /etc/dhcpc/resolv.conf. Я сделал следующие изменения в /etc/sysconfig/network-scripts/ifup (это очень грубый взлом, но так у меня все работает):

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE}
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^
        echo "failed."
        exit 1

Я изменил на:

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^^^
       echo "failed."
       exit 1
   

Замечание: Обратите внимание на ! (восклицательный знак) в if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];

Теперь откиньтесь на спинку и наслаждайтесь :-).

Различные заметки

Следующие шаги не необходимы, но могут быть полезны некоторым людям:

  1. Если сеть вам нужна только время от времени, вы можете запускать dhcpcd из командной строки (для этого вам нужно быть root) командой: /usr/sbin/dhcpcd.

    Когда вам нужно отключить сеть наберите /usr/sbin/dhcpcd -k.

Поиск неисправностей

Если вы следовали вышеприведенным шагам и не можете получить доступ к вашей сети, этому есть еще несколько возможных объяснений:

Не правильно настроена Ваша сетевая карта

В процессе загрузки ваш Linux будет определять вашу сетевую карту и должен сказать что-то подобное:

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

Если подобное этому сообщение не появляется, ваша сетевая карта, возможно, не распознается Linux системой. Если у вас обобщенная сетевая карта (клон NE2000), вы должны получить диск с DOS утилитами, которыми вы сможете настроить вашу карту. Попробуйте поиграть с IRQ, пока Linux не распознает вашу карту (обычно подходят IRQ 9,10,12).

Ваш DHCP сервер поддерживает RFC 1541/Мой DHCP сервер ‐ Windows NT

Попробуйте запустить dhcpcd, набрав dhcpcd -r.

Для проверки настроек вашего сетевого интерфейса используйте ifconfig (подождите несколько секунд для завершения процесса настройки, сначала она выдаст Inet.addr=0.0.0.0)

Если это решит вашу проблему, добавьте ключ "-r" в загрузочный скрипт, т.е: вместо /sbin/dhcpcd вы получите /sbin/dhcpcd -r.

Например, под RedHat отредактируйте /etc/sysconfig/network-scripts/ifup и вставьте следующее:

        IFNAME=$[ {DEVICE} \
        "/sbin/dhcpcd -r -c /etc/"- etc etc.    
	

В процессе загрузки я получаю сообщение "Using DHCP for eth0 ... failed", но моя система работает нормально.

Скорее всего вы используете RedHat и вы не аккуратно следовали инструкциям :-). Вы пропустили ! (восклицательный знак) в одном из выражений if . Сходите сюда и посмотрите как это исправить.

Моя сеть работает несколько минут, а затем прекращает отвечать

Некоторые люди сообщают, что gated (демон маршрутизации) искривляет маршрутизацию на Linux машинах, что приводит к описанной выше проблеме. Проверьте, запущен ли он у вас, запустив: ps -auxww | grep gate.

Если запущен, попробуйте удалить его с помощью RedHat RPM менеджера пакетов или удалить элемент в каталоге /etc/rc.d/.

Моя сетевая ката распознается в процессе загрузки, но в моих регистрационных записях я получаю сообщение "NO DHCPOFFER". Моя сетевая карта — PCMCIA.

Вы должны проверить, что на вашей сетевой карте активирован 10BaseT порт ("телефонный" разъем). Лучше всего это узнать, проверив какой тип соединителя вашей сетевой карты настроен в процессе загрузки, т.е.

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
		            ^^^^^^^^^^^^
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

Мне сообщали, что проблема такого рода встречается у пользователей ноутбуков из-за PCMCIA утилит (особенно ifport), которые хотят установить тип соединителя на 10Base2 (тонкий коаксиальный кабель). Вы должны проверить, что для вашего соединения вы используете 10BaseT. Если это не так, перенастройте карту и перезапустите компьютер.

Мой DHCP клиент посылает широковещательные запросы, но никто не отвечает (Предоставлено Peter Amstutz)

На некоторых системах, вам следует включить имя вашего компьютера как часть запроса. У dhcpcd, это делается с помощью dhcpcd -h foohost. Возможно, что требуемое имя компьютера ‐ ваше имя пользователя в сети.

Я следовал всем шагам, но моя машина все еще не способна соединиться

Кабельные модемы обычно запоминают ethernet адрес вашей сетевой карты, так что если вы подключаете новый компьютер или переключаете сетевые карты, вы должны как-то "научить" ваш кабельный модем распознавать новый компьютер/карту. Обычно вы можете выключить и снова включить ваш модем при включенном компьютере или позвонить в службу технической поддержки и сказать им, что вы заменили сетевую карту в компьютере.

У вас есть правила firewall (правила ipfwadm), которые запрещают трафик по портам 67/68, которые используются DHCP для распространения информации о настройках. Тщательно проверьте правила вашего firewall.

У меня есть служба MediaOne Express и я все еще не могу соединиться.

Кажется, что MediaOne использует некоторые дополнения к DHCP, которых не должно быть. Вероятно, это не должно быть проблемой, но если ваш опыт говорит об обратном, проверьте это. Если вы (не)счастливый обладатель Windows NT, и если, входя в Просмотр Событий(Event Viewer) вы видите такого рода предостережение:

DHCP получил неизвестную опцию 067 длиной 005. Необработанные данные опции даны ниже.
(DHCP received an unknown option 067 of length 005. The raw option data is given below.)

0000: 62 61 73 69 63            basic

В этом случае сходите на ftp://vanbuer.ddns.org/pub/ и, либо загрузите бинарный файл, либо возьмите исходный код для замены.

Альтернативный DHCP клиент (ISC dhclient)

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

Замечание: Следующая информация была предоставлена одним из авторов dhclient — Ted Lemon .

В текущей версии DHCP клиента, фактически вам не нужен dhclient.conf. Все что вам следует сделать ‐ вызвать dhclient то есть: /sbin/dhclient.

Он настроит все широковещательные интерфейсы. Если это не сработает, или вы хотите указать только один интерфейс — создайте файл /etc/dhclient.conf примерно с такими настройками.

interface "eth0" {
  send dhcp-client-identifier 1:xx:xx:xx:xx:xx:xx;
  send dhcp-lease-time 86400;
}

Тут мы полагаем, что ethernet интерфейс — eth0. Если это не так, измените его. Также измените xx:xx:xx:xx:xx на ваш ethernet адрес. Этот dhclient.conf заставляет клиента выглядеть как Win95 клиент.