Я отвечу на № 2: Нет.
При получении IP-адреса dhcp демон создает неструктурированный сокет к сетевому интерфейсу и обрабатывает сам протокол UDP. Таким образом пакеты UDP никогда не проходят iptables.
Причина dhcp демон должен реализовать UDP, состоит в том, что ядро может только обработать UDP (на самом деле весь комплект TCP/IP), когда интерфейс имеет IP-адрес. Ранее демоны dhcp сначала дали бы интерфейсу IP-адрес 0.0.0.0, но это больше не работает.
Добавление
$IPT -I INPUT -i $INTIF -p udp --dport 67:68 --sport 67:68 -j ACCEPT
заставлю DHCPD обновить быстрее :) Это должно быть работы оба ВВОДА И ВЫВОДА стороны. Можно ОТБРОСИТЬ dhcpd с ebtables, не с iptables. DHCPD, слушающий в 0.0.0.0, не в IP
Мое недавнее наблюдение на OpenWRT Kamikaze 7.09 = 2.4.34 и udhcpc из busybox 1.4.2:
У меня есть политика «ПРИНЯТЬ» в цепочке OUTPUT и в направлении INPUT , изначально я полагался на это классическое универсальное правило:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
, чтобы разрешить ответы DHCP в (на мой udhcpc) на интерфейсе WAN. Т.е. именно здесь восходящий DHCP-сервер моего интернет-провайдера назначает мне IP-адрес.
Обратите внимание на разницу между начальным DHCP-обменом (обнаружение, предложение, запрос, подтверждение) и продлением аренды DHCP (запрос, подтверждение).
] После загрузки udhcpc запускает полный начальный обмен. Этот обмен будет успешным. И еще одно или два обновления тоже будут успешными - просто просьба и подтверждение. DHCP-сервер моего интернет-провайдера обычно запрашивает время обновления от примерно часа до 1,5 часов, поэтому мой DHCP-клиент запрашивает обновление каждые 30-45 минут (это поведение основано на RFC).
Но примерно на третьем или четвертое обновление, стало бы интересно. TCPdump покажет около трех попыток обновления, за которыми последует полный первоначальный обмен - всего за несколько минут или даже секунд. Как будто udhcpc не понравилось то, что он получил обратно :-( и в конечном итоге будет удовлетворен полным обменом. После этого будет выполнено еще одно обновление через полчаса ... и история повторится снова.
Я подумал что, возможно, что-то не так с отслеживанием соединения в ядре. Как будто запись conntrack истекает через два часа или около того, а более поздние обновления DHCP терпят неудачу, потому что ACK от сервера фактически не позволяет udhcpc прослушивать сокет. Обратите внимание, что tcpdump (libpcap) прослушивает необработанный интерфейс и может видеть все входящие пакеты, прежде чем они станут объектом iptables. Как только udhcpc отказывается от продлений и, в отчаянии, пытается начать с нуля, используя полный обмен (начиная с DISCOVER), ядро создает новую запись conntrack и может еще некоторое время понимать связанные пакеты ...
Конечно, как только я добавил что-то вроде:
iptables -A INPUT -i $OUT_IF -p udp --sport 67 --dport 68 -j ACCEPT
, кажется, что обновления работают вечно.
Вы можете найти следующие аргументы командной строки tcpdump полезными:
tcpdump -vv -s 1500 -i eth0.1 port 67 or port 68
Примечание: -vv
спрашивает для подробного вывода диссектора. eth0.1
- мой порт WAN (также интерфейс «NAT за пределами»).
Интересным атрибутом в пакетах ACK является LT: field = предлагаемое / максимальное предоставленное время аренды в секундах. Запросы DHCP отправляются с порта 68 на порт 67. Ответы приходят с порта 67 на порт 68.