2010-04-29 15 views
5

J'ai un comp avec 2 cartes eth, connecté avec patch-cordon (câble eth-direct du 1er au 2ème).linux: désactiver en utilisant le bouclage et envoyer des données via le fil entre 2 cartes eth d'un comp

Le linux est installé, je veux envoyer les données de la 1ère carte réseau à la 2ème. Et je veux forcer le paquet à passer par câble. Je peux configurer n'importe quelle carte ip sur des cartes.

Avec ping, les compteurs sur les cartes sont constants. Est-il possible avec les sockets TCP/IP?

PS. J'ai besoin d'écrire un programme. qui va envoyer des paquets via eth, donc question de stackoverflow. Il peut y avoir une certaine dépendance du système d'exploitation, ils vont m'aider aussi

+0

Copie possible de http://serverfault.com/questions/127636/force-local-ip-traffic-to-an-external-interface – osgx

+0

Ceci a été fermé hors-sujet deux ans après la réponse à la question. Pourtant, les réponses décrivent les programmes, et le demandeur dit qu'ils écrivent un programme. Oui, cela est également sur le sujet pour un autre site Stack Exchange. Je signalerai ceci pour être rouvert. – dcorking

+0

dcorking, la tâche peut être résolue en utilisant uniquement des outils liés au système d'exploitation, sans créer de nouveaux programmes. La réponse de z22 ressemble à ce qui est nécessaire. Et à serverfault http://serverfault.com/questions/127636/force-local-ip-traffic-to-an-external-interface nous avons la bonne solution. – osgx

Répondre

0

Vous devriez être capable d'écrire un programme qui le fait en utilisant des sockets packet (famille de protocoles PF_PACKET), mais vous devrez gérer les en-têtes pour l'IP et les couches supérieures vous-même.

+1

Donc, je ne peux pas forcer les paquets TCP ou IP ne pas être bouclés? – osgx

+0

Je ne crois pas, mais vous pouvez essayer d'ajouter une route hôte pour chaque IP via l'interface opposée. – caf

5

Jetez un oeil à local table de routage. Avec les outils iproute2 installés, faites ip route show table local. Comme vous pouvez le voir, tous les paquets destinés à vos adresses IP locales ne passeront jamais par les cartes réseau car ils sont marqués comme local. Pour forcer les paquets à passer par une carte Ethernet, supprimez la route appropriée (c'est-à-dire ip route delete 192.168.122.1 dev eth0 table local). Pour restaurer cette route, il suffit de configurer l'interface de haut en bas: le noyau ferait le travail pour insérer ces routes.

+0

L'idée semble bien.Bien sûr, il n'est plus possible d'envoyer une commande ping à l'interface locale, mais il semble qu'il ne soit possible de faire un ping sur le réseau (il semble que le noyau n'accepte plus les paquets pour cette adresse IP). – Jezz

4

J'ai essayé la méthode ip route ... table locale ci-dessus. Soit ça ne marche pas, soit je fais quelque chose de mal.

L'astuce consiste à utiliser un ensemble d'adresses IP factices pour forcer le noyau à le router à travers le fil, et NAT pour le ramener à l'adresse IP réelle.

Soit eth0 et eth1 les deux cartes ethernet; IP0 et IP1 son adresse IP; MAC0 et MAC1 son adresse MAC respectivement. Nous allons utiliser deux adresses IP factices: IP00 et IP11.

arp -s IP00 MAC0 
arp -s IP11 MAC1 
ip route add IP00 dev eth1 
ip route add IP11 dev eth0 
iptables -t nat -A POSTROUTING -d IP11 -j SNAT --to-source IP00 
iptables -t nat -A POSTROUTING -d IP00 -j SNAT --to-source IP11 
iptables -t nat -A PREROUTING -d IP00 -j DNAT --to-destination IP0 
iptables -t nat -A PREROUTING -d IP11 -j DNAT --to-destination IP1 

Utilisez les adresses IP factices IP00 et IP11 au lieu de la vraie.