Posso solicitar um endereço IP específico via DHCP sem rejeitar uma oferta de endereço diferente do servidor DHCP?

5

Usando o isc-dhcp-client no ubuntu server 16.04, existe uma opção que parece que deve fazer o que eu quero:

send dhcp-requested-address 10.23.33.254;

Quando esta opção está presente no meu arquivo dhclient.conf, meu cliente faz exatamente o que eu quero: sempre obtém uma concessão para o endereço solicitado do servidor DHCP na minha rede privada, onde o intervalo de DHCP é 10.23.33.0/24. No entanto, se eu conectar o computador a uma rede em que o endereço solicitado não esteja no intervalo de endereços DHCP do servidor, o servidor oferecerá um endereço diferente e o isc-dhcp-client apenas enviará um NAK porque não está recebendo o endereço solicitado.

Essencialmente, o que eu quero é

cliente: "ola, posso ter 10.23.33.254"
servidor: "não, você não pode. aqui, tem 192.168.1.23 em vez disso"
cliente: "ok, obrigado"

Em vez disso, o que está acontecendo é

cliente: "ola, posso ter 10.23.33.254"
servidor: "não, você não pode. aqui, tem 192.168.1.23 em vez disso"
cliente: "não é isso que eu quero. posso ter 10.23.33.254?"
servidor: "não, você não pode ..." (repita este ciclo para sempre)

alguém sabe se o que eu quero é possível, curto de escrever meu próprio cliente DHCP?

    
por notatoad 29.10.2017 / 19:32

1 resposta

2

Use o bloco de aluguel . De tentativa e erros, este bloco de configuração é ignorado do arquivo dhclient.conf mas usado no arquivo de concessões (padrão /var/lib/dhcp/dhclient.leases a menos que seja substituído por -lf, como quando executado a partir do NetworkManager)

Basta criar um arquivo de concessões mínimo com renovação e religação expiradas (para evitar algumas tentativas), mas ainda uma data de expiração futura (para não esquecê-lo imediatamente e tentar imediatamente um DISCOVER em vez de um REQUEST e usar esse IP se não houver nenhuma resposta do servidor DHCP). Mantenha este arquivo inalterado e copie-o toda vez antes de executar o dhclient.

Aqui está um arquivo tão pequeno, do meu contêiner stretch-amd64, funcionando desde que o servidor DHCP (dnsmasq aqui) não tenha outra concessão para esse cliente já definido. Basta copiá-lo sobre o arquivo de concessão antes de executar o 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;
}

Tentativa em uma LAN com um servidor DHCP atendendo a 10.0.3.0/24 e que ainda não conhece esse cliente:

# 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.

novo arquivo de concessão /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;
}

Tentativa quando fora do intervalo de IPs:

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.

Este servidor DHCP não parece enviar NAKs, mas de qualquer maneira eu tenho certeza que você entendeu, funciona.

Se não houver um servidor DHCP, após algum tempo, o dhclient irá configurar o IP porque ele não expirou na concessão e na daemonização. Sem as outras opções (transmissão ...), isso será um / 32 porque as informações não estão disponíveis. Adicione os outros valores no arquivo de concessão "modelo", se necessário. Aqui isso seria:

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;

Nesse caso, ao executar o 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:~# 
    
por 29.10.2017 / 20:46