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
Code Block |
---|
|
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:
Code Block |
---|
|
Interface Ethernet <uplink>
ip dhcp snooping trust
|
Также дополнительно рекомендуется включить функционал user-control на портах подключения абонентов, и указать максимальное количество абонентов, подключенных к порту:
Code Block |
---|
|
Interface Ethernet <customer>
ip dhcp snooping binding user-control
ip dhcp snooping binding user-control max-user 1 |
Если вы хотите получать информацию о заблокированных с помощью user-control хостах, то в режиме глобальной конфигурации введите команду:
Code Block |
---|
|
ip dhcp snooping blocked record enable |
Результат можно посмотреть в blocked-таблице с помощью команды:
Code Block |
---|
|
show ip dhcp snooping blocked all |
или для конкретного порта:
Code Block |
---|
|
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
------------------------------------------------------------------------------------------------- |
Коммутаторы серий S2995G/S3850G имеют возможность резервирования базы "ip dhcp snooping binding", сохраняя ее на Flash-память. Записи в таблице будут восстановлены после перезагрузки коммутатора:
Code Block |
---|
|
ip dhcp snooping user-bind autosave <filename.tbl>
ip dhcp snooping user-bind autosave time <1-48> |
Параметр 'time' указывает, с какой периодичностью перезаписывать файл на Flash.
Конфигурация DHCP-сервера ISC DHCP
Рассмотрим детально пример минимальной конфигурации DHCP-сервера ISC DHCP.
Включаем вывод сообщений в Syslog, это упростит отладку в случае каких-либо проблем:
Code Block |
---|
|
log-facility local7;
local-address 172.16.0.10; |
Проверяем наличие Option 82 в пакете:
Code Block |
---|
|
if exists agent.remote-id { |
Если пакет с Option 82, то пишем в Syslog информацию:
Code Block |
---|
|
log ( info, concat( |
Информацию будем писать о коммутаторе и порту подключения, с которого пришел пакет:
Code Block |
---|
|
"Switch MAC: ", binary-to-ascii(16, 8, ":", option agent.remote-id),
"Switch port: ", binary-to-ascii(10, 8, ".", option agent.circuit-id)
));
} |
Создаем класс для порта коммутатора:
Code Block |
---|
|
class "sw01-p01" {
match if |
Берем последние 6 байт agent.remote-id, делим на 8-битные числа, каждые из которых преобразуем в 16-шестнадцатиричную систему счисления. Полученные числа объединяем между собой через «:» и проверяем соответствие полученного MAC-адреса коммутатора в agent.remote-id с необходимым:
Code Block |
---|
|
binary-to-ascii(
16, 8, ":", suffix(option agent.remote-id ,6)
)="f8:f0:82:75:cd:41" and |
Аналогичным образом получаем порт коммутатора из agent.circuit-id и сверяем его:
Code Block |
---|
|
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-адрес согласно описанному выше классу:
Code Block |
---|
|
pool {
range 172.16.0.121;
allow members of "sw01-p01";
}
} |