DHCP (Dynamic Host Configuration Protocol — протокол динамической конфигурации узла) — это сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP.
Чтобы не говорили, а использование автоматического назначения IP-адресации в сети намного упрощает жизнь и администратору, и конечному пользователю. Однако, при эксплуатации такой сети, можно столкнуться с появлением в сети сторонних DHCP-серверов (маршрутизатор, включенный в сеть LAN-портом; сетевые устройства в режиме моста; DHCP-сервер на компьютере абонента и тд.). В случае, когда сеть построена на управляемых коммутаторах, бороться с этим явлением довольно просто - с помощью ACL. А что делать, если сеть построена на неуправляемых коммутаторах? Как блокировать работу сторонних DHCP-серверов без ущерба для работы сети и не "мешая" основному DHCP-серверу?
Одним из наиболее действенных инструментов выступает программа dhcdrop. Она обеспечивает поиск сторонних DHCP-серверов и их подавление путем исчерпания пула IP-адресов (DHCP starvation). Более подробная информация - на сайте проекта.
Что радует - так это то, что dhcdrop есть в портах. Выполним установку:
# cd /usr/ports/net-mgmt/dhcdrop && make install clean && rehash |
По завершению установки советую обратиться к страницам man-руководства... Ознакомимся со списком доступных опций (свои комментарии выделил красным):
-h - показывает help-сообщение.
-D - просмотр списка имён и индексов сетевых интерфейсов. Актуально в ОС Windows.
-t - режим теста. В этом режиме dhcdrop не выполняет подавление сервера. Производится лишь посылка DHCPDISCOVER, если на него приходит ответ нелегального сервера, то программа заверается возвращаяя код 200 и выводя на экран строку вида DHCP SRV: 10.7.7.1 (IP-hdr: 10.7.7.1) SRV ether: 00:02:44:75:77:E4, YIP: 10.7.7.205 содержащую минимум информации о создающем проблему DHCP сервере.
-y - подразумевается ответ "yes" на любой вопрос программы. (позволяет автоматически соглашаться с предложениями «давить» найденные сервера)
-r - отключает рандомизацию MAC адреса источника. Каждый последующий MAC адрес источника увеличивается на 1.
-b - указывает на необходимость использования флага BROADCAST в отправляемых DHCP пакетах.
-a - всегда ожидать ответа сервера на порт DHCP клиента по умолчанию (68), даже если задано значение номера порта клиента отличное от значения по умолчанию.
-A - всегда ожидать ответа с порта DHCP сервера по умолчанию (67), даже если задано значение номера порта сервера отличное от значения по умолчанию.
-f - режим флуда запросами DHCPDISCOVER. ПРИМЕНЯТЬ С ОСТОРОЖНОСТЬЮ. Удобен для стресс-тестирования сервера. В случае указания опции -r все отправляемые пакеты имеют одинаковый MAC адрес.
-R - отправляет сообщение DHCPRELEASE с MAC адресом источника указанном при запуске программы и IP адресом указанным при помощи опции -F к серверу указанному опцией -s.
-q - "тихий" режим работы. Выводится минимум информации.
-m count - максимальное число попыток получения ответа от сервера. (по умолчанию 255, в редких случаях необходимо увеличивать)
-c count - максимальное число адресов арендуемых у сервера.
-n hostname - значение DHCP опции HostName (по умолчанию - "DHCP-dropper")
-N clientname - значение DHCP опции Vendor-Class (по умолчанию - "DHCP-dropper")
-p port - порт используемый клиентом для отправки DHCP сообщений. По умолчанию - 68.
-P port - порт сервера, на который отправляются DHCP сообщения. По умолчанию - 67.
-w секунд - задаёт таймаут рестарта процесса получения IP адресов в случае использования агрессивного режима. По умолчанию - 60 секунд.
-T timeout - устанавливает таймаут ожидания ответа сервера (в секундах). По умолчанию - 3 секунды.
-M хостов-максимум - максимально допустимое количество сканируемых хостов в случае использования агрессивного режима.
-l MAC-address - Ethernet адрес сервера который необходимо игнориновать при выполненении поиска ложных DHCP серверов в сети. В этой опции следует указать адрес DHCP сервера ответственного за раздачу адресов в данном сегменте сети. Может быть указано несколько адресов - каждый должен предваряться ключом -l.
-L легальная-сеть - указывает легальную IP подсеть для выбранного интерфейса. Использование этой опции автоматически включает агрессивный режим получения IP адресов. Может быть указано несколько сетей - каждая должна предваряться ключом -L. Подробное описание смотрите ниже.
-S сеть/маска - ARP сканирование сети 'сеть' с использованием сетевой маски 'маска' в CIDR нотации. IP адрес источника задаётся опцией -F. Если IP адрес источника не задан - используется случайный адрес из диапазона указанной подсети. Пример использования смотрите ниже.
-F исходящий-IP-адрес - указывает IP адрес источника для сканирования сети (опция -S), либо IP адрес DHCP клиента для отправки сообщения DHCPRELEASE (опция -R).
-s IP-адрес-сервера - задаёт IP адрес DHCP сервера. Используется с опцией -R.
-C count - число порождаемых процессов-потомков. Совместим только с флагом -f. Используется для увеличения числа отправляемых пакетов за единицу времени. При значении этого параметра равном 30, 10000 пакетов генерировалось менее чем за 1,5 секунды.
-i interface - имя либо индекс сетевого интерфейса (см. ключ -D). Не может быть "any"! Единственный обязательный параметр программы.
initial MAC address - задаёт MAC адрес источника используемый при отправке первого DHCP сообщения, либо используемый постоянно, в случае использования опции '-f' (flood) вместе с опцией '-r'. Если не указан, то используется случайный MAC адрес источника.
Отметим также коды выхода программы (надеюсь, что все читатели "дружат" с английским языком):
0 - Exit success. Illegal DHCP server not found.
10 - invalid user ID. You must be root for running programm.
20 - failed to set signal handler.
30 - configuration error. See usage.
40 - memory allocation error. Insufficient memory?
50 - error opening ethernet device.
51 - error listing devices.
60 - pcap filter overflow.
70 - pcap compile error.
80 - pcap set filter error.
90 - error sending packet.
100 - error getting packet.
110 - set non blocked mode error.
120 - invalid device.
200 - illegal DHCP server was found.
Соответственно, подберем следующие ключи для запуска dhcdrop на интерфейсе vlan51:
# dhcdrop -y -r -m 3 fe:fe:fe:fe:fe:00 -l 00:0b:cd:68:78:cc -i vlan51 |
Здесь:
Пример работы dhcdrop:
# dhcdrop -y -r -m 3 fe:fe:fe:fe:fe:00 -l 00:0b:cd:68:78:cc -i vlan51 Using interface: 'vlan51' |
Также стоит отметить некоторые моменты работы с dhcdrop:
Итак, проблема восстановления работоспособности нелегальных серверов так и не решена. Как вариант - запуск dhcdrop с определенной периодичностью, используя cron. Однако более удобно использовать следующий скрипт:
#!/bin/sh DATE="/bin/date" LOGDIR="/var/log/dhcdrop/" LEGAL_SERVERS="00:0b:cd:68:78:cc" # Legal DHCP Servers, space separated mac address DROPPER="/usr/local/sbin/dhcdrop" IFNAME="vlan50 vlan51 vlan52" # Interfaces on our Router, space separated TESTPARAMS="-t -m 3" PARAMS="-y -r -m 3 fe:fe:fe:fe:fe:00" # Lets Go! # legal params for mac in ${LEGAL_SERVERS}; do LMAC="${LMAC} -l ${mac}" done # Discovering on every interface for IF in ${IFNAME}; do echo "Processing interface ${IF}" # test to any DHCP-Server ${DROPPER} -i ${IF} ${LMAC} ${TESTPARAMS} # Check for status 200 if [ $? = 200 ]; then echo "Illegal server found on ${IF}! Dropping him!" ${DATE} >> ${LOGDIR}${IF} ${DROPPER} ${PARAMS} ${LMAC} -i ${IF} >> ${LOGDIR}${IF} else echo "Illegal server not found on ${IF}." fi done echo "All done" |
Для корректной работы скрипта необходимо создать каталог, куда будут писаться логи:
# mkdir /var/log/dhcdrop |
После этого добавим в cron запуск скрипта каждые 10 минут. У меня путь к скрипту /usr/local/etc/dhcdrop.sh, соответственно:
# echo '# DHCDROP' >> /etc/crontab |
После этого "забываем" о сторонних DHCP-серверах в неуправляемых сегментах сети. Однако, у злоумышленника еще остаются некоторые лазейки:
Последние комментарии
17 недель 3 дня назад
41 неделя 5 дней назад
2 года 42 недели назад
3 года 12 недель назад
3 года 35 недель назад
3 года 50 недель назад
3 года 51 неделя назад
4 года 2 недели назад
4 года 13 недель назад
4 года 17 недель назад