DHCP Snooping - функционал коммутатора, предназначенный для защиты от атак с использованием протокола DHCP.
С помощью DHCP Snooping коммутатор контролирует процесс получения DHCP-клиентом IP-адреса для предотвращения атак DHCP и появления нелегитимных DHCP-серверов в сети, устанавливая доверенные и недоверенные порты.
Сообщения из доверенных портов передаются коммутатором без проверки. Обычно, доверенные порты используются для подключения DHCP-сервера или DHCP Relay, а недоверенные - для подключения DHCP-клиентов. Коммутатор передает DHCP-запросы из недоверенных портов, но не передает из них DHCP-ответы. Кроме того, при получении DHCP-ответа из недоверенного порта, коммутатор может выполнить предварительно настроенное действие: shutdown или blackhole. Если включена функция DHCP Snooping Binding, то после каждого успешного получения IP-адреса через DHCP коммутатор создаст запись в таблице, которая свяжет полученный IP-адрес с MAC-адресом DHCP-клиента, номером его VLAN и порта. С помощью этой информации можно реализовать контроль доступа пользователей
DHCP Option 82 - это опция протокола DHCP, которая используется для информирования DHCP-сервера о том, от какого DHCP-ретранслятора и через какой его порт был получен запрос. Данная опция применяется для привязки IP-адреса к определенному порту коммутатора.
Конфигурация DHCP Snooping и Option 82
ip dhcp snooping enable ip dhcp snooping binding enable ip dhcp snooping information enable ip dhcp snooping information option subscriber-id format hex ip dhcp snooping vlan <>
Не забываем указать порт в сторону DHCP-сервера как Trust:
Interface Ethernet <uplink> ip dhcp snooping trust
Также дополнительно рекомендуется включить функционал user-control на портах подключения абонентов, и указать максимальное количество абонентов, подключенных к порту:
Interface Ethernet <customer> ip dhcp snooping binding user-control ip dhcp snooping binding user-control max-user 1
Если вы хотите получать информацию о заблокированных с помощью user-control хостах, то в режиме глобальной конфигурации введите команду:
ip dhcp snooping blocked record enable
Результат можно посмотреть в blocked-таблице с помощью команды:
show ip dhcp snooping blocked all
или для конкретного порта:
switch#sh ip dhcp snooping blocked int e1/0/10 Interface Vlan ID MAC IP address Date ------------------------------------------------------------------------------------------------- Ethernet1/0/10 100 f0-de-f1-19-d5-eb 192.168.1.2 Sun Jan 01 00:38:56 2006 ip dhcp snooping blocked record count:1 -------------------------------------------------------------------------------------------------
Коммутаторы SNR-S2995G/SNR-S3850G имеют возможность резервирования таблицы "ip dhcp snooping binding" , сохраняя ее на flash. Записи в таблице будут сохранены после перезагрузки коммутатора. Для этого был реализован функционал "dhcp snooping user-bind autosave". Параметр time указывает с какой периодичностью перезаписывать файл на flash.
ip dhcp snooping user-bind autosave <filename.tbl> ip dhcp snooping user-bind autosave time <1-48>
Конфигурация DHCP-сервера ISC DHCP
Рассмотрим детально пример минимальной конфигурации DHCP-сервера ISC DHCP.
Включаем вывод сообщений в Syslog, это упростит отладку в случае каких-либо проблем:
log-facility local7; local-address 172.16.0.10;
Проверяем наличие Option 82 в пакете:
if exists agent.remote-id {
Если пакет с Option 82, то пишем в Syslog информацию:
log ( info, concat(
Информацию будем писать о коммутаторе и порту подключения, с которого пришел пакет:
"Switch MAC: ", binary-to-ascii(16, 8, ":", option agent.remote-id), "Switch port: ", binary-to-ascii(10, 8, ".", option agent.circuit-id) )); }
Создаем класс для порта коммутатора:
class "sw01-p01" { match if
Берем последние 6 байт agent.remote-id, делим на 8-битные числа, каждые из которых преобразуем в 16-шестнадцатиричную систему счисления. Полученные числа объединяем между собой через «:» и проверяем соответствие полученного MAC-адреса коммутатора в agent.remote-id с необходимым:
binary-to-ascii( 16, 8, ":", suffix(option agent.remote-id ,6) )="f8:f0:82:75:cd:41" and
Аналогичным образом получаем порт коммутатора из agent.circuit-id и сверяем его:
binary-to-ascii( 10, 8,"", suffix(option agent.circuit-id, 1) ) = "1"; } subnet 172.16.0.0 netmask 255.255.255.0 { option routers 172.16.0.1; option subnet-mask 255.255.255.0; authoritative;
Выдаем IP-адрес согласно описанному выше классу:
pool { range 172.16.0.121; allow members of "sw01-p01"; } }