У меня есть экземпляр dnsmasq
работает в сетевом пространстве имен X, и я запускаю dhclient
(или любого другого DHCP-клиента) из сетевого пространства имен Y для получения IP-адреса на заданном интерфейсе. Два сетевых пространства имен находятся в одном openvswitch
мост, через который они общаются.
я вижу это dnsmasq
на ответ требуется время, от 10 до 30 секунд, даже если tcpdump
показывает, что все пакеты DHCP оперативно доставляются в целевое пространство имен.
Почему это так долго? Есть ли способ уменьшить эту задержку?
Вот пример из / var / log / syslog, где IP-адрес назначается через 11 секунд:
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
РЕДАКТИРОВАТЬ Хорошо, я запустил его еще несколько раз, и мне кажется, я вижу здесь закономерность. Клиент DHCP начинает с отправки двух запросов DHCP, на которые нет ответа. Как только будет отправлено обнаружение DHCP, dnsmasq
ответы. Причина почему dhclient
первая попытка DHCP-запроса заключается в том, что он видит предыдущую аренду того же интерфейса в /var/lib/dhcp/dhclient.leases
и пытается запросить отображаемый там IP-адрес. Как только я удалю такой файл, ответ от dnsmasq
генерируется мгновенно. Я вижу два варианта:
dhclient
не использовать его файл аренды (не знаю, как), но это не совсем идеально ...dnsmasq
для ответа на запросы, которые не следуют за сообщением об обнаружении. Как я могу это сделать?Ответ - использовать --dhcp-authoritative
опция в dnsmasq. Проблема заключалась в том, что я каждый раз перезапускал сервер dnsmasq, поэтому у него не было файла аренды, но у dhclient был свой собственный файл аренды. Не имея возможности проверить запрошенный IP-адрес в собственном файле аренды, dnsmasq ждет, пока не будет выдано сообщение обнаружения dhcp.