Блог "Дети ОИТа"
/поиск

DHCP не выдаёт IPv4-адрес

> [!INFO] Применимость > **ALT Linux 10.4–11.x** · **NetworkManager** · локальная работа через CLI/TTY > Рассматриваются только проверки и исправления, доступные непосредственно на ПК. > > Симптомы:

[!INFO] Применимость
ALT Linux 10.4–11.x · NetworkManager · локальная работа через CLI/TTY
Рассматриваются только проверки и исправления, доступные непосредственно на ПК.

Симптомы:

  • IPv4-адрес отсутствует;
  • соединение не активируется;
  • назначен адрес 169.254.x.x;
  • NetworkManager сообщает об ошибке DHCP.

Оглавление

  • [[#Быстрый порядок действий|Быстрый порядок действий]]
  • [[#Найти интерфейс и профиль|Найти интерфейс и профиль]]
  • [[#Проверить физическое соединение|Проверить физическое соединение]]
  • [[#Проверить настройки DHCP|Проверить настройки DHCP]]
  • [[#Исправить профиль|Исправить профиль]]
  • [[#Повторно запросить адрес|Повторно запросить адрес]]
  • [[#Проверить журналы|Проверить журналы]]
  • [[#Проверить обмен DHCP-пакетами|Проверить обмен DHCP-пакетами]]
  • [[#Проверить локальную фильтрацию|Проверить локальную фильтрацию]]
  • [[#Определить сторону неисправности|Определить сторону неисправности]]
  • [[#Откатить изменения|Откатить изменения]]

Быстрый порядок действий

nmcli -f DEVICE,TYPE,STATE,CONNECTION device status
ip -br link
ip -br -4 address
nmcli connection show --active
journalctl -u NetworkManager -b -n 100 --no-pager

Далее:

  1. Проверить физический линк.
  2. Убедиться, что профиль использует ipv4.method auto.
  3. Создать резервную копию профиля.
  4. Очистить остаточные статические параметры.
  5. Переподключить профиль.
  6. Проверить журнал и DHCP-пакеты.
  7. Определить, находится ли неисправность на ПК или за его пределами.

Найти интерфейс и профиль

nmcli -f DEVICE,TYPE,STATE,CONNECTION device status

Пример:

DEVICE  TYPE      STATE         CONNECTION
enp1s0  ethernet  disconnected  Проводное соединение 1

Подставить найденные значения:

IFACE="enp1s0"
PROFILE="Проводное соединение 1"

Проверить состояние устройства:

nmcli -f \
GENERAL.DEVICE,GENERAL.TYPE,GENERAL.STATE,GENERAL.REASON,GENERAL.CONNECTION \
device show "$IFACE"

Проверить, что интерфейс управляется NetworkManager:

nmcli -f DEVICE,STATE device status

Если указано unmanaged, сначала требуется устранить причину состояния unmanaged.

Проверить физическое соединение

ip link show dev "$IFACE"
cat "/sys/class/net/$IFACE/carrier"

Ожидается:

LOWER_UP
1

Проверить счётчики:

ip -s link show dev "$IFACE"

При наличии ethtool:

sudo ethtool "$IFACE"

Ожидается:

Link detected: yes

Если линка нет:

  • проверить кабель;
  • проверить разъёмы;
  • переподключить кабель;
  • проверить другой заведомо исправный кабель;
  • проверить, не отключён ли интерфейс программно.

Поднять интерфейс:

sudo ip link set dev "$IFACE" up

Повторно проверить:

cat "/sys/class/net/$IFACE/carrier"

Предупреждение

Тут требуется проверка (состояния порта коммутатора, административного отключения порта и физического линка на стороне коммутатора).

Проверить настройки DHCP

nmcli -f \
connection.id,connection.interface-name,connection.autoconnect,\
ipv4.method,ipv4.addresses,ipv4.gateway,ipv4.dns,ipv4.routes \
connection show "$PROFILE"

Для DHCP ожидается:

connection.autoconnect: yes
ipv4.method:            auto
ipv4.addresses:         --
ipv4.gateway:           --
ipv4.dns:               --
ipv4.routes:            --

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

nmcli -f \
ipv4.ignore-auto-routes,ipv4.ignore-auto-dns,ipv4.never-default,ipv4.may-fail \
connection show "$PROFILE"

Проверить привязку профиля к интерфейсу:

nmcli -g connection.interface-name connection show "$PROFILE"

Проверить фактический MAC-адрес:

nmcli -g GENERAL.HWADDR device show "$IFACE"

Проверить, не задан ли подменённый MAC-адрес:

nmcli -f 802-3-ethernet.cloned-mac-address connection show "$PROFILE"

Не изменять MAC-адрес без подтверждения: он может использоваться для DHCP-резервации или контроля доступа.

Исправить профиль

Создать резервную копию:

BACKUP="${PROFILE}-dhcp-backup-$(date +%Y%m%d-%H%M%S)"

sudo nmcli connection clone "$PROFILE" "$BACKUP"
sudo nmcli connection modify "$BACKUP" connection.autoconnect no

Перевести профиль в чистый режим DHCP:

sudo nmcli connection modify "$PROFILE" \
  connection.interface-name "$IFACE" \
  connection.autoconnect yes \
  ipv4.method auto \
  ipv4.addresses "" \
  ipv4.gateway "" \
  ipv4.dns "" \
  ipv4.routes "" \
  ipv4.ignore-auto-routes no \
  ipv4.ignore-auto-dns no \
  ipv4.never-default no

Настройки IPv6 этой командой не изменяются.

Повторно запросить адрес

sudo nmcli connection down "$PROFILE"
sudo nmcli connection up "$PROFILE" ifname "$IFACE"

Проверить состояние:

nmcli -f \
GENERAL.STATE,GENERAL.REASON,GENERAL.CONNECTION,IP4.ADDRESS,IP4.GATEWAY,IP4.DNS \
device show "$IFACE"

Проверить адрес и маршруты:

ip -br -4 address show dev "$IFACE"
ip -4 route

Успешный результат:

  • получен адрес рабочей подсети;
  • присутствует маршрут до локальной сети;
  • присутствует маршрут по умолчанию, если он передаётся DHCP;
  • получены DNS-серверы.

Проверить журналы

Последние сообщения NetworkManager:

journalctl -u NetworkManager -b -n 100 --no-pager

Только сообщения по DHCP и интерфейсу:

journalctl -u NetworkManager -b --no-pager \
  | grep -Ei "$IFACE|dhcp4|lease|timeout|failed|carrier"

Наблюдать за повторной активацией:

sudo journalctl -fu NetworkManager

В другом терминале или TTY:

sudo nmcli connection down "$PROFILE"
sudo nmcli connection up "$PROFILE" ifname "$IFACE"

Частые сообщения:

Сообщение Значение
carrier: link connected Физический линк обнаружен
DHCP4: request timed out DHCP-сервер не ответил вовремя
ip-config-unavailable Не удалось получить IPv4-конфигурацию
no lease DHCP-аренда не получена
carrier: link disconnected Физический линк пропал
activation failed Профиль не удалось активировать

Проверить обмен DHCP-пакетами

Примечание

Требуется установленная утилита tcpdump.

Запустить захват:

sudo timeout 30 tcpdump \
  -ni "$IFACE" \
  -e -vvv \
  'udp port 67 or udp port 68'

В другом терминале или TTY переподключить профиль:

sudo nmcli connection down "$PROFILE"
sudo nmcli connection up "$PROFILE" ifname "$IFACE"

Ожидаемый обмен:

DHCPDISCOVER
DHCPOFFER
DHCPREQUEST
DHCPACK

Сохранить захват в файл:

sudo timeout 30 tcpdump \
  -ni "$IFACE" \
  -s 0 \
  -w /tmp/dhcp-check.pcap \
  'udp port 67 or udp port 68'

Прочитать файл:

sudo tcpdump -nn -e -vvv -r /tmp/dhcp-check.pcap

Проверить локальную фильтрацию

systemctl is-active firewalld
sudo nft list ruleset

Если используется iptables:

sudo iptables -S
sudo iptables -L -n -v

Искать правила DROP или REJECT, затрагивающие:

UDP 67 — DHCP-сервер
UDP 68 — DHCP-клиент

Не очищать правила и не отключать межсетевой экран целиком. Сначала определить конкретное блокирующее правило.

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

ps -ef | grep -E '[d]hclient|[d]hcpcd|[u]dhcpc'

Если отдельный клиент запущен не NetworkManager, он может конфликтовать с ним.

Определить сторону неисправности

DHCPDISCOVER не выходит с ПК

Проблема находится на хосте.

Проверить:

  • активность NetworkManager;
  • правильность профиля;
  • состояние интерфейса;
  • состояние managed;
  • локальную фильтрацию;
  • драйвер сетевой карты;
  • конфликтующий DHCP-клиент;
  • журнал NetworkManager.

DHCPDISCOVER выходит, но DHCPOFFER не приходит

ПК формирует запрос правильно. Ответ отсутствует за пределами хоста.

Предупреждение

Тут требуется проверка (VLAN порта коммутатора, прохождения широковещательного DHCP-трафика, DHCP Relay и доступности DHCP-сервера).

DHCPOFFER приходит, но DHCPREQUEST не выходит

Проблема находится на хосте.

Проверить:

  • журнал NetworkManager;
  • локальную фильтрацию;
  • выбранный профиль;
  • MAC-адрес интерфейса;
  • наличие второго DHCP-клиента;
  • ошибки драйвера.

DHCPREQUEST выходит, но DHCPACK не приходит

Сервер получил или должен был получить запрос, но аренда не подтверждена.

Предупреждение

Тут требуется проверка (состояния DHCP-пула, резервации по MAC-адресу, политик DHCP-сервера, DHCP Snooping и прохождения ответа через DHCP Relay).

DHCPACK приходит, но адрес не применяется

Проблема находится на хосте.

journalctl -u NetworkManager -b --no-pager \
  | grep -Ei "$IFACE|dhcp4|conflict|decline|failed"

Проверить наличие адреса на другом интерфейсе:

ip -br -4 address

Проверить ошибки ядра и драйвера:

journalctl -k -b --no-pager \
  | grep -Ei "$IFACE|net|link|reset|timeout|firmware"

DHCP сообщает об отсутствии свободных адресов

Предупреждение

Тут требуется проверка (наличия свободных адресов в DHCP-пуле и корректности времени аренды на DHCP-сервере).

DHCP работает у других ПК, но не у текущего MAC-адреса

Зафиксировать MAC-адрес:

nmcli -g GENERAL.HWADDR device show "$IFACE"

Предупреждение

Тут требуется проверка (DHCP-резервации, блокировки MAC-адреса, Port Security, NAC и списков разрешённых устройств).

Откатить изменения

Отключить изменённый профиль:

sudo nmcli connection down "$PROFILE"
sudo nmcli connection modify "$PROFILE" connection.autoconnect no

Вернуть резервную копию:

sudo nmcli connection modify "$BACKUP" connection.autoconnect yes
sudo nmcli connection up "$BACKUP" ifname "$IFACE"

Проверить:

nmcli -f DEVICE,STATE,CONNECTION device status
ip -br -4 address
ip -4 route