ネットワーク名前空間Xで実行されているdnsmasq
のインスタンスがあり、ネットワーク名前空間Y内からdhclient
(またはその他のdhcpクライアント)を実行して、特定のインターフェイスでIPアドレスを取得します。 2つのネットワーク名前空間は同じopenvswitch
ブリッジ上にあり、それを介して通信します。
dnsmasq
が、すべてのDHCPパケットが宛先名前空間に迅速に配信されることを示している場合でも、tcpdump
が応答するのに10〜30秒かかることがわかります。
なぜそんなに時間がかかるのですか?この遅延を減らす方法はありますか?
これは、11秒後にIPアドレスが割り当てられる/ var/log/syslogの例です。
Apr 4 14:31:27 localhost dhclient: Listening on LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr 4 14:31:27 localhost dhclient: Sending on LPF/_0.ping/ae:ca:22:bc:3c:7b
Apr 4 14:31:27 localhost dhclient: Sending on Socket/fallback
Apr 4 14:31:27 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:33 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:48 localhost dhclient: DHCPDISCOVER on _0.ping to 255.255.255.255 port 67 interval 3
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPDISCOVER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPOFFER(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dhclient: DHCPREQUEST on _0.ping to 255.255.255.255 port 67
Apr 4 14:31:48 localhost dhclient: DHCPOFFER from 192.168.31.1
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPREQUEST(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: DHCPACK(_0.dhcp) 192.168.31.110 ae:ca:22:bc:3c:7b mymachine
Apr 4 14:31:48 localhost dnsmasq-dhcp[11719]: not giving name mymachine to the DHCP lease of 192.168.31.110 because the name exists in /etc/hosts with address 127.0.0.1
Apr 4 14:31:48 localhost dhclient: DHCPACK from 192.168.31.1
Apr 4 14:31:48 localhost dhclient: ntp-servers: expecting at least 4 bytes; got 0
Apr 4 14:31:48 localhost dhclient: bound to 192.168.31.110 -- renewal in 33935 seconds.
dnsmasq
インスタンスは、次のコマンドで起動されます。
dnsmasq --dhcp-range=set:tag0,192.168.31.100,192.168.31.150,24h -l /tmp/dnsmasq-leasefile.dhcp.dhcp --dhcp-option=tag:tag0,option:router,192.168.31.2 --dhcp-option=tag:tag0,option:dns-server,9.9.9.9 --dhcp-option=tag:tag0,42
[〜#〜] edit [〜#〜]わかりました、もう数回実行しましたが、そこにパターンが表示されていると思います。 DHCPクライアントは、2つのDHCP要求を送信することから開始しますが、どちらも応答されません。 DHCP検出が送信されるとすぐに、dnsmasq
が応答します。 dhclient
が最初にDHCP要求を試行する理由は、/var/lib/dhcp/dhclient.leases
内の同じインターフェイスの以前のリースを確認し、そこに表示されるIPアドレスを要求しようとするためです。そのようなファイルを削除するとすぐに、dnsmasq
からの応答が即座に生成されます。 2つのオプションがあります。
dhclient
にリースファイルを使用しないように指示します(方法はわかりません)が、これは実際には理想的ではありません...dnsmasq
に指示します。これどうやってするの?答えは、dnsmasqで--dhcp-authoritative
オプションを使用することです。問題は、毎回dnsmasqサーバーを再起動していたため、リースファイルがありませんでしたが、dhclientには独自のリースファイルがありました。要求されたIPアドレスを独自のリースファイルで確認できないため、dnsmasqはdhcp検出メッセージが発行されるまで待機します。