- чи правильно, що dhclient використовує API нижчого рівня, який не обробляється iptables?
Коротка версія: так, для деяких серверів DHCP (isc-dhcp та ранні версії dnsmasq), ні для деяких інших серверів (пізніші версії dnsmasq).
Більш дрібна версія: походження речовини - це raw socket
. Сокети , згідно Вікіпедії,
... Інтернет-розетка, яка дозволяє безпосередньо надсилати та приймати пакети Інтернет-протоколів без форматування транспортного шару.
На цій сторінці ISC Wiki (консорціум Internet Systems є автором найпоширенішої програми DHCP) зазначено:
Протокол DHCP має деякі специфічні вимоги до справжньої роботи - зокрема, можливість передавати та приймати пакети, що надсилаються на всі обмежені широкомовні адреси (255.255.255.255), і можливість відправляти одноадресну передачу без ARP. Це неможливо зробити через сокети BSD / UDP, хоча dhcpd також відкриває BSD / UDP-сокет (званий "запасний інтерфейс"), який ви побачите в netstat.
Це цікаво, тому що це пояснює, чому ви часто знаходите за допомогою Googling людей, які намагаються контролювати запити DHCP iptables
через порти 67 та 68 UDP. Звичайно, це не те, що ці порти не відкриваються, це лише те, що це не єдиний канал, через який відбувається зв’язок між сервером та клієнтом.
Однак це не може бути успішним: деякі хлопці до кінця вимкнули свою машину повністю (iptables скидає все!), Але вони не змогли закрити себе до DHCP через необроблені пакети).
Іншим цікавим експериментом є використання ще раз iptables
відключити ПК, а потім використовувати необроблений сокет для DNS або для TCP-з'єднання: незважаючи на iptables, ці спроби спілкування успішні.
Дуже авторитетний коментар щодо цього можна знайти на сайті Netfilter , де зазначено:
Сирі розетки обходять стек TCP / IP. Гачки Netfilter, а отже, iptables, сидять всередині IP-стеку.
І те ж саме стосується і пакетного сніферу.
Тут вони також пояснюють, як обійти проблему: обережно, це жарт, констатує Шааф
Це не проект на вихідні.
Нарешті, я також хотів би зазначити, що для dnsmasq ситуація відрізняється : на сторінці Debian Wiki , автор dnsmasq Саймон Келлі заявляє:
Dnsmasq відкриває необроблений сокет, але він ніколи не читає дані з сокета: замість цього він використовується для розмови з клієнтами DHCP, які ще не повністю налаштовані і не можуть робити ARP. Це не проблема безпеки. Пізніші версії dnsmasq використовують іншу техніку і більше не мають відкритої розетки.
Редагувати :
чи є якийсь спосіб зменшити кількість журналів з dhclient для невідповіданих одноадресних запитів?
Це не тривіально, оскільки опція CLI зменшити вихід з dhclient
, -q , може бути викликаний з командного рядка, але не з 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"