- правильно ли, что dhclient использует какой-то API более низкого уровня, который не обрабатывается iptables?
Короткая версия: да, для некоторых DHCP-серверов (isc-dhcp и более ранние версии dnsmasq), нет для некоторых других серверов (более поздние версии dnsmasq).
Более длинная версия: источником проблемы является raw socket
. Сырая розетка , согласно Википедии,
... интернет-сокет, который позволяет напрямую отправлять и получать пакеты интернет-протокола без какого-либо специфичного для протокола форматирования транспортного уровня.
На этой вики-странице ISC (Консорциум интернет-систем является автором самой распространенной программы DHCP) говорится, что:
Протокол DHCP имеет некоторые специфические требования для правильной работы - в частности, возможность передавать и принимать пакеты, отправленные на ограниченный широковещательный адрес "все единицы" (255.255.255.255), и возможность отправлять одноадресную рассылку без ARP. Это невозможно сделать через BSD/UDP-сокеты, хотя dhcpd также открывает BSD/UDP-сокет (называемый "резервным интерфейсом"), который вы увидите в netstat.
Это интересно, потому что это объясняет, почему вы, Googling, будете часто находить людей, пытающихся контролировать запросы DHCP в iptables
через UDP-порты 67 и 68. Конечно, дело не в том, что эти порты не открыты, а в том, что это не единственный канал, через который происходит связь между сервером и клиентом.
Это, однако, не может быть полностью успешным: некоторые парни дошли до крайности, полностью закрыв свою машину (iptables отбрасывает все!), Но они не смогли отключиться от DHCP через необработанные пакеты).
Другой интересный эксперимент состоит в том, чтобы снова использовать iptables
для отключения компьютера, а затем использовать необработанный сокет для DNS или для соединения TCP: несмотря на iptables, эти попытки связи успешны.
Очень авторитетный комментарий по этому поводу можно найти на сайте Netfilter, где указано:
Необработанные сокеты обходят стек TCP/IP. Хуки Netfilter и, следовательно, iptables находятся внутри стека IP.
И то же самое относится к анализатору пакетов.
Здесь они также объясняют, как обойти проблему: осторожно, это шутка, утверждает Шааф
Это не проект выходного дня.
Наконец, я также хотел бы отметить, что ситуация с dnsmasq отличается: на вики-странице Debian автор dnsmasq Саймон Келли заявляет:
Dnsmasq открывает необработанный сокет, но никогда не читает данные из сокета: вместо этого он используется для общения с клиентами DHCP, которые еще не полностью настроены и не могут выполнять ARP. Это не проблема безопасности.
Более поздние версии dnsmasq используют другую технику и больше не имеют открытого сокета.
Редактировать:
Есть ли способ уменьшить количество логов от dhclient для неотвеченных одноадресных запросов?
Это не тривиально, потому что параметр CLI для уменьшения вывода из dhclient
, -q , может быть вызван из CLI, но не из dhclient.conf. Кроме того, dhclient
вызывается напрямую не вашим сетевым менеджером в целом, а исполняемым файлом ifup
: на самом деле,
# strings `(which ifup)` | grep dhclient
/sbin/dhclient
/sbin/dhclient3
dhclient -v -r -pf /run/dhclient.%iface%.pid -lf /var/lib/dhcp/dhclient.%iface%.leases %iface%
dhclient3 -r -pf /run/dhclient.%iface%.pid -lf /var/lib/dhcp3/dhclient.%iface%.leases %iface%
dhclient -1 -v -pf /run/dhclient.%iface%.pid -lf /var/lib/dhcp/dhclient.%iface%.leases %iface% [[-e IF_METRIC=%metric%]]
dhclient3 -pf /run/dhclient.%iface%.pid -lf /var/lib/dhcp3/dhclient.%iface%.leases %iface% [[-e IF_METRIC=%metric%]]
dhclient -6 -r -pf /run/dhclient6.%iface%.pid -lf /var/lib/dhcp/dhclient6.%iface%.leases %iface%
dhclient -1 -6 -pf /run/dhclient6.%iface%.pid -lf /var/lib/dhcp/dhclient6.%iface%.leases %iface%
dhclient -1 -6 -S -pf /run/dhclient6.%iface%.pid -lf /var/lib/dhcp/dhclient6.%iface%.leases %iface%
Как видите, ifup
вызывает dhclient
с -v
(= многословно!) вариант, противоположный тому, что вы хотите.
Какие у вас варианты?
Загрузите исходный код, измените приведенный выше вызов и перекомпилируйте его для своего ядра. Это должно быть подпруга.
Вы можете использовать двоичный редактор для преобразования -v
в -q
.
Вы можете изменить файл сценария /etc/init.d/networking
, заменив вызов ifup
на
ifup .... > /dev/null 2>&1
Перезагрузка или перезапуск networking
службы завершит эту модификацию. Это далеко не идеально, потому что он выбрасывает в мусор как бесполезные предупреждения, так и серьезные сообщения об ошибках.
Наконец, вы можете выполнить следующее: переместить /sbin/dhclient
в /sbin/dhclient-true
, а затем создать исполняемый файл /sbin/dhclient
со следующим содержимым:
#!/bin/bash
ARGS=$(echo "$@" | sed 's/ -v / /g')
exec /sbin/dhclient-true "-q" "$ARGS"