comment éviter de routage local pile dans Linux

J'ai l'environnement suivant: 2 hôtes, chacune avec 2 interfaces Ethernet connecté à l'autre (comme sur le schéma ci-dessous):

 +---------+               +---------+                     
 |      (1)+---------------+(2)      |    
 |  host1  |               |  host2  |
 |         |               |         |
 |      (3)+---------------+(4)      |
 +---------+               +---------+

Je voudrais écrire client/serveur socket outil qui va ouvrir à la fois le client et le serveur de sockets sur host1.
Je voudrais client pour l'envoi de paquets TCP à travers l'interface (1) et server pour écouter sur l'interface (3), que les paquets passent par host2.

Normalement Linux pile route les paquets à travers cette pile TCP/IP locale sans envoi de ceux host2.

J'ai essayé d'utiliser SO_BINDTODEVICE option pour à la fois serveur et client, et il semble que le serveur est en effet lié à l'interface (3) et n'est pas à l'écoute localhost trafic. J'ai vérifié que le client de host1 ne pouvait pas être acceptée alors que le client de host2.

Malheureusement client les paquets ne sont pas en envoyer (même tcpdump sur l'interface(1) de ne pas voir les paquets) par le biais de l'interface (1) à l'interface (2).
Bien sûr, le routage est correct (je peux faire un ping (2) de (1), (4) à partir de (1), (4) à partir de (3) et ainsi de suite).

Ma question est de savoir si c'est possible d'être mis en œuvre sans l'aide personnalisé de la pile TCP/IP?

Peut-être que je devrais essayer de changer l'adresse IP de destination (à partir de client) à partir de l'extérieur du réseau (et seront ensuite envoyés à l'aide de la passerelle par défaut de l'interface (1) - interface (2)) et puis dans postrouting modifier ces nouveau à ceux d'origine? Est une telle solution est possible de travailler?

J'écris mon application en C sous Debian.

L'ajout d'un peu plus de détails et précisions:

  1. bien sûr, les deux paires (1)--(2) et (3)--(4) sont des sous-réseaux différents
  2. ce que je veux réaliser est (1)-->(2)-->(4)-->(3)
  3. host2 est blackbox, donc je ne peux pas installer n'importe quel paquet de transitaire (qui va ouvrir socket d'écoute sur l'interface (2) et avant ceux de (3) à (4)) - c'est pétantes ce que je veux éviter

Le problème principal semble être de livraison locale. Quand j'ouvre prise sur host1 et voulez vous connecter à la prise, qui est à l'écoute sur d'autres adresse de l'hôte dans le noyau utilise juste pile locale pour livrer les paquets. Voir netfilter schéma ci-dessous:

 --->[1]--->[ROUTE]--->[3]--->[4]--->
             |            ^
             |            |
             |         [ROUTE]
             v            |
            [2]          [5]
             |            ^
             |            |
             v            |

Les paquets passent par [5] NF_IP_LOCAL_OUT et [2] NF_IP_LOCAL_IN alors que je veux les forcer à aller à [4].

Juste pour comprendre, vous voulez que votre chemin de message à (1) --> (2) --> (4) --> (3) ?
Vous n'avez certainement pas besoin d'un custom pile TCP pour cela. Pas sûr qu'il s'agit de la meilleure façon, mais vous pourriez le faire certains de traduction d'adresse réseau sur host2 qui serait une carte unique adresse IP à l'adresse de l'interface (3), et assurez-vous que les paquets à (3) de host2 sont acheminés via (4). Host1 serait alors de vous connecter à cette adresse IP unique.
Si un socket se connecte à partir de (1) à (2) sur une autre machine et une autre socket se connecte (4) à (3) sur la première machine, pourquoi le Linux pile TCP ignorer l'envoi de paquets via le réseau? Comment la pile TCP éventuellement savoir à propos de cette inhabituelle de la topologie et comment pourrait-il en éventuellement connaître votre intention?
Pensez-y de cette façon: Vous voulez laisser votre femme (qui est dans la pièce d'à côté) à savoir que le dîner est prêt, mais elle est en colère contre vous et ne pas vous parler. Si vous décidez d'appeler ta mère et dis-lui de dire à son voisin d'appeler votre femme. Vous composez votre mère. Maintenant... qui téléphone pensez-vous de l'anneau? Pensez-vous qu'il est raisonnable de supposer que la compagnie de téléphone, feront de votre femme de la sonnerie du téléphone?
Permet d'ajouter des adresses IP pour obtenir des éclaircissements. Supposons que l'adresse IP de l'interface (1) est 192.168.1.1 et l'adresse IP de l'interface (3) est 192.168.10.1. Quand j'ai ouvert socket et souhaitez connecter 192.168.10.1 noyau savez que c'est l'adresse locale de l'interface d'autres sur host1. Si le noyau Linux est la compagnie de téléphone, il sait exactement ce que je veux appeler ma femme. Le point est de savoir comment le forcer à appeler ma mère , pour appeler le voisin d'abord au lieu de l'appel direct.

OriginalL'auteur codewarrior | 2011-12-16