J'ai une machine avec plusieurs interfaces que je peux configurer comme je veux, par exemple:
- eth1: 192.168.1.1
- eth2: 192.168.2.2
Je voudrais transmettre tout le trafic envoyé à l'une de ces adresses locales via l'autre interface. Par exemple, toutes les requêtes vers un serveur iperf, ftp, http à 192.168.1.1 ne doivent pas être uniquement acheminées en interne, mais transmises via eth2 (et le réseau externe se chargera de réacheminer le paquet vers eth1).
J'ai essayé et regardé plusieurs commandes, comme iptables, ip route, etc ... mais rien n'a fonctionné.
Le comportement le plus proche que j'ai pu avoir a été fait avec:
ip route change to 192.168.1.1/24 dev eth2
qui envoie tous les 192.168.1.x sur eth2, à l'exception de 192.168.1.1 qui est toujours routé en interne. Peut-être puis-je alors faire le transfert NAT de tout le trafic dirigé vers le faux 192.168.1.2 sur eth1, redirigé vers 192.168.1.1 en interne? Je suis en fait aux prises avec iptables, mais c'est trop difficile pour moi.
Le but de cette configuration est de faire des tests de pilotes d'interface sans utiliser deux PC.
J'utilise Linux, mais si vous savez comment faire cela avec Windows, je l'achèterai!
Modifier:
Le réseau externe n'est qu'un câble croisé entre eth1 et eth2. Disons que j'ai un serveur http sur ma machine. Maintenant, je veux accéder à ce serveur à partir de la même machine, mais je veux forcer le trafic TCP / IP à passer par ce câble eth1 / eth2. Comment dois-je configurer mes interfaces pour cela?
la source
Réponses:
J'ai développé la réponse de caladona car je ne pouvais pas voir les paquets de réponse. Pour cet exemple:
Les routes iptables du PC local sont définies sur le trafic sortant SNAT et DNAT vers la «fausse» IP.
Les règles font ce qui suit:
Pour résumer, le système local peut désormais communiquer avec une machine «virtuelle» avec les adresses 192.168.1.100 et 192.168.2.100.
Ensuite, vous devez forcer votre PC local à utiliser le routeur externe pour atteindre votre fausse IP. Pour ce faire, créez un itinéraire direct vers les adresses IP via le routeur. Vous voulez vous assurer que vous forcez les paquets sur l'opposé du sous-réseau de destination.
Enfin, pour que tout cela fonctionne, le routeur externe doit savoir comment atteindre les adresses IP truquées sur votre PC local. Vous pouvez effectuer des actions minces en activant les ARP proxy sur votre système.
Avec cette configuration, vous pouvez désormais traiter les fausses adresses IP comme un véritable système sur votre PC local. L'envoi de données vers le sous-réseau .1 forcera les paquets à sortir de l'interface .2. L'envoi de données au sous-réseau .2 forcera les paquets à sortir de l'interface .1.
la source
J'ai utilisé avec succès les éléments suivants sous Linux pour tester le débit sur une nouvelle carte 10 Gbits / s double port en mode "loopback", c'est-à-dire qu'un port est branché directement sur l'autre. C'est juste un peu de vaudou juste pour forcer les paquets à sortir du fil, mais si vous ne le faites pas, Linux ne fera que court-circuiter le trafic à travers le noyau (d'où la question de l'OP). Dans la réponse de Casey ci-dessus, je ne sais pas s'il était vraiment nécessaire d'avoir un routeur externe ou non ci-dessus, mais ce qui suit est complètement autonome. Les deux interfaces sont eth2 et eth3.
Attribuez des adresses IP aux interfaces et placez-les sur des réseaux distincts:
Ensuite, nous allons mettre en place un double scénario NAT: deux nouveaux faux réseaux utilisés pour atteindre l'autre. En sortant, sourcez NAT sur votre faux réseau. En chemin, fixez la destination. Et vice versa pour l'autre réseau:
Dites maintenant au système comment accéder à chaque faux réseau et préremplissez les entrées arp (assurez-vous de remplacer vos adresses MAC, n'utilisez pas les miennes):
Cela trompe suffisamment Linux pour réellement mettre des paquets sur le fil. Par exemple:
s'éteint eth2, l'IP source 10.50.0.1 devient NATted à 10.60.0.1, et comme il arrive dans eth3 la destination 10.60.1.1 obtient NATted à 10.50.1.1. Et la réponse prend un voyage similaire.
Utilisez maintenant iperf pour tester le débit. Liez aux adresses IP correctes et assurez-vous de l'adresse IP que vous contactez (la fausse adresse de l'autre extrémité):
Assurez-vous que le trafic sort vraiment du câble:
Vous pouvez également regarder / proc / interruptions juste pour être absolument sûr que la carte est utilisée:
Quoi qu'il en soit, j'ai trouvé ce post en cherchant comment le faire, merci pour les gars de Q&A, et j'espère que cela aidera quiconque à trouver ce post à l'avenir.
la source
Comme toujours - je suis un peu en retard - mais de nos jours, on pourrait utiliser des espaces de noms réseau pour isoler les interfaces et empêcher tout transfert local (et jouer avec iptables :)).
Créez des espaces de noms (tout cela avec les autorisations requises, par exemple en tant que root):
Notez que l'état / la configuration des interfaces doit maintenant être accessible dans le contexte de l'espace de noms affecté - donc elles n'apparaîtront pas si vous exécutez un lien IP nu car il est exécuté dans le contexte de l'espace de noms par défaut. L'exécution d'une commande dans un espace de noms peut être effectuée à l'aide de
comme préfixe.
Attribuez maintenant des espaces de noms aux interfaces, appliquez la configuration et configurez les interfaces:
Vous pouvez maintenant exécuter les applications dans l'espace de noms - pour l'exécution du serveur iperf
et le client:
Le trafic sera désormais envoyé via les interfaces physiques car l'ensemble pile réseau, interface, routage ... est isolé par les espaces de noms, de sorte que le noyau ne peut pas faire correspondre les adresses utilisées dans le trafic avec les interfaces locales (disponibles).
Si vous avez terminé vos expériences, supprimez simplement les espaces de noms:
Les interfaces seront réaffectées à l'espace de noms par défaut et toute configuration effectuée dans l'espace de noms disparaît (par exemple, pas besoin de supprimer les adresses IP attribuées).
la source
Ok, j'ai finalement réussi à mettre en place ma config.
L'idée est d'utiliser une autre fausse adresse, pour forcer le routage de cette fausse adresse vers l'interface 2, puis de traduire la fausse adresse avec la vraie adresse 2 avec NAT / iptables.
Ma configuration est en fait composée d'un routeur que je peux telnet entre IF1 (interface 1) et IF2
Dans ma configuration, FAKE_ADDR et IF1_ADDR sont sur le même sous-réseau.
Et sur le routeur:
Si j'envoie quelque chose à FAKE_ADDR, pkt est transmis via IF1 au routeur, à nouveau transmis à IF2, puis FAKE_IP est remplacé par IF2_ADDR. Le paquet est traité par le serveur, le résultat est renvoyé à IF1_ADDR, depuis IF2_ADDR qui est remplacé par FAKE_ADDR.
Il est peut-être possible d'utiliser une configuration plus simple avec un seul câble croisé, mais comme je n'ai pas essayé, je préfère donner ma solution de travail.
la source
La réponse donnée ci-dessus par Thomas Tannhäuser était parfaite!
J'ai eu une situation similaire: une seule machine avec deux interfaces enet. Mon plan était d'utiliser une interface comme serveur (récepteur) et l'autre comme client (expéditeur). Chaque interface serait attachée au routeur et iperf conduirait le trafic à travers le routeur pour mesurer le débit, le PPS, le retard, etc.
Malheureusement, l'approche iptables n'était pas intuitive et était lourde de problèmes. Après quelques heures frustrantes, j'ai abandonné ce plan d'attaque. Inspiré par la suggestion de Thomas, j'ai fait quelques devoirs sur les espaces de noms IP Linux et j'ai commencé à apprécier la simplicité et l'élégance de cette solution.
Vous trouverez ci-dessous une liste des commandes exactes que j'ai utilisées pour configurer mon Fedora FC26 pour servir à ce titre. Les deux interfaces sont enp1s0 et enp3s0. Le routeur a deux interfaces avec les adresses 192.168.2.112 et 172.16.16.2. Chaque connecteur FC26 ENET est directement câblé à l'interface de routeur correspondante.
la source
Il semble que vous souhaitiez transformer votre boîtier Linux en boîtier de type routeur / pont / passerelle / pare-feu. Les ressources suivantes peuvent être ce que vous recherchez:
Le projet de routeur Linux
Liste des distributions de routeur ou de pare-feu
Routeur Linux LiveCD
Linux Journal - Le routeur Linux
Mise à jour basée sur de plus amples informations:
Je ne pense pas que vous allez pouvoir faire ce que vous voulez. L'OS va toujours regarder sa table de routage interne et «voir» les deux adresses IP localement. Il acheminera ensuite le trafic dans le système d'exploitation et ne le mettra jamais sur le câble. Vous aurez besoin d'une deuxième machine ou de deux machines virtuelles (consultez Xen ).
la source
Beaucoup de choses à parcourir ici, donc je ne peux pas garantir totalement ma précision, mais la question initiale semble chercher ce que l'on appelle la technique "envoyer à soi" . La recherche liée montre ce que je pense être le correctif du noyau le mieux maintenu en tant que lien supérieur + discussions et correctifs avec d'autres approches sur diverses listes de diffusion, en particulier. LKML.
Je pense que l'on devrait également regarder les espaces de noms de réseau , fait avec les "ip netns" d'iproute2 . Cela nécessite également une interface supplémentaire et une magie de routage, donc peut-être même pas moins complexe que le massif iptables hoopla dans les autres réponses.
Les commentaires sont les bienvenus si quelqu'un a trouvé quelque chose d'utile avec ceux-ci - le comment, le quoi, le où de votre implémentation.
la source
Consultez cet article. Ici, les étapes détaillées sont mentionnées pour permettre l'accès Internet à une virtualbox vm à l'aide du transfert NAT.
http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/
la source
voici comment je l'ai fait fonctionner pour IPV6
ips statiques assignés
configurer des itinéraires d'hôte uniquement vers des adresses "FAKE"
rempli la table des voisins ... comme l'arp
ajouté les entrées ip6tables
la source