Вопрос или проблема
Я испытываю странное поведение в нашей локальной сети. У нас есть два устройства, которые получают один и тот же IP-адрес. После расследования я обнаружил, что IP-адрес находится вне диапазона, настроенного на нашем основном DHCP-сервере на маршрутизаторе.
Я просканировал сеть с помощью nmap на наличие открытых UDP-портов 67 и обнаружил 9 дополнительных DHCP-серверов. Большинство из них находятся на компьютерах с Windows моих коллег, а некоторые — на встроенных устройствах Linux, которые у нас здесь есть. Я предполагаю, что не все из них действительно назначают IP-адреса и вызывают проблемы, но как минимум один из них точно это делает.
Какой самый эффективный способ отладить эту ситуацию?
Результаты nmap для UDP будут неточными, поскольку у UDP нет явного указания на “порт открыт”. Отсутствие ответа ICMP “Port Unreachable” не означает, что порт открыт — он может быть закрыт в том смысле, что файрвол отбрасывает все пакеты. (Поэтому nmap говорит ‘open or filtered’, а не просто ‘open’.). Добавление --reason
к вашим сканированиям nmap может сделать это немного яснее, но единственная гарантированная проверка — это отправка фактического DHCP-запроса в качестве пробного.
Установите Wireshark или tcpdump (или используйте встроенный в Windows pktmon
). Запустите его (с захватом) на вашем сетевом интерфейсе, когда ваш компьютер пытается получить новый DHCP-лизинг (например, после ipconfig /release
). Вы должны увидеть DHCPDISCOVER от вашего компьютера, а затем все DHCPOFFER сообщения от каждого DHCP-сервера вместе с их MAC-адресами (а также IP-адресами и так далее).
(Вы также можете запустить DHCP-клиент, такой как dhcpcd
или dhclient
, в каком-то “режиме отладки”, чтобы он показывал все предложения DHCP, которые получает, но на самом деле вы получите больше информации от захвата пакетов в любом случае.)
Теперь, когда у вас есть список подозрительных MAC-адресов, найдите фактические устройства — согласно регулярным DHCP-лизенсиям или вашему инвентарю. Посмотрите через таблицы “подключенных клиентов” на ваших точках доступа Wi-Fi и через таблицы MAC-адресов на ваших Ethernet-коммутаторах (таблица MAC→порт, не ARP-таблица), чтобы определить, где именно они подключены — и обсудите это с их владельцами.
Если ваши коммутаторы не показывают таблицу MAC-ассоциаций, начните отключать устройства (разделите сеть пополам, чтобы увидеть, в какой половине находится устройство, повторите с меньшими половинками).
Многие Ethernet-коммутаторы также имеют функцию блокировки “недоверенных” портов от возможности отправлять DHCP-предложения (и объявления маршрутизаторов ICMPv6); вероятно, стоит включить эту функцию для пользовательских “доступных” портов.
На DHCP-клиентах, которые получают дублированные IP, начните с изучения опций, предоставленных с предложением DHCP. Существует ненулевая вероятность, что каждый DHCP-сервер ответит с чем-то, указывающим на него самого, как Router/Gateway или Nameserver или что-то еще.
Если это не помогает, выберите время, когда можно провести окно технического обслуживания, вероятно, в нерабочее время, потому что это прервет нормальные услуги.
На ваших утвержденных DHCP-серверах установите время аренды на что-то низкое, как 5~10 минут, чтобы было проще все сбросить.
Затем выключите ваши правильные DHCP-серверы и используйте тестовый клиент для выполнения DHCP-запроса.
В другом окне запустите анализатор пакетов, такой как wireshark, или, желательно, tcpdump:
# sudo tcpdump -i any -v -nn port 67 or port 68
10:00:18.982020 eth0 Out IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 66:ed:6e:c6:9d:56, length 300, xid 0x38e3094d, Flags [none]
Client-Ethernet-Address 66:ed:6e:c6:9d:56
Vendor-rfc1048 Extensions
DHCP-Message (53), length 1: Request
Parameter-Request (55), length 13:
Subnet-Mask (1), BR (28), Time-Zone (2), Default-Gateway (3)...
10:00:18.984436 eth0 In IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 334)
10.28.1.1.67 > 10.28.100.109.68: BOOTP/DHCP, Reply, length 306, xid 0x38e3094d, Flags [none]
Your-IP 10.28.100.109
Client-Ethernet-Address 66:ed:6e:c6:9d:56
Vendor-rfc1048 Extensions
DHCP-Message (53), length 1: ACK
* Server-ID (54), length 4: 10.28.1.1
Lease-Time (51), length 4: 7200
Subnet-Mask (1), length 4: 255.255.0.0
* Default-Gateway (3), length 4: 10.28.1.1
Domain-Name (15), length 14: "criggie.org.nz"
* Domain-Name-Server (6), length 8: 10.28.1.1,10.28.1.1
Netbios-Name-Server (44), length 4: 10.28.1.2
* NTP (42), length 4: 10.28.1.1
В этом случае 66:ed:6e:c6:9d:56
— это MAC-адрес клиента, и ответ DHCP пришел с 10.28.1.1
. Этот же IP фигурирует как DNS и NTP-сервер и т.д.
Как только у вас будет IP-адрес, быстро проверьте ARP-таблицу тестового хоста и получите MAC-адрес, прежде чем он истечет.
# arp -an
? (10.28.2.9) at a0:36:9f:b9:ef:52 [ether] on eth0
? (10.28.1.1) at 00:0d:b9:35:29:c4 [ether] on eth0
Итак, теперь вы знаете, что 00:0d:b9:35:29:c4 — это аппаратный MAC-адрес IP, который дал ответ DHCP.
Наконец, выясните, где в вашей сети находится этот IP/MAC-адрес. Простой поиск имени хоста по IP может дать вам что-то полезное:
# host 10.28.1.1
1.1.28.10.in-addr.arpa domain name pointer pfsense.criggie.org.nz.
или
$ dig -x 10.28.1.1
;; ANSWER SECTION:
1.1.28.10.in-addr.arpa. 1 IN PTR pfsense.criggie.org.nz.
Или если это для вас бессмысленно, нужно отследить MAC-адрес с помощью поиска OUI, например, через https://www.wireshark.org/tools/oui-lookup.html
Для меня он возвращает “00:0D:B9 PC Engines GmbH”, так что я знаю, что это APU или ALIX одноплатный ПК. Возможно, вы получите результат, который что-то для вас значит, или получите что-то общее, как “hp inc”
Ваш следующий шаг — просмотреть таблицы MAC на вашем коммутаторе, чтобы выяснить, к какому физическому порту подключен этот MAC-адрес. Это предполагает, что у вас есть хотя бы один управляемый Ethernet-коммутатор в вашей сети и вы можете в него залогиниться.
Это полностью зависит от того, какой у вас коммутатор, и будет сильно отличаться в зависимости от экосистемы. Вот как Juniper показывает, что устройство подключено к гигабитному порту 19:
root@sw1-poe> show ethernet-switching table brief | grep 00:0d:b9:35:29:c4
default 00:0d:b9:35:29:c4 Learn 0 ge-0/0/19.0
Тот же командой на коммутаторе Hasivo, показывает устройство на порту te1 (это требует введения MAC в верхнем регистре)
switch0# show mac address-table 00:0D:B9:35:29:C4
VID | MAC Address | Type | Ports
-----+-------------------+---------+----------
1 | 00:0D:B9:35:29:C4 | Dynamic | te1
Если у вас есть только неуправляемые коммутаторы, ваш единственный вариант — это многократная отправка ICMP-запросов IP, отключая части вашей LAN, пока пинг не остановится. Если удаленный хост не отвечает на ICMP-запросы, используйте arping
, который требует прав root:
~$ sudo arping 10.28.1.1
ARPING 10.28.1.1
60 bytes from 00:0d:b9:35:29:c4 (10.28.1.1): index=0 time=182.578 usec
60 bytes from 00:0d:b9:35:29:c4 (10.28.1.1): index=1 time=156.675 usec
60 bytes from 00:0d:b9:35:29:c4 (10.28.1.1): index=2 time=198.373 usec
^C
--- 10.28.1.1 statistics ---
3 packets transmitted, 3 packets received, 0% unanswered (0 extra)
rtt min/avg/max/std-dev = 0.157/0.179/0.198/0.017 ms
Наконец, как только вы найдете загадочный DHCP-сервер, объясните доброжелательно тому, кто это сделал, какие проблемы это вызвало и почему это доставило вам боль.
Я управлял двумя разъединенными DHCP-серверами в течение нескольких лет в одной сети без проблем. Решение состояло в том, чтобы администратор (я) убедился, что оба сервера предоставляют один и тот же набор опций с правильными значениями, и чтобы у каждого был свой отдельный диапазон как динамический пул, который не перекрывается. Я также установил много резервирований DHCP, чтобы много хостов всегда получали один и тот же “статический” IP, но я мог изменять опции, такие как nameserver, всего на двух DHCP-серверах.
Вы можете это сделать – дайте нам знать, как у вас это получилось.
.
Ответ или решение
Итак, у вас возникли проблемы с дублирующимися DHCP-серверами в локальной сети, которые приводят к двойному назначению IP-адресов для некоторых устройств. Это распространённая проблема в корпоративных и даже в некоторых домашних сетях, где больше одного устройства может быть настроено на роль DHCP-сервера без надлежащего контроля. Чтобы решить эту проблему, внимательно следуйте приведённым ниже шагам, которые помогут выявить и нейтрализовать "шума" лишние DHCP-серверы.
Теория
DHCP (Dynamic Host Configuration Protocol) – это сетевой протокол, используемый для автоматизированного назначения IP-адресов и других сетевых параметров устройствам в сети, чтобы они могли быстро и без ручного вмешательства взаимодействовать с другими IP-сетями. Когда у вас несколько DHCP-серверов на одной сети, они могут выдавать конфликтующие IP-адреса или другие параметры. Это может привести к таким проблемам, как конфликт IP-адресов, нарушение работоспособности сети и снижение эффективности работы.
Пример
Представим, что вы заметили нестабильное поведение в вашей сети: два устройства получили одинаковый IP-адрес и, как результат, возникают проблемы с их подключением. После сканирования сети с помощью утилиты nmap
и открытия UDP-портов 67 вы обнаружили несколько дополнительных DHCP-серверов. Это могут быть компьютеры ваших коллег или встраиваемые Linux-устройства. Это явная индикация, что необходимо идентифицировать и устранить проблемные устройства.
Приложение
-
Установите и используйте анализатор пакетов: Установите Wireshark или tcpdump для анализа трафика, проходящего через вашу сеть. Эти инструменты помогут выяснить, какие серверы отвечают на DHCP-запросы.
-
Захватите и проанализируйте трафик: Выполните сбор сетевого трафика при попытке вашего компьютера получить новый DHCP-арендный договор (например, после команды
ipconfig /release
иipconfig /renew
на Windows или соответствующих команд на Linux). Просмотрите полученные от DHCP-серверов предложения (DHCPOFFER). -
Определите MAC-адреса подозрительных устройств: В захваченном трафике вы увидите MAC-адреса всех DHCP-серверов, которые отправили предложения. Это поможет сузить круг подозреваемых устройств.
-
Поиск физических устройств: Используйте таблицы подключенных клиентов на ваших Wi-Fi точках доступа или таблицы MAC-адресов на коммутаторах для определения физического местоположения устройств с аналогичными MAC-адресами. Это поможет идентифицировать ответственные устройства.
-
Управление сетевыми коммутаторами: Если ваши коммутаторы поддерживают настройку блокировки "неутвержденных" портов от отправки DHCP-предложений, включите эту функцию. Это предотвратит потенциальные повторные проблемы в будущем.
-
Проверка параметров DHCP клиентами: Проверьте параметры, полученные устройствами, у которых возникают конфликты. Сервер может ответить другими IP-адресами для сетевых услуг, таких как маршрутизатор, шлюз или DNS-сервер, что может указывать на сервер, вызывающий проблему.
-
Отладка и мониторинг: Отключите все разрешённые DHCP-серверы на время, когда это возможно, и наблюдайте за сетью. Используйте тестовые клиенты для инициирования новых DHCP-запросов и следите за тем, какой сервер отвечает.
-
Проверка сетевого устройства: Выясните местоположение устройства с помощью ARP-запросов или таблиц ARP.
-
Обратитесь к владельцам устройств: После идентификации устройства обсудите проблему с его владельцем. Объясните потенциальные риски и предложите решения по его правильной настройке.
-
Оптимизация и настройка сети: Убедитесь в том, что все ваши DHCP-серверы настроены корректно, чтобы избежать дальнейших конфигурационных конфликтов. Можете настроить их таким образом, чтобы они использовали разные диапазоны IP-адресов и имели одинаковые настройки, такие как шлюзы и DNS-серверы.
Следуя этим шагам, вы сможете локализовать и устранить проблему с дублирующимися DHCP-серверами в вашей сети. Это не только улучшит производительность сети, но и предотвратит потенциальные будущие конфликты.