(На самом деле нет) (с)
Собственно, сам по себе DHCP не глючил, путаница возникла из-за особенностей правил iptables. Я получал IP-адрес устройством один раз, а потом DHCP-сервер (поставил udhcpd) переставал откликаться на запросы. Грешил на udhcpd, думал ставить полноценную версию; временно использовал Tp-link 6020 как DHCP-сервер и так далее. Проблема оказалась немного в другом месте 🙂
Сам скрипт я рассмотрю чуть позже, сейчас только касательно нужных правил.
В скрипте цепочки INPUT/FORWARD проходят через src filter – определение адреса источника. Вообще, практически весь скрипт, базой которого является GUI для iptables – Guarddog – базируется на направлениях между IP-адресами. Как там в Guarddog’e разрешался вопрос с протоколами типа DHCP – сейчас не знаю.
У себя, в итоге, в зоне srcfilt добавил правило по пропуску трафика для UDP-портов 67/68, если запрос пришел с br0 (интерфейс в локальную сеть):
"${ipt}" -A srcfilt -s $homenet/24 -i br0 -j z2 # трафик с локальных пользовательских компьютеров
"${ipt}" -A srcfilt -p udp --dport 67:68 -i br0 -j ACCEPT # DHCP requests
И поначалу вроде все работало. Однако, вчера, настроив fwlogwatch и в целом активно изучая логи (а сегодня продолжив заниматься этим делом) заметил, что на ноуте DHCP-сервер стучится в никуда, хотя IP-адрес есть, в lease-таблице ноут присутствует. Трафик приходит на сервер, судя по tcpdump, но udhcpd на него не отвечает. Стал смотреть цепочки в iptables, чтобы посмотреть, увеличиваются ли счетчики для правила для DHCP и тут до меня дошло…
Что происходит на самом деле. Устройство, не имея адреса, попадает под действие только второго правила и успешно получает IP-адрес. Далее, так как IP-адрес уже есть, все запросы проходят через первое правило. Там у меня разрешения на DHCP-запросы нет (я ж думал, что достаточно одного разрешения) и трафик в дальнейшем дропается. Устройство, не получив продление аренды IP-адреса, судя по логам, просто продолжает использовать адрес из своего кэша и все какое-то время работает нормально. Если же аренда полностью устареет – по-идее, снова попадем на действие второго правила, но до этой проверки я не дошел.
В итоге поменял местами правила, теперь DHCP-запросы из локальной сети проходят всегда.