4 votes

Diriger le trafic de l'application à travers une interface spécifique

Première question ici, donc allez-y doucement :

J'ai un serveur debian linux 5.0 avec deux interfaces publiques. Je voudrais router le trafic sortant d'une instance d'une application via une interface et la deuxième instance à travers la deuxième interface. Il y a quelques défis :

  • les deux instances de l'application utilisent le même protocole
  • les deux instances de l'application peuvent accéder à l'ensemble d'internet (impossible de router en fonction du réseau de destination)
  • Je ne peux pas changer le code de l'application
  • Je ne pense pas qu'une approche typique de l'équilibrage de charge de tout le trafic va bien fonctionner, car il y a relativement peu de serveurs de destination accessibles dans le trafic sortant, et tout le trafic devrait vraiment être réparti assez uniformément sur ces serveurs relativement peu nombreux.

Je pourrais probablement exécuter deux serveurs virtualisés sur la box et les lier chacun à une interface différente, mais je cherche une solution plus simple, peut-être en utilisant iproute ou iptables ?

Des idées pour moi ? Merci d'avance - et je suis heureux de répondre à toutes les questions.

5voto

Joey deVilla Points 4487

Avez-vous regardé le module owner dans iptables, éventuellement combiné avec une règle de source NAT ?

Cela vous permet de configurer des règles de chaîne OUTPUT en fonction de l'UID, du GID, du PID, du SID et du nom de la commande.

1voto

pehrs Points 8739

Il existe un support dans Linux pour lier une application à une IP spécifique (utilisé par exemple par Apache). Si votre application ne prend pas en charge cela, vous êtes malchanceux.

Je ne connais aucun module du noyau Linux (car c'est ce dont vous auriez besoin) pour lier une application spécifique à une interface même lorsqu'elle essaye de se lier à *. L'utilisation d'une machine virtuelle est une possibilité.

La chose la plus proche que je puisse vous proposer en l'absence de support d'application est le bonding des interfaces Ethernet (http://www.cyberciti.biz/howto/question/static/linux-ethernet-bonding-driver-howto.php). Mais alors, vous ne feriez fonctionner qu'une seule instance de l'application sur plusieurs interfaces avec la même adresse IP.

1voto

Avi Flax Points 83

Je crois que la meilleure option est de lier chaque application à une adresse IP différente et d'utiliser un routage basé sur la source pour changer par quelle interface les paquets provenant de cette adresse IP sont envoyés.

L'idée générale est que vous pouvez créer plusieurs tables de routage parallèles (la commande 'ip route' a un paramètre optionnel 'table'). Ensuite, vous ajoutez une règle disant "si c'est de l'IP [x.x.x.x] alors utilisez la table [foo]".

Ainsi :

  • Créez des tables de routage [foo1, foo2] dans /etc/iproute2/rt_tables
  • Remplissez les tables de routage (quelque chose comme "ip route add default gateway 1.2.3.4 dev eth0 table foo1" et de même pour foo2)
  • Créez des règles pour dire quelle table utiliser en fonction de l'IP source - "ip rule add from 1.2.3.2/32 table foo1", "ip rule add from 1.2.3.3/32 table foo2".

Je n'ai pas testé ces exemples spécifiquement, mais j'ai utilisé des méthodes similaires avec succès dans le passé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X