3 votes

Iptables - Autoriser seulement un seul client dhcp (relais)

J'essaie de créer une règle de pare-feu sur un serveur Ubuntu 10.04 utilisant isc-dhcpd. Je veux que dhcp ne soit accessible que par un seul hôte relais (172.1.1.1). J'ai configuré iptables comme suit :

# 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 

J'essaie ainsi de supprimer tout le trafic UDP destiné au port 67, sauf s'il provient de 172.1.1.1.

Cependant, avec cette règle en place, lorsque je lance le dhcpd, je vois immédiatement des demandes DHCP commencer à arriver par diffusion (le journal indique via eth0).

Ai-je besoin d'une autre règle de pare-feu pour capter le trafic de diffusion ? J'ai essayé d'ajouter une règle comme

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

qui devrait abandonner tout le trafic de diffusion UDP. Mais à nouveau, lorsque je lance dhcpd, je vois des tonnes de requêtes par diffusion.

EDIT : Selon cette page :

Pour la plupart des opérations, le logiciel DHCP s'interface avec la pile IP Linux à un niveau inférieur à Netfilter. Par conséquent, Netfilter (et donc Shorewall) ne peut pas être utilisé efficacement pour contrôler DHCP.

Y a-t-il un moyen d'accomplir ce que je veux ici ?

0 votes

Êtes-vous certain que le serveur a accepté des paquets DHCP ? Votre règle DROP semble avoir fait correspondre un bon nombre de paquets (1497), alors que votre règle ACCEPT n'en a aucun.

0 votes

Oui, je vois le trafic dhcp indésirable dans les journaux dhcpd dès que je lance le démon. Je ne m'attendrais pas à voir des octets en provenance de 172.1.1.1 pour le moment, il ne fait que relayer pour un seul client de test.

0 votes

2voto

Priyan R Points 687

Puisqu'il semble que netfilter ( iptables ) n'est pas efficace pour filtrer les diffusions DHCP, essayez d'utiliser l'option ebtables l'outil Linux pour le filtrage à un niveau inférieur, des trames ethernet. Je n'ai pas d'expérience directe, dans le monde réel, avec les outils suivants ebtables mais une brève lecture de la page de manuel suggère que quelque chose comme ce qui suit pourrait être efficace dans votre cas :

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

Diese devrait faire en sorte que le noyau Linux abandonne toutes les trames Ethernet qui contiennent des paquets UDP IPv4 qui ne proviennent pas de 172.1.1.1 et qui sont destinés au port 67.

0 votes

Merci, cela semble très prometteur ! Je vais l'essayer dans les deux prochains jours.

2voto

Cela ne fonctionne pas au niveau de l'IP pur, il faut savoir comment fonctionne le DHCP :

  • Au début, le client DHCP envoie un paquet (DHCPDISCOVER) de 0.0.0.0 à 255.255.255.255 (l'adresse de diffusion locale).

  • Le serveur DHCP offrira une adresse IP (DHCPOFFER) ; en termes d'iptables, il s'agira d'un paquet provenant de l'adresse du serveur DHCP et visant également l'adresse de diffusion locale 255.255.255.255. La trame ethernet est adressée à l'adresse MAC du client DHCP.

  • Le client DHCP choisit parmi toutes les offres envoyées à son adresse MAC Ethernet et envoie un DHCPREQUEST au serveur DHCP ; pour iptables, il s'agit encore d'un autre paquet provenant de 0.0.0.0 et toujours ciblé sur l'adresse de diffusion locale 255.255.255.255.

  • Le serveur DHCP accuse réception de l'attribution de l'adresse IP (DHCPACK). Le paquet IP résultant provient de l'adresse IP du serveur DHCP, l'adresse IP de destination est une fois de plus 255.255.255.255, l'adresse de la trame ethernet sera adressée à l'adresse MAC du client DHCP.

  • Lorsqu'un client DHCP veut renouveler son bail DHCP, il envoie un autre DHCPREQUEST de 0.0.0.0 à 255.255.255.255 et demande l'adresse IP actuelle. Il le fera jusqu'à ce que le bail DHCP ait expiré, après quoi il recommencera avec DHCPDISCOVER.

Donc plus probablement, vous cherchez quelque chose comme ça :

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

Ceci éliminera toutes les requêtes dhcp destinées à votre serveur qui ne proviennent pas du MAC listé.

Le problème peut également être résolu à un autre niveau : supprimez le pool d'adresses IP du serveur DHCP et n'attribuez que des mappings statiques pour vos adresses MAC respectives. De cette façon, le serveur DHCP ne répondra à aucune personne répertoriée et n'attribuera des IP qu'à des hôtes connus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X