Linux: Comment forcer l'utilisation d'une interface réseau spécifique?

Cela pourrait être considéré comme une continuation de cette plus tôt DONC, la question.

Idéalement, j'aimerais prison d'un processus en utilisant uniquement une certaine interface, n'importe quoi. Il fera des connexions TCP, l'envoi de datagrammes UDP, et à l'écoute pour les diffusions UDP. Actuellement, ce que je fais:

  1. Déterminer l'adresse IP de l'interface à utiliser.
  2. Créer une politique de propriété intellectuelle de la règle de la route tous les paquets provenant de l'interface pour que la propriété intellectuelle
  3. Créer une autre politique de propriété intellectuelle de la règle de la route tous les paquets en provenance de l'IP de cette interface
  4. Configurer une valeur par défaut de la table de routage pour chaque règle

Maintenant, cela fonctionne, pour la plupart, mais le processus client doit également être prêts à jouer le jeu. C'est, il doit se lier à une adresse IP spécifique de l'interface qu'il veut utiliser, et je pense que j'ai besoin de SO_BINDTODEVICE. (Cependant, je continue la lecture des informations contradictoires quant à savoir si SO_BINDTODEVICE fonctionne réellement lors de l'utilisation de TCP ou UDP.) Heureusement, l'application cliente est Python, et je peux prolonger la classe socket pour faire tout cela de manière transparente. Mais je ne suis pas sûr que c'est une solution complète, surtout à l'égard de la réception d'émissions.

Mes questions sont:

  1. Ne SO_BINDTODEVICE faire ce que je veux ici? Ou est-ce seulement efficace pour les sockets raw? Quelqu'un fait remarquer que, "SO_BINDTODEVICE sur un socket ne garantit pas la prise ne recevoir des paquets qui sont arrivés sur cette interface physique du fil d'antenne." Si cela est vrai en effet, alors que t SO_BINDTODEVICE faire?
  2. Est-il un moyen de le faire, tels que l'adresse IP locale n'a pas à être unique? Ce ne serait pas un problème autre que le fait que le serveur DHCP sur une interface attribuer une IP qui est utilisé par une autre interface, confondant ainsi la table de routage.
  3. Comment puis-je recevoir les émissions uniquement à partir d'une interface spécifique? La liaison à une IP spécifique semble faire ignorer les émissions, ce qui est logique, mais ce n'est pas tout à fait ce que je cherche.

Je suis en cours d'exécution sur Ubuntu 8.04 w/noyau Linux 2.6.26. Être en mesure d'accéder à la même sous-réseau sur deux réseaux différents à travers deux interfaces différentes simultanément est une exigence non négociable, rendant ainsi (pour la plupart) immunitaire à "ne pas le faire." 🙂

source d'informationauteur |