DHCP (Dynamic Host Configuration Protocol - протокол динамической конфигурации узла) — это сетевой протокол, позволяющий компьютерам автоматически получать IP- адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к серверу DHCP, и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок.
Протокол DHCP является клиент-серверным, то есть в его работе участвуют клиент DHCP и сервер DHCP. Передача данных производится при помощи протокола UDP, при этом сервер принимает сообщения от клиентов на порт 67 и отправляет сообщения клиентам на порт 68.
$IPT -A INPUT -i $LAN195 -p udp -m multiport --port 67:68 -j ACCEPT $IPT -A INPUT -p udp -m multiport --port 67:68 -j DROP
Но самый главный плюс DHCP вовсе не в том, что с его помощью можно автоматически раздавать IP-адреса. На этом функционал протокола не заканчивается. Основная его ценность в другом: с его помощью вы можете назначать хостам и другие, не менее важные настройки. Например:
Если у вас сеть разбита на несколько подсетей, разделенных маршрутизаторами, то одним DHCP-сервером вам ограничиться не получится. DHCP-запросы и ответы не маршрутизируются между подсетями и распространяются в пределах лишь одного сегмента. Это связано в первую очередь с тем, что протокол DHCP не использует для передачи данных IP- адресацию, а работают на более низком уровне. Следовательно, в каждом из сегментов сети, имеющем свой диапазон IP-адресов вам потребуется отдельная DHCP- служба.
Когда клиент загружается, начальные параметры определяются в соответствующем клиенту объявлении host, затем проверяется секция group (если она существует) которая содержит в себе host, далее проверяется секция subnet соответствующая подсети в которой находится клиент, после этого проверяется указаны ли какие-нибудь параметры в секции shared-network(если есть), содержащей нашу подсеть, ну и наконец проверяются глобальные параметры, которые могут быть указаны перед всеми объявлениями.
Когда dhcpd ищет секцию host для соответствующего клиента, он следует следующим правилам: сперва ищется объявление host где указан параметр fixed-address и секция subnet или shared network совпадает с подсетью в которой находится клиент. Если нет соответствующих записей, dhcpd ищет объявление host без параметра fixed-address. Если подходящих записей не найдено, то dhcpd считает что нет записей для этого клиента, даже если они есть для этого клиента в другой подсети.
Homepage:WWW: isc-dhcp-server
Дополнительная информация в man
> man dhcp-options # описаны выражения допустимые в конфигурационном файле > man dhcp-eval
> uname -a FreeBSD ns.com.ua 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:57:44 UTC 2009 root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
> cd /usr/ports/net/isc-dhcp31-server > make install clean > cp /usr/local/etc/dhcpd.conf.sample /usr/local/etc/dhcpd.conf
> ee dhcpd.conf # dhcpd.conf # # Sample configuration file for ISC dhcpd # # Общие опции для всех поддерживаемых сетей... option domain-name "example.org"; # домен по умолчанию
# (см. Список бесплатных публичных DNS серверов)
option domain-name-servers 4.2.2.2, 208.67.222.222; #сервера DNS default-lease-time 1200; # время аренды (по умолчанию 600) max-lease-time 7200; # максимальное время аренды # Use this to enble / disable dynamic dns updates globally. #ddns-update-style none;
# Параметр authoritative
# Является ли сервер авторитативным - ответственным DHCP сервером. authoritative; # ad-hoc DNS update scheme - set to "none" to disable dynamic DNS updates. # Способ динамического обновления DNS. Выключаем если используется статический DNS - в большинстве # сетей так и есть. Иначе нужно конфигурировать сервер DNS (например bind) ddns-update-style none;
Для работы параметра log-facility нужно настроить syslog.conf и ротацию лога в newsyslog.conf.
# Источник сообщений для записи логов через syslogd log-facility local7; # No service will be given on this subnet, but declaring it helps the # DHCP server to understand the network topology. subnet 10.152.187.0 netmask 255.255.255.0 { } # This is a very basic subnet declaration. subnet 10.26.95.0 netmask 255.255.255.0 { # подсеть из которой будут выдаваться адреса range 10.26.95.1 10.26.95.240; # интервалы ip адресов на выдачу клиентам option domain-name-servers 10.26.95.253; option routers 10.26.95.253; # gateway (шлюз по умолчанию) для клиента #option netbios-name-servers 192.168.1.51; # адрес сервера WINS (если есть) #option domain-name-servers 192.168.1.51; # адрес DNS сервера AD #option domain-name "office.mydomen.ru"; # полное имя домена AD } # Fixed IP addresses can also be specified for hosts. These addresses # should not also be listed as being available for dynamic assignment. # Hosts for which fixed IP addresses have been specified can boot using # BOOTP or DHCP. Hosts for which no fixed address is specified can only # be booted with DHCP, unless there is an address range on the subnet # to which a BOOTP client is connected which has the dynamic-bootp flag # set. #привязка постоянных IP к MAC адресу сетевой карты хоста host darkfire { hardware ethernet 00:15:f2:4b:ad:5c; # MAC адрес сетевой карты хоста fixed-address 10.26.95.251;# ip адрес, который нужно присвоить этому хосту } host user1 { hardware ethernet 00:00:1c:d3:9e:40; fixed-address 10.26.95.10; } host user2 { hardware ethernet 00:14:2a:1c:16:31; fixed-address 10.26.95.11; }
Прописываем в rc.conf строки
dhcpd_enable="YES" dhcpd_flags="-q" # отключаем вывод копирайта и прочего при старте dhcpd dhcpd_ifaces="rl0 vr0" # сетевой интерфейс на котором будет работать dhcpd. Несколько интерфейсов указываются через пробел.
Запускаем и пользуемся
> /usr/local/etc/rc.d/isc-dhcpd start
dhcpd скомпонован статически и расположен в каталоге /usr/local/sbin. Страницы справочной системы dhcpd(8), устанавливаемые портом, содержат более полную информацию о dhcpd.
dhcpd требует наличия конфигурационного файла, /usr/local/etc/dhcpd.conf, до того, как он будет запущен и начнёт предоставлять сервис клиентам. Необходимо, чтобы этот файл содержал все данные, которая будет выдаваться обслуживаемым клиентам, а также информацию о работе сервера. Этот конфигурационный файл описывается на страницах справочной системы dhcpd.conf(5), которые устанавливаются портом.
Сервер DHCP ведёт базу данных выданной информации в этом файле, который записывается в виде протокола. Страницы справочной системы dhcpd.leases(5), устанавливаемые портом, дают гораздо более подробное описание. В dhcpd.leases заносится информация только динамически выданных IP адресах, если IP статистический (привязан к МАС) - такая информация в dhcpd.leases заноситься не будет. Полный сбор статистики можно осуществлять через dhcpd-snmp: http://www.net-track.ch/opensource/dhcpd-snmp/
dhcrelay используется в сложных ситуациях, когда сервер DHCP пересылает запросы от клиента другому серверу DHCP в отдельной сети. Если вам нужна такая функциональность, то установите порт net/isc-dhcp3-server. На страницах справочной системы dhcrelay(8), которые устанавливаются портом, даётся более полное описание.
Параметры allow и deny используются для контроля над поведением демона dhcp в отношении различных видов запросов.
allow unknown-clients; deny unknown-clients;
Параметр unknown-clients используется что бы сообщить серверу как поступать с неизвестными клиентами. По умолчанию выдача адресов неизвестным клиентам разрешена.
allow bootp; deny bootp;
Параметр bootp сообщает серверу dhcp обрабатывать или нет bootp-запросы. По умолчанию bootp-запросы разрешены.
allow booting; deny booting;
Параметр booting сообщает серверу обрабатывать ли запрос конкретного клиента. Имеет смысл только если присутствует в описании host и действует только на соответствующий хост. По умолчанию разрешено, в противном случае хост не сможет получать свой адрес и другие параметры.
Ручной запуск (в примере ниже - вывод команды говорит о неудачном запуске DHCP -клиента):
# dhclient rl0 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 7 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 11 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 12 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 9 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 10 DHCPDISCOVER on rl0 to 255.255.255.255 port 67 interval 12 No DHCPOFFERS received. No working leases in persistent database - sleeping.
По умолчанию dhclient.conf в FreeBSD пустой (в нем ссылка только на man 5 dhclient.conf). В обычном случае и при таком конфиге все работает. Но если возникают стоит изменить настройки по умолчанию.
Читаем man, копируем приведенный пример в наш dhclient.conf
# cp /etc/dhclient.conf /etc/dhclient.conf.orig # man 5 dhclient.conf ... DHCLIENT.CONF(5) FreeBSD File Formats Manual DHCLIENT.CONF(5) NAME dhclient.conf -- DHCP client configuration file DESCRIPTION The dhclient.conf file contains configuration information for dhclient(8), the Internet Software Consortium DHCP Client. ... EXAMPLES The following configuration file is used on a laptop which has an IP alias of 192.5.5.213, and has one interface, ep0 (a 3Com 3C589C). Boot- ing intervals have been shortened somewhat from the default, because the client is known to spend most of its time on networks with little DHCP activity. The laptop does roam to multiple networks. timeout 60; retry 60; reboot 10; select-timeout 5; initial-interval 2; reject 192.33.137.209; interface "ep0" { send host-name "andare.fugue.com"; send dhcp-client-identifier 1:0:a0:24:ab:fb:9c; send dhcp-lease-time 3600; supersede domain-name "fugue.com rc.vix.com home.vix.com"; prepend domain-name-servers 127.0.0.1; request subnet-mask, broadcast-address, time-offset, routers, domain-name, domain-name-servers, host-name; require subnet-mask, domain-name-servers; script "/etc/dhclient-script"; media "media 10baseT/UTP", "media 10base2/BNC"; } alias { interface "ep0"; fixed-address 192.5.5.213; option subnet-mask 255.255.255.255; } This is a very complicated dhclient.conf file - in general, yours should be much simpler. In many cases, it is sufficient to just create an empty dhclient.conf file - the defaults are usually fine. SEE ALSO dhclient.leases(5), dhcpd.conf(5), dhcp-options(5), dhclient(8), dhcpd(8) ...
Используем tcpdump Linux примеры использования для проверки DHCP (порты 67, 68).
Передача данных производится при помощи протокола UDP, при этом сервер принимает сообщения от клиентов на порт 67 и отправляет сообщения клиентам на порт 68.
# tcpdump -i rl0 -n
> ee /etc/dhclient.conf
Ошибка возникает если на одном интерфейсе (в данном случае vr0) прописаны алиасами несколько сетей. Для устранения ошибки нужно указать опцию shared-network {}, например так
.... shared-network sharedname { subnet 192.168.175.32 netmask 255.255.255.248 { range 192.168.175.33 192.168.175.38; option routers 192.168.175.33; } subnet 192.168.175.48 netmask 255.255.255.240 { range 192.168.175.50 192.168.175.62; option routers 192.168.175.49; } }
Окружение: Debian GNU/Linux wheezy/sid. isc-dhcp-server Версия: 4.1.1-P1-17
# aptitude install isc-dhcp-server
Этот сервер может работать с несколькими сетевыми интерфейсами одновременно. Укажем явно сетевой интерфейс на котором будет слушать DHCP сервер, в этом случае для eth0:0, который является алиасом на eth0.
# nano /etc/default/isc-dhcp-server ... # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth0:0"
По умолчанию демон Настройка DHCP сервера Linux, FreeBSD пишет логи в /var/log/messages и на /dev/console. Нужно вынести логи в отдельный файл и заблокировать вывод логов в messages.
# nano /etc/dhcp/dhcpd.conf log-facility local7;
# touch /var/log/dhcpd.log
В конец файла rsyslog.conf добавим строку
# nano /etc/rsyslog.conf ... !dhcpd *.* -/var/log/dhcpd.log
Для блокировки в messages и на console добавим local7.none
... *.=info;*.=notice;*.=warn;\ auth,authpriv.none;\ cron,daemon.none;\ mail,news.none;local7.none -/var/log/messages ... daemon.*;mail.*;\ news.err;\ *.=debug;*.=info;\ *.=notice;*.=warn;local7.none |/dev/xconsole
Параметр authoritative DHCP-сервера позволяет объявить сервер авторитативным (ответственным) в обслуживаемой сети. Отличие авторитативного сервера от «обычного» заключается в том, что последний игнорирует любые запросы адресов, которые не описаны в его конфигурации, в то время как авторитативный сервер в ответ на такие запросы отсылает DHCPNAK. Благодаря такому поведению клиент, перемещённый из другой подсети, сможет бы стрее получить новый адрес (в ответ на DHCPREQUEST с адресом из прежней подсети он сразу получит DHCPNAK и приступит к получению нового адреса; в противном случае DHCPDISCOVER будет отправлен лишь по истечении тайм-аута на ожидание ответа). В то же время «случайные» DHCP-серверы (например, их тыкают сейчас везде где угодно) с меньшей вероятностью смогут помешать работе сети, поскольку, будучи неавторитативными, будут просто игнорировать «чужие» запросы DHCPREQUEST.