Назад | Перейти на главную страницу

Могу ли я запросить конкретный IP-адрес через DHCP, не отклоняя предложение другого адреса от DHCP-сервера?

Используя isc-dhcp-client на сервере ubuntu 16.04, есть параметр, который звучит так, как будто он должен делать то, что я хочу:

send dhcp-requested-address 10.23.33.254;

Когда эта опция присутствует в моем файле dhclient.conf, мой клиент делает именно то, что я хочу: всегда получает аренду для запрошенного адреса от DHCP-сервера в моей частной сети, где диапазон DHCP составляет 10.23.33.0/24. Однако, если я подключаю компьютер к сети, где запрошенный адрес не находится в диапазоне адресов DHCP сервера, сервер предлагает другой адрес, а isc-dhcp-client просто отправляет NAK, потому что ему не предоставляется запрошенный адрес.

По сути, я хочу

клиент: "привет, можно мне 10.23.33.254"
server: "нет, вы не можете. здесь, вместо 192.168.1.23"
клиент: "хорошо, спасибо"

Вместо этого происходит то, что

клиент: "привет, можно мне 10.23.33.254"
server: "нет, вы не можете. здесь, вместо 192.168.1.23"
клиент: "это не то, что я хочу. Можно мне 10.23.33.254?"
сервер: «нет, ты не можешь ...» (повторять этот цикл до бесконечности)

Кто-нибудь знает, возможно ли то, что я хочу, кроме написания собственного DHCP-клиента?

Использовать блок аренды вместо. Методом проб и ошибок этот блок конфигурации игнорируется в файле dhclient.conf, но используется в файле аренды (по умолчанию /var/lib/dhcp/dhclient.leases если не переопределено с помощью -lf, как при запуске из NetworkManager)

Просто создайте минимальный файл аренды с истекшим сроком продления и повторной привязки (чтобы избежать нескольких повторных попыток), но все еще с датой истечения срока действия в будущем (чтобы не сразу забыть об этом и немедленно попытаться выполнить DISCOVER вместо ЗАПРОСА, и использовать этот IP-адрес, если нет DHCP сервер вообще отвечает). Сохраните этот файл без изменений и копируйте его каждый раз перед запуском dhclient.

Вот такой минимальный файл из моего контейнера stretch-amd64, работающий до тех пор, пока DHCP-сервер (здесь dnsmasq) не имеет другой аренды для этого клиента, уже установленной. Просто скопируйте его в файл аренды перед запуском dhclient.

lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  renew 0 2000/1/1 00:00:01;
  rebind 0 2000/01/01 00:00:01;
  expire 0 2038/1/1 00:00:01;
}

Попытка в локальной сети с DHCP-сервером, обслуживающим 10.0.3.0/24, который еще не знает этого клиента:

# dhclient -v eth0
Internet Systems Consortium DHCP Client 4.3.5
Copyright 2004-2016 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPREQUEST of 10.0.3.222 on eth0 to 255.255.255.255 port 67
DHCPACK of 10.0.3.222 from 10.0.3.1
bound to 10.0.3.222 -- renewal in 1486 seconds.

новый файл аренды /var/lib/dhcp/dhclient.leases:

lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  renew 6 2000/01/01 00:00:01;
  rebind 6 2000/01/01 00:00:01;
  expire never;
}
lease {
  interface "eth0";
  fixed-address 10.0.3.222;
  option subnet-mask 255.255.255.0;
  option routers 10.0.3.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.3.1;
  option dhcp-server-identifier 10.0.3.1;
  option dhcp-renewal-time 1800;
  option broadcast-address 10.0.3.255;
  option dhcp-rebinding-time 3150;
  option host-name "stretch-amd64";
  renew 0 2017/10/29 19:57:41;
  rebind 0 2017/10/29 20:24:34;
  expire 0 2017/10/29 20:32:04;
}

Попытка за пределами диапазона IP:

Listening on LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   LPF/eth0/xx:xx:xx:xx:xx:xx
Sending on   Socket/fallback
DHCPREQUEST of 10.0.4.222 on eth0 to 255.255.255.255 port 67
DHCPREQUEST of 10.0.4.222 on eth0 to 255.255.255.255 port 67
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
DHCPREQUEST of 10.0.3.249 on eth0 to 255.255.255.255 port 67
DHCPOFFER of 10.0.3.249 from 10.0.3.1
DHCPACK of 10.0.3.249 from 10.0.3.1
bound to 10.0.3.249 -- renewal in 1411 seconds.

Этот DHCP-сервер, похоже, не отправляет NAK, но в любом случае я уверен, что вы уловили суть, он работает.

Если DHCP-сервера нет, через некоторое время dhclient настроит IP-адрес, так как срок его действия не истек, и произведет демонизацию. Без других опций (трансляция ...) это будет / 32, потому что информация недоступна. При необходимости добавьте другие значения в файл аренды "шаблона". Вот это будет:

option subnet-mask 255.255.255.0;
option routers 10.0.3.1;
option domain-name-servers 10.0.3.1;
option broadcast-address 10.0.3.255;

В таком случае при запуске dhclient:

[...]

DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 12
No DHCPOFFERS received.
Trying recorded lease 10.0.3.222
PING 10.0.3.1 (10.0.3.1) 56(84) bytes of data.

--- 10.0.3.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.240/0.240/0.240/0.000 ms
bound: immediate renewal.
DHCPREQUEST of 10.0.3.222 on eth0 to 255.255.255.255 port 67
root@stretch-amd64:~#