Comment empêcher l'usurpation d'adresse IP en utilisant MAC et ebtables?

10

J'essaie de créer des règles de couplage IP-MAC dans ebtables . Il existe peu de didacticiels et de questions connexes [1], mais j'ai un type de paramètre spécifique.

ENVIRONNEMENT: J'ai de nombreux hôtes physiques . Chaque hôte possède peu de cartes Ethernet, jointes en liaison et utilisées comme esclave pour le pont. Il existe de nombreuses machines virtuelles sur chaque hôte (kvm, qemu, libvirt). Chaque machine virtuelle est connectée à un pont de son hôte physique via un nouveau port appelé vnet [0-9] +. Il n'y a pas de NAT. La mise en réseau fonctionne très bien, tous les hôtes physiques peuvent être cinglés, toutes les machines virtuelles aussi. Chaque machine virtuelle a sa propre adresse IP et adresse MAC.

PROBLÈME: à l' intérieur d'une machine virtuelle, l'adresse IP peut être remplacée par une autre.

SOLUTION TROUVÉE: Il existe une solution connue sur le site ebtables [2], mais cette solution est applicable quand un seul hôte est utilisé. Il autorise tout le trafic et s'il y a un paquet IP avec un autre MAC que celui autorisé, le paquet est abandonné. S'il existe plusieurs hôtes, il faut que toutes les paires IP-MAC existantes soient enregistrées sur tous les hôtes. Il faut une solution politique inversée.

SOLUTION ARTISANALE: J'ai essayé d'utiliser des ebtables de manière inversée. Voici un exemple de ce que j'ai essayé.

EXEMPLE 1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

EXEMPLE 2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Le cœur de ce que je veux est d'avoir DROP par défaut et d'autoriser uniquement le trafic provenant de machines virtuelles avec la bonne paire IP-MAC déployée sur l'hôte donné. Cependant, ces solutions ne fonctionnent pas.

QUESTION: Comment autoriser le trafic sur le pont uniquement pour les paires IP-MAC spécifiées de machines virtuelles en cours d'exécution et supprimer toutes les paires IP-MAC inconnues provenant des ports vnet [0-9] +?

Merci beaucoup pour toutes les réponses.

Martin
la source
2
Et si quelqu'un forge son mac?
Zoredache
1
Eh bien, c'est aussi un problème. Mais deviner la bonne paire IP-MAC est très difficile et dépasse en temps opportun le niveau de sécurité de mon service.
Martin

Réponses:

12

J'ai finalement réussi à élaborer une solution de travail.

  1. La solution utilise des paires ebtables et IP-MAC.
  2. La seule table requise est la table par défaut «filtre».
  3. Il n'est pas nécessaire d'ajouter des règles ou des politiques à la chaîne INPUT, car la chaîne INPUT n'est PAS liée à l'exécution de machines virtuelles. L'explication de la signification des chaînes INPUT, OUTPUT et FORWARD dans le tableau des filtres se trouve dans la page de manuel ebtables.
  4. Étant donné que ebtables fonctionne au niveau Ethernet et que le couplage IP-MAC n'est applicable que pour les paquets IP, il est nécessaire de le souligner dans les règles afin de ne pas bloquer les trames ARP et tout autre trafic vital.

Donc, au début, il n'y a aucune règle et toutes les politiques sont configurées pour ACCEPTER. Il n'y a pas de chaînes définies par l'utilisateur. Le tableau des filtres ressemble à ceci:

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

Une nouvelle chaîne est ajoutée. Cette chaîne contient toutes les paires IP-MAC autorisées. Cela s'appelle VMS.

# ebtables -N VMS

Maintenant, la partie importante. Pour chaque trame contenant un paquet IP (ou ses parties) qui passe par le pont depuis le port vnet [0-9] +, appliquez la politique de chaîne et les règles de chaîne VMS. En d'autres termes, pour chaque paquet IP provenant de n'importe quelle machine virtuelle, appliquez la chaîne VMS.

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

La politique par défaut de la chaîne VMS doit être DROP. De cette façon, chaque paquet IP provenant de n'importe quelle machine virtuelle est supprimé par défaut. Plus tard, des exceptions de paires IP-MAC autorisées sont ajoutées. La stratégie par défaut DROP provoque que tout le trafic provenant de n'importe quelle machine virtuelle avec une paire IP-MAC inconnue est supprimé à la fois, ce qui rend l'usurpation d'adresse IP impossible.

# ebtables -P VMS DROP

Le filtre de table se présente maintenant de cette façon. En outre, de cette façon, il semble quand aucune machine virtuelle n'est en cours d'exécution (autorisée).

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

Supposons qu'il existe deux machines en cours d'exécution. Si nous essayons de faire un ping vers / depuis eux, le trafic est abandonné et la destination est inaccessible. C'est le résultat souhaité, car ce trafic n'a pas encore été autorisé. Une seule commande suffit pour autoriser le trafic de chaque machine virtuelle.

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

Désormais, le trafic provenant des machines virtuelles autorisées circule correctement et l'usurpation d'adresse IP est empêchée.

Cette solution peut être imparfaite et si vous avez des commentaires ou des améliorations, je serai heureux de les entendre.

Martin
la source