- is it correct that dhclient uses some lower level API that is not processed by iptables?
Versão resumida: sim, para alguns servidores DHCP (isc-dhcp e versões anteriores do dnsmasq), não para alguns outros servidores (versões posteriores do dnsmasq).
Versão mais longa: a origem do assunto é raw socket
. Um socket bruto é, de acordo com a Wikipedia,
... an internet socket that allows direct sending and receiving of Internet Protocol packets without any protocol-specific transport layer formatting.
Esta página Wiki do ISC ( o Internet Systems Consortium é o autor do programa DHCP mais comum) afirma que:
The DHCP protocol has some specific requirements to really work properly - in particular being able to transmit to and receive packets sent to the all-ones limited broadcast address (255.255.255.255), and being able to send a unicast without an ARP. It's not possible to do this via BSD/UDP sockets although dhcpd does also open a BSD/UDP socket (called the "fallback interface") that you will see in netstat.
Isso é interessante, porque explica por que você vai encontrar muitas vezes, pesquisando no Google, pessoas tentando controlar as solicitações DHCP em iptables
através das portas UDP 67 e 68. Claro, não é que essas portas não estejam abertas, é apenas que este não é o único canal através do qual a comunicação entre o servidor e o cliente ocorre.
No entanto, isso não pode ser totalmente bem-sucedido: alguns caras foi ao extremo de desligar sua máquina completamente (o iptables descarta tudo!), mas eles não conseguiram se fechar para o DHCP via pacotes brutos).
Outra experiência interessante é usar, mais uma vez iptables
para fechar off pc, e depois usar um socket bruto para DNS, ou para conexão TCP: apesar do iptables, essas tentativas de comunicação são bem-sucedidas.
Um comentário muito autoritário sobre isso pode ser encontrado no site do Netfilter , onde é dito:
Raw sockets bypass the TCP/IP stack. Netfilter hooks, and consequently iptables, sit inside the IP stack.
E o mesmo se aplica ao sniffer de pacotes.
Aqui eles também explicam como contornar o problema: cuidado, é uma piada, afirma Schaaf
That's not a weekend project.
Por último, gostaria de salientar que a situação é diferente para dnsmasq : em um Página do Debian Wiki , o autor do dnsmasq Simon Kelly afirma:
Dnsmasq opens a raw socket but it never reads data from the socket: instead it's used to talk to DHCP clients which are not yet fully configured and cannot do ARP. This is not a security problem. Later versions of dnsmasq use a different technique, and no longer have a raw socket open.
Editar :
are there any way to reduce amount of logs from dhclient for unanswered unicast requests?
Isto não é trivial, porque a opção CLI para reduzir a saída de dhclient
, -q , pode ser invocado a partir da CLI, mas não de dhclient.conf . Além disso, dhclient
é chamado diretamente não pelo seu Network Manager em geral, mas por um executável, ifup
: na verdade,
# 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%
Como você pode ver, ifup
invoca dhclient
com a opção -v
(= verbose!), o oposto do que você deseja.
Quais são as suas opções?
-
Faça o download do código-fonte, modifique a invocação acima e recompile-a para o seu kernel. Deve ser uma coisa fácil.
-
Você pode usar um editor binário para converter o
-v
em-q
. -
Você pode modificar um arquivo script ,
/etc/init.d/networking
, substituindo a invocação deifup
porifup .... > /dev/null 2>&1
Uma reinicialização ou uma reinicialização do serviço
networking
concluirá essa modificação. Isso é menos do que ideal, pois lança no lixo os avisos inúteis e mensagens de erro graves. -
Por fim, você pode realizar o seguinte hack: mova
/sbin/dhclient
para/sbin/dhclient-true
e crie um arquivo executável chamado/sbin/dhclient
com o seguinte conteúdo:#!/bin/bash ARGS=$(echo "$@" | sed 's/ -v / /g') exec /sbin/dhclient-true "-q" "$ARGS"