Ubuntu Linux - plusieurs NIC, même LAN… Les réponses ARP sortent toujours d'une seule NIC

16

Nous avons le service Internet AT&T U-Verse, qui a une passerelle DSL extrêmement osée.

Nous avons 5 IP (masque de réseau 248), mais la passerelle est incapable de faire autre chose qu'un seul IP -> un seul mappage d'adresse MAC.

Nous avons une seule machine pare-feu et nous redirigeons différents combos IP / ports vers différents endroits à l'intérieur d'une DMZ.

Notre solution jusqu'à présent est d'avoir une machine virtuelle VMWare sur le pare-feu avec 4 cartes réseau supplémentaires, pour obtenir les 4 autres adresses IP ... mais nous avons un problème.

La passerelle effectue essentiellement un ping ARP pour voir si l'IP répond sur le MAC attendu. Avec 4 cartes réseau sur le même réseau local, Linux répond aux demandes ARP pour TOUTES les IP en utilisant une seule interface. Ce n'est pas ce que la passerelle attend, et cela gâche les 3 autres cartes réseau. La passerelle refuse d'acheminer le trafic entrant pour les adresses IP où les résultats de ping ARP ne sont pas le MAC attendu.

Comment pouvons-nous obtenir les réponses ARP pour que l'IP d'eth0 sorte eth0, que l'IP eth1 sorte eth1, etc.?

ÉDITER

La réponse de Christopher Cashell ne fonctionne pas dans cette situation. J'avais de grands espoirs en le lisant, mais ... non.

EDIT 2

Résolu! Voir ma réponse ci-dessous.

Darron
la source
PS - pas de commentaires `` drop uverse '' ... U-Verse est de 18mbps, contre tout le reste de 3mbps ou un 10mbps très peu fiable via le câble
darron
@dblack: Vous avez oublié d'ajouter votre réponse :)
Mihai Limbăşan
Le site api.recaptcha.net était en panne pendant un petit moment. La réponse est maintenant.
darron

Réponses:

13

La solution que vous avez choisie fonctionne, mais il existe des alternatives qui n'impliquent pas d'arptables. (Christopher Cashell était sur la bonne voie, à l'origine, mais il était parti d'un smidge.)

En bref, vous souhaitez définir ces paramètres:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Ceux-ci devraient être disponibles lors de l'exécution d'un noyau Linux moderne de la série 2.6. Vérifiez et assurez-vous que «/ proc / sys / net / ipv4 / conf / / arp_announce» et / proc / sys / net / ipv4 / conf / / arp_ignore »existent sur votre système.

Le paramètre 'arp_filter' ne fonctionne que lorsque vos différentes adresses IP partagent un segment LAN mais utilisent un sous-réseau IP différent. S'ils partagent également le sous-réseau IP, vous devez utiliser 'arp_ignore' et 'arp_announce', comme ci-dessus.

(Je pense que vous devrez peut-être également remettre 'arp_filter' à '0'.)

Ryan B. Lynch
la source
Qu'est-il arrivé à arp_filter? C'était une première solution (2003?) Au problème ARP, mais cela ne semble pas fonctionner comme décrit, du moins sur Centos 5. arp_ignore et arp_announce semblent être bons.
pcapademic
Cette solution, en l'état, ne semble fonctionner qu'au niveau ARP. Sans paramètres de route supplémentaires, le pare-feu peut toujours élire la mauvaise carte sortante (et MAC) pour son propre trafic IP sortant, mais recevra (toujours) toujours le trafic IP entrant sur la bonne carte, conduisant à des considérations de chemin asymétrique et de rp_filter.
AB
8

D'accord, voici la solution. Tout d'abord, un récapitulatif:

Voici mon plan de réseau de base:

 eth0 10.10.10.2 netmask 255.255.255.248
 eth1 10.10.10.3 netmask 255.255.255.248
 eth2 10.10.10.4 netmask 255.255.255.248
 eth3 10.10.10.5 netmask 255.255.255.248

Toutes les interfaces se chevauchent. C'est techniquement faux, et la source de tous mes malheurs ... mais je dois le faire à cause de cette passerelle résidentielle stupide.

Tout d'abord, les demandes ARP de diffusion vont à tous ces éléments. Étant donné que les 4 IP sont des adresses locales valides, les 4 interfaces vont essayer de répondre.

1) installez des arptables . Ajoutez ceci quelque part pendant le démarrage ( /etc/rc.local ici):

arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP

Cela empêchera les émissions de passer dans la mauvaise interface. Ainsi, l'interface correcte sera désormais le seul répondeur.

Cela ne suffit pas en soi. Le bit suivant est un problème de table ARP. Le PC demandeur a probablement déjà une entrée de table ARP, et donc Linux va utiliser l'interface associée à cela. Jusqu'à ce que cette entrée de table ARP expire, il va essayer d'envoyer des réponses ARP en utilisant l'interface de cette entrée, pas celle associée à la demande ARP.

L'option sysctl rp_filter semble rejeter les paquets de réponse ARP sortants s'ils sont sur la mauvaise interface. Donc...

2) Désactivez rp_filter .

Sur Debian / Ubuntu, ce moyen de commenter les deux rp_filter lignes /etc/sysctl.d/10-network-security.conf .

Cette option a été activée pour une raison ... à savoir pour aider à prévenir les attaques d'usurpation cross-interface. J'ai lu qu'il vérifie que le paquet est légal pour l'interface sur laquelle il entre ou sort (en échangeant les MAC et les IP et en voyant s'il continue de circuler sur la même interface). Donc, normalement, ce serait une mauvaise idée de le désactiver. Dans mon cas, toutes les interfaces sont sur le même réseau ... de sorte que la vérification n'a pas vraiment d'importance du tout.

Si j'ajoute une autre interface et que j'ai besoin de la protection contre l'usurpation d' identité, je peux peut-être créer des entrées arptables / iptables pour faire la même chose.

Darron
la source
5

Cela a à voir avec la façon dont Linux gère les IP et les NIC. Fondamentalement, il traite une adresse IP comme si elle appartenait à la boîte, et pas seulement à la carte réseau spécifique. Le résultat est que vous pouvez obtenir des réponses ARP à partir d'adresses IP sur des interfaces auxquelles vous ne vous attendez pas.

La solution est une option sysctl. Si je me souviens bien, ce que vous cherchez, c'est:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1

Cela résoudra le problème pour vous. Ajoutez-les simplement à /etc/sysctl.conf et exécutez ' sysctl -p' (ou exécutez chaque ligne comme argument à ' sysctl -w'.

Cela obligera Linux à répondre uniquement aux requêtes ARP sur l'interface à laquelle une adresse IP est réellement attribuée.

Christopher Cashell
la source
hmm ... malheureusement cela ne semble pas fonctionner. J'ai collé cela dans sysctl.conf, exécuté sysctl, même redémarré, aucun changement. Je peux attraper les options dans / proc et voir qu'elles sont définies, mais si j'arrive à partir d'une autre boîte, toutes les réponses proviennent du même MAC. Les interfaces sont toutes sur le même réseau (même diffusion, etc) ...
darron
1
C'est la bonne solution si les interfaces sont sur le même réseau, mais ont des adresses dans des sous-réseaux différents. Travail confirmé.
Alastair Irvine
0

Pouvez-vous relier la passerelle et demander au pare-feu de gérer les adresses IP?


la source
pour autant que je le comprenne, non ... mais quelqu'un s'il vous plaît corrigez-moi si je me trompe.
darron