Iptables - Permitindo apenas um único cliente dhcp (relay)

1

Estou tentando criar uma regra de firewall em um servidor Ubuntu 10.04 executando o isc-dhcpd. Eu só quero que o dhcp seja acessível por um único host de retransmissão (172.1.1.1). Eu tenho o iptables configurado assim:

# iptables -vnL
Chain INPUT (policy ACCEPT 5325 packets, 523K bytes)
pkts bytes target     prot opt in     out     source               destination         
0     0 ACCEPT     udp  --  *      *       172.1.1.1            0.0.0.0/0           udp dpt:67 
1497  533K DROP    udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 

Esta é minha tentativa de eliminar todo o tráfego UDP destinado à porta 67, a menos que seja proveniente de 172.1.1.1.

No entanto, com esta regra, quando eu inicio o dhcpd eu imediatamente vejo as solicitações DHCP começarem a entrar via broadcast (o log diz via eth0).

Preciso de outra regra de firewall para capturar o tráfego de transmissão? Eu tentei adicionar uma regra como

iptables -A INPUT -p udp -d 255.255.255.255 -j DROP

que deve eliminar todo o tráfego de difusão UDP. Mas novamente quando eu começo o dhcpd eu vejo toneladas de pedidos via broadcast.

EDITAR: De acordo com esta página :

For most operations, DHCP software interfaces to the Linux IP stack at a level below Netfilter. Hence, Netfilter (and therefore Shorewall) cannot be used effectively to police DHCP.

Então, há alguma maneira de realizar o que eu quero aqui?

    
por Cory J 27.10.2010 / 02:18

2 respostas

1

Como parece que o netfilter ( iptables ) não é efetivo para filtrar transmissões DHCP, tente usar ebtables , a ferramenta do Linux para filtrar em um nível inferior, os quadros Ethernet. Eu não tenho experiência direta no mundo real com ebtables , mas uma breve leitura da página man sugere que algo como o seguinte pode ser eficaz no seu caso:

ebtables -A INPUT --protocol ipv4 --ip-proto udp --ip-src \! 172.1.1.1 --ip-dport 67 -j DROP

Isso deve fazer com que o kernel do Linux elimine todos os quadros Ethernet que contêm pacotes UDP IPv4 que não são de 172.1.1.1 e são destinados à porta 67.

    
por 27.10.2010 / 06:12
0

Não funciona em nível de IP puro, é necessário saber como o DHCP funciona:

  • Primeiro, o cliente DHCP envia um pacote (DHCPDISCOVER) de 0.0.0.0 para 255.255.255.255 (o endereço de transmissão local).

  • O servidor DHCP oferecerá um endereço IP (DHCPOFFER); em termos de iptables, este será um pacote do endereço do servidor DHCP e também direcionado ao endereço de broadcast local 255.255.255.255. O quadro Ethernet é endereçado no endereço MAC do cliente DHCP.

  • O cliente DHCP escolhe de qualquer oferta enviada em seu endereço MAC de ethernet e envia um DHCPREQUEST para o servidor DHCP; para o iptables, este é outro pacote de 0.0.0.0 e ainda é direcionado ao endereço de broadcast local 255.255.255.255.

  • O servidor DHCP confirma a atribuição de endereço IP (DHCPACK). O pacote IP resultante é do endereço IP do servidor DHCP, o endereço IP de destino é mais uma vez 255.255.255.255, o endereço do quadro Ethernet será endereçado no endereço MAC do cliente DHCP.

  • Quando um cliente DHCP deseja renovar sua concessão de DHCP, ele envia outro DHCPREQUEST de 0.0.0.0 para 255.255.255.255 e solicita o endereço IP atual. Ele fará isso até que a concessão do DHCP tenha expirado, de onde começará novamente com o DHCPDISCOVER.

É mais provável que você esteja procurando algo assim:

iptables -A INPUT -m mac --mac-source xx: xx: xx: xx: xx: xx -p udp --dport 67 -j ACEITAR iptables -A INPUT -p udp --dportar 67 -j DROP

Isso eliminará todas as solicitações de dhcp direcionadas ao seu servidor que não são originadas no MAC listado.

O problema também pode ser resolvido em um nível diferente: remova o pool de endereços IP do servidor DHCP e atribua apenas mapeamentos estáticos para seus respectivos endereços MAC. Dessa forma, o servidor DHCP não responderá a ninguém listado e só atribuirá IPs a hosts conhecidos.

    
por 14.04.2015 / 18:13