No meu outro segmento, eu estava falando sobre algumas coisas interessantes sobre a política e os estados do iptables , agora gostaria de entender mais sobre como o DHCP funciona e como o iptables o entende.
O ETH0 está conectado ao meu switch principal que recebe o ip dinâmico do meu roteador para obter não apenas acesso à Internet, mas também acesso à minha rede externa.
ETH1 é a placa interna conectada a um comutador interno no qual os clientes X recebem seus IPS desse servidor
A rede ETH1 é 192.168.1.0/255.255.255.0, em que o ip do servidor é 192.168.1.254.
Pelo que entendi, dhcp é um protocolo de bootp, portanto, mesmo se você tiver suas políticas de firewall para remover tudo, sua rede ainda receberá o DHCP, o que, nos testes que fiz, parecia verdadeiro.
Do tcpdump:
root@test:~# tcpdump -i eth1 port 67 or 68
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:34:03.943928 IP 192.168.1.2.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:03.957647 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300
11:34:06.492153 IP 192.168.1.2.bootpc > 192.168.1.254.bootps: BOOTP/DHCP, Request from 00:0c:29:29:52:8b (oui Unknown), length 303
11:34:06.506593 IP 192.168.1.254.bootps > 192.168.1.2.bootpc: BOOTP/DHCP, Reply, length 300
Eu fiz uma regra de log simples para ver o que o iptables faz:
root@test:~# tail -f /var/log/syslog
Oct 15 11:30:58 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9527 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:31:43 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9529 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:33:32 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9531 PROTO=UDP SPT=68 DPT=67 LEN=311
Oct 15 11:34:03 test kernel: IN=eth1 OUT= MAC=ff:ff:ff:ff:ff:ff:00:0c:29:29:52:8b:08:00 SRC=192.168.1.2 DST=255.255.255.255 LEN=331 TOS=0x00 PREC=0x00 TTL=128 ID=9533 PROTO=UDP SPT=68 DPT=67 LEN=311
Aqui estão as minhas regras do iptables no momento:
# deny all traffic
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# Use stateful inspection feature to only allow incoming connections
# related to connections I have already established myself
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# allow all traffic on lo interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
Assim, mesmo com a POLÍTICA padrão para descartar tudo, ainda recebo o DHCP na minha rede, enquanto leva muito mais tempo para renovar um IP e tal.
Se eu adicionar a regra a seguir no meu firewall:
$IPT -I OUTPUT -o $INTIF -p udp --dport 67:68 --sport 67:68 -j ACCEPT
Levará muito menos tempo para atualizar qualquer dhcp do cliente.
Considerando o exposto acima:
- por que realmente demora mais tempo para atualizá-lo, mesmo que não esteja sendo bloqueado?
- é possível DROP o servidor dhcp de todo sem desligá-lo?
- é possível ACEITAR o servidor dhcp dentro de iptables com o BOOTP? como isso é feito?
Se você conhece bons links, eu não me importaria de tomar muito :)
Are you monitoring the network interface in promiscuous mode
que eu ainda estou aprendendo ...Respostas:
Eu vou responder # 2: Não.
Ao obter um endereço IP, o daemon dhcp cria um soquete bruto para a interface de rede e manipula o próprio protocolo UDP. Assim, os pacotes UDP nunca passam por iptables.
A razão pela qual o daemon dhcp precisa implementar o UDP é que o kernel pode manipular apenas o UDP (de fato, todo o conjunto TCP / IP) quando a interface possui um endereço IP. Anteriormente, os daemons dhcp dariam a uma interface o endereço IP 0.0.0.0, mas isso não funciona mais.
fonte
Adicionando
tornará a atualização do DHCPD mais rápida :) Deve funcionar nos dois lados ENTRADA e SAÍDA. Você pode DROP dhcpd com ebtables, não com iptables. DHCPD escutando em 0.0.0.0, não dentro do IP
fonte
Minha observação recente, no OpenWRT Kamikaze 7.09 = 2.4.34 e no udhcpc from busybox 1.4.2:
Eu tenho uma política "ACEITAR" na cadeia OUTPUT e, na direção INPUT, originalmente confiei nesta regra clássica:
para permitir as respostas DHCP em (para meu udhcpc) na interface WAN. Ou seja, é aqui que o servidor DHCP upstream do meu ISP atribui um endereço IP para mim.
Lembre-se da diferença entre uma troca DHCP inicial (descoberta, oferta, solicitação, confirmação) e uma renovação de concessão de DHCP (solicitação, confirmação).
Após a inicialização, o udhcpc inicia com a troca inicial completa. Essa troca teria sucesso. E outra renovação ou duas seriam bem-sucedidas também - apenas uma solicitação e reconhecimento. O servidor DHCP do meu ISP normalmente solicita um tempo de renovação de cerca de uma hora a 1,5 horas; portanto, meu cliente DHCP solicita uma renovação a cada 30 a 45 minutos (esse comportamento é baseado no RFC).
Mas, na terceira ou quarta renovação, começaria a ficar interessante. O TCPdump mostraria cerca de três tentativas de renovação, seguidas por uma troca inicial completa - dentro de um período de tempo de apenas alguns minutos ou até segundos. Como se o udhcpc não gostasse do que voltou :-( e acabasse satisfeito com a troca completa. Depois disso, outra renovação em meia hora seria bem-sucedida ... e a história se repetiria novamente.
Eu descobri que talvez seja o rastreamento de conexão no kernel que tenha algo errado. Como se a entrada conntrack expire após duas horas ou mais, e as renovações posteriores do DHCP falhem porque o ACK do servidor não chega ao udhcpc escutando no soquete. Observe que o tcpdump (libpcap) escuta na interface bruta e pode ver todos os pacotes chegando, antes de estarem sujeitos ao iptables. Depois que o udhcpc renuncia a renovações e, desesperado, tenta começar do zero usando uma troca completa (começando com DISCOVER), o kernel estabelece uma nova entrada do conntrack e pode entender os pacotes relacionados por mais algum tempo ...
Com certeza, uma vez que eu adicionei algo como:
as renovações parecem funcionar para sempre.
Você pode achar úteis os seguintes argumentos do tcpdump cmdline:
Nota:
-vv
solicita a saída detalhada do dissector.eth0.1
é a minha porta WAN (também uma interface "NAT outside").Um atributo interessante nos pacotes ACK é o LT: field = sugerido / tempo de concessão máximo concedido em segundos. As solicitações DHCP são enviadas da porta 68 para a porta 67. As respostas vêm da porta 67 para a porta 68.
fonte
openwrt:68 -> dhcpserver:67
e o ACK serádhcpserver:67 -> openwrt:68
. Isso conta como ESTABELECIDO e passará. Se o antigo estado do conntrack expirou, isso estabelecerá um novo. Se houver algum problema, só poderá ser com a troca inicial como é a DESCOBERTA0.0.0.0:68 -> 255.255.255.255:67
e a OFERTAdhcpserver:67 -> new-openwrt:68
, o que não conta como ESTABELECIDO. Isso só funciona como o DHCP geralmente ignora o iptables com um soquete de pacote no Linux; caso contrário, é necessária uma regra de entrada que permita pacotes da porta UDP 67 ou da porta UDP 68.