Блокировка сторонних DHCP на Cisco через DHCP Snooping

На тесте настрою DHCP Snooping на Cisco Catalyst 6509-E, чтобы блокировать сторонние DHCP сервера, на других коммутаторах Cisco по сути настройка аналогична.

После подключения к устройству сразу перейдём в режим конфигурации:

enable
configure

Читать далее Блокировка сторонних DHCP на Cisco через DHCP Snooping

Настройка DHCP+TFTP для DOCSIS

Недавно нужно было настроить выдачу IP адресов нескольким старым DOCSIS модемам и хосту находящемуся после модема.
Под рукой был Arris Cadant C3 и модемы Thomson TCM-420.

Первым делом запустим DHCP сервер который будет выдавать IP адреса модемам, например как я описывал в этой статье — Установка и настройка isc-dhcp-server.
А также запустим TFTP сервер на котором будут файлы для модемов, например как я описывал в статье — Установка и настройка TFTP сервера

Читать далее Настройка DHCP+TFTP для DOCSIS

IPTables правила для DHCP

Допустим на сервере по умолчанию INPUT DROP, теперь приведу пример простого правила разрешающего DHCP запросы к серверу, этого будет достаточно чтобы клиенты получили IP от сервера (где em1 — сетевой интерфейс на котором запущен DHCP сервер):

iptables -I INPUT -p udp -i em1 --dport 67 -j ACCEPT

Чтобы удалить правило укажем ту же команду, заменив -A на -D, например:

iptables -D INPUT -p udp -i em1 --dport 67 -j ACCEPT

Ограничить доступ по IP строго не получится, так как клиенты не имеющие IP адреса обычно шлют широковещательный запрос от IP адреса 0.0.0.0 на 255.255.255.255, а продлевают уже по unicast со своего полученного IP.

Приведу пример ограничения по IP (где 192.168.5.1 — IP на котором запущен DHCP сервер, а 172.17.0.0/16 — сеть клиентов с которой разрешено продлевать аренду IP):

iptables -t filter -A INPUT -i em1 -p udp -s 0.0.0.0 --sport 68 -d 255.255.255.255 --dport 67 -j ACCEPT
iptables -t filter -A INPUT -i em1 -p udp -s 0.0.0.0 --sport 68 -d 192.168.5.1 --dport 67 -j ACCEPT
iptables -t filter -A INPUT -i em1 -p udp -s 172.17.0.0/16 --sport 68 -d 192.168.5.1 --dport 67 -j ACCEPT

Смотрите также мои статьи:
Настройка IPTables
IPTables правила для TFTP

Настройка FreeRADIUS DHCP для ABillS

Допустим установлен FreeRADIUS 2 как написано в этой статье — Установка и настройка биллинговой системы ABillS
Теперь скопируем файл dhcp.conf в конфигурацию FreeRADIUS:

sudo cp /usr/abills/misc/freeradius/v2/dhcp.conf /usr/local/freeradius/etc/raddb/sites-enabled/

Читать далее Настройка FreeRADIUS DHCP для ABillS

Установка ISC DHCP для ABillS

Приведу пример установки ISC DHCP сервера для ABillS в Ubuntu Server.

Переключимся на root пользователя:

sudo su

Установим пакет:

apt-get install isc-dhcp-server
ln -s /usr/abills/Abills/modules/Dhcphosts/leases2db.pl /usr/abills/libexec/leases2db.pl

Запускаем:

/usr/abills/libexec/leases2db.pl -d LEASES=/var/lib/dhcp/dhcpd.leases

Изменим владельца файла:

chown www-data /etc/dhcp/dhcpd.conf

Откроем config.pl в редакторе:

nano /usr/abills/libexec/config.pl

Добавим параметры:

$conf{DHCPHOSTS_CONFIG}='/etc/dhcp/dhcpd.conf';
$conf{DHCPHOSTS_LEASES}='/var/lib/dhcp/dhcpd.leases';
$conf{DHCPHOSTS_RECONFIGURE}='/usr/bin/sudo /etc/init.d/isc-dhcp-server restart';

Откроем в редакторе:

nano /etc/sudoers

Добавим строку сделав возможность запуска сервиса системой:

www-data   ALL = NOPASSWD: /etc/init.d/isc-dhcp-server

Заходим в веб интерфейс Abills, открываем меню «Настройка» — «IP (DHCP) Сети» — «IP (DHCP) Сети«, добавляем сети если необходимо, потом «Показать dhcp.conf, Переконфигурировать» и «Переконфигурировать«.

Посмотреть запущен ли isc-dhcp-server можно командой:

/etc/init.d/isc-dhcp-server status
netstat -tulpn | grep :67

Логи пишутся в файл /var/log/syslog

Можно также настроить экспорт DHCP истории, чтобы видеть её в меню «Отчёт» — «DHCP История».
Для этого сделаем ссылку:

ln -s /usr/abills/Abills/modules/Dhcphosts/dhcp_log2db.pl /usr/abills/libexec/dhcp_log2db.pl

Отделив DHCP логи в отдельный файл как я писал в статье ниже и добавив в автозагрузку скрипт с командой:

tail -F /var/log/dhcpd.log | /usr/abills/libexec/dhcp_log2db.pl

Смотрите также мои статьи:
Установка и настройка isc-dhcp-server в Ubuntu
Утилита для захвата и анализа пакетов tcpdump

Что такое DHCP и как он работает?

DHCP (Dynamic Host Configuration Protocol) — протокол динамической настройки узла в сети TCP/IP.

Опишу возможные типы DHCP сообщений:
DHCPDISCOVER — запрос клиента на наличие адресов.
DHCPOFFER — предложение сервера на получение адреса.
DHCPREQUEST — запрос клиента на получение адреса (предложенного сервером в DHCPOFFER).
DHCPACK — подтверждение сервера о выдаче адреса.
DHCPDECLINE — отказ клиента в получении предложенного адреса (например когда в сети уже кем-то используется предложенный IP).
DHCPNAK — отказ сервера в выдаче запрошенного адреса.
DHCPRELEASE — уведомление клиента об освобождении адреса.
DHCPINFORM — запрос клиента о дополнительных параметрах.

Опишу процесс успешного получения DHCP клиентом IP адреса от DHCP сервера:
1) DHCP клиент с IP адреса 0.0.0.0 через порт UDP 67 шлет в сеть IP адресу 255.255.255.255 широковещательное сообщение DHCPDISCOVER «Хочу получить IP адрес».
2) DHCP сервер или DHCP сервера если их несколько получают это сообщение и отвечают клиенту со своего IP через порт UDP 68 сообщением DHCPOFFER «Предлагаю такой-то IP адрес». Отправка сообщение выполняется на широковещательный адрес 255.255.255.255 или адрес шлюза если клиент находится в другой сети.
3) DHCP клиент получает это сообщение или сообщения и отвечает с IP адреса 0.0.0.0 только одному DHCP серверу сообщением DHCPREQUEST «Да, хочу этот IP адрес».
4) DHCP сервер шлет в ответ сообщение DHCPACK «Назначаю тебе этот IP адрес»
Так как у IP адреса есть время аренды по истечении которого он освобождается и DHCP сервер может его выдать например другому клиенту, то DHCP клиенты обычно запрашивают продление сообщением DHCPREQUEST и получают ответ DHCPACK.

Опишу состав DHCP сообщения:
op (тип сообщения, например DHCPDISCOVER, размер 1 байт)
htype (тип аппаратного адреса, размер 1 байт)
hlen (длина аппаратного адреса, например 6 для MAC адреса, размер 1 байт)
hops (количество агентов ретрансляции между сервером и клиентом, клиенты устанавливают значение 0, размер 1 байт)
xid (ID транзакции, генерируется клиентом в начале, размер 4 байта)
secs (прошедшее время в секундах с момента запроса получения адреса, может быть 0, размер 2 байта)
flags (поле для флагов, размер 2 байта)
ciaddr (IP адрес клиента, например если он запрашивает продление аренды, размер 4 байта)
yiaddr (IP адрес предложенный сервером клиенту, размер 4 байта)
siaddr (IP адрес сервера, размер 4 байта)
giaddr (IP адрес агента ретрансляции, размер 4 байта)
chaddr (аппаратный адрес клиента (MAC), размер 16 байт)
sname (имя сервера, 64 байта)
file (имя загрузочного файла, может использоваться для загрузки операционной системы по сети, 128 байт)
options (дополнительные опции)

Решение ошибки dhcpd self-test failed. Please fix the config file

Заметил однажды в логах syslog ошибку:

dhcpd self-test failed. Please fix the config file

На сервере был установлен isc-dhcp-server.

Проверить правильность конфигурационного файла можно командой:

dhcpd -t
dhcpd -t -cf /dir/dhcpd.conf
/usr/sbin/dhcpd -t

Команда должна сообщить на какой строке ошибка, но заметил что если она не критическая, то может и не сообщить.
Ключ «t» выполняет тест конфигурации, а «cf» позволяет указать путь к файлу конфигурации, если он не стандартный.

В моем случае, в конфигурационном файле /etc/dhcp/dhcpd.conf кто-то совершил опечатку, в строке ниже (была лишняя буква):

authorivtative;

Из-за этого и возникала ошибка, но несмотря на ошибку dhcp работал.
Хотя когда-то встречались и критические ошибки, например неправильно написанный mac адрес, из-за такой ошибки DHCP не запускался.

Скрипт конфигурации DHCP

Допустим в конфигурационный файл DHCP сервера нужно добавить много подсетей, например от 172.16.1.0 до 172.16.100.0, в этом случае поможет данный скрипт.
Скачать можно отсюда.

Скрипт необходимо сделать выполняемым и запустить из linux:

chmod 755 script_dhcp_conf.php
./script_dhcp_conf.php

Результат скопировать в буфер обмена и вставить в файл конфигурации DHCP (в putty копирование выполняется комбинацией клавиш Ctrl+Ins).

Пример скрипта:

#!/usr/bin/php

<?php

for($i=1; $i<=100; $i++)
{
print
("
subnet 172.16.$i.0 netmask 255.255.255.0 {
       option routers 172.16.$i.1;
       option domain-name-servers  8.8.8.8, 8.8.4.4;
       option subnet-mask 255.255.255.0;
       default-lease-time 86400;
       max-lease-time 86400;
       next-server 172.16.$i.1;

{#172.16.$i.2-254#}
}
");
}

?>

Установка и использование dhcping

dhcping — утилита для проверки DHCP-севреров unicast пакетами.

В Ubuntu dhcping можно установить командой:

sudo apt-get install dhcping

Сначала посмотрим какие IP-адреса получены и от какого шлюза:

ifconfig
route
netstat -rn | grep default

Также посмотреть полученную информацию от DHCP можно в директории /var/lib/dhcp/.

В моём случае IP получен от DHCP сервера 10.0.2.2.
Приведу пример запуска dhcping:

dhcping -s 10.0.2.2

Если DHCP сервер отвечает, то отобразится информация:

Got answer from: 10.0.2.2

Если нет ответа:

no answer

Опишу ключи запуска dhcping:
-v (подробный режим)
-V (очень подробный режим)
-i (использовать DHCPINFORM пакеты)
-r (использовать DHCPREQUEST пакеты (стандартно))
-q (краткий режим)
-t maxwait (время ожидания ответа, стандартно 3 секунды)
-c IP (запросить указанный IP)
-s IP (послать запрос на указанный IP)
-h MAC (использовать указанный MAC-адрес в запросе)
-g IP (использовать в пакете указанный IP шлюза)

Установка и использование dhcpdump

dhcpdump – сниффер утилита для анализа DHCP пакетов.

Приведу пример команды установки в Ubuntu/Debian:

sudo apt-get install dhcpdump

Установка в CentOS:

yum install dhcpdump

Посмотрим какие сетевые интерфейсы есть в системе:

ifconfig

Пример запуска dhcpdump с указанием имени сетевого интерфейса:

dhcpdump -i eth0

Пример перехвата DHCP пакетов только с указанным окончанием MAC-адреса:

dhcpdump -i eth0 -h ^02:b0:eb

Приведу пример вывода результата не на экран, а в файл:

dhcpdump -i eth0 > file.txt