web-dev-qa-db-ja.com

DHCPサーバーからの別のアドレスの提供を拒否せずに、DHCPを介して特定のIPアドレスを要求できますか?

Ubuntuサーバー16.04でisc-dhcp-clientを使用すると、私が望むことを行うように聞こえるオプションがあります:

send dhcp-requested-address 10.23.33.254;

このオプションがdhclient.confファイルにある場合、クライアントは私が望んでいるとおりに動作します。DHCP範囲が10.23.33.0/24であるプライベートネットワーク上のDHCPサーバーから、要求されたアドレスのリースを常に取得します。ただし、要求されたアドレスがサーバーのDHCPアドレス範囲にないネットワークにコンピューターを接続すると、サーバーは別のアドレスを提供し、isc-dhcp-clientは要求されたアドレスが与えられないため、NAKを送信するだけです。

基本的に、私が欲しいのは

クライアント:「こんにちは、10.23.33.254を使用できますか」
サーバー:「いいえ、できません。ここでは、代わりに192.168.1.23を使用してください」
クライアント:「大丈夫、ありがとう」

代わりに、何が起こっているか

クライアント:「こんにちは、10.23.33.254を使用できますか」
サーバー:「いいえ、できません。ここでは、代わりに192.168.1.23を使用してください」
クライアント:「それは私が望んでいることではありません。10.23.33.254を使用できますか?」
サーバー:「いいえ、できません...」(このサイクルを永久に繰り返します)

自分のDHCPクライアントを作成する前に、私が望むことが可能かどうか誰かが知っていますか?

6
notatoad

代わりに リースブロック を使用してください。試行錯誤から、この構成ブロックはdhclient.confファイルから無視されますが、リースファイルで使用されます(デフォルト/var/lib/dhcp/dhclient.leases-NetworkManagerから実行する場合のように、-lfでオーバーライドしない限り)

(数回の再試行を回避するために)期限切れの更新と再バインドが行われた最小限のリースファイルを作成するだけで、将来の有効期限(すぐにそれを忘れずに、REQUESTの代わりにすぐにDISCOVERを試行し、ない場合はこのIPを使用します。 DHCPサーバーがまったく応答しない)。このファイルは変更せずに、dhclientを実行する前に毎回コピーしてください。

DHCPサーバー(ここではdnsmasq)がこのクライアントに対して他のリースを既に設定していない限り、私のストレッチAMD64コンテナからのこのような最小限のファイルがここにあります。 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を提供し、このクライアントをまだ認識していないLANで試みます。

# 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:~# 
3
A.B