web-dev-qa-db-fra.com

Répondre sur la même interface que l’entrée?

J'ai un système avec deux interfaces. Les deux interfaces sont connectées à Internet. L'un d'eux est défini comme l'itinéraire par défaut; un effet secondaire de ceci est que si un paquet arrive sur l'interface de route non par défaut, la réponse est renvoyée via l'interface de route par défaut. Existe-t-il un moyen d'utiliser iptables (ou autre chose) pour suivre la connexion et renvoyer la réponse via l'interface dont elle est issue?

54
Shawn J. Goff
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Ce qui précède ne nécessite aucun marquage de paquet avec ipfilter. Cela fonctionne parce que les paquets sortants (réponse) auront l'adresse IP qui a été utilisée à l'origine pour se connecter à la 2ème interface comme adresse source (de) sur le paquet sortant.

64
Peter

Les commandes suivantes créent une table de routage alternative via eth1 pour les paquets qui ont la marque 1 (sauf les paquets vers localhost). La commande ip provient de la suite iproute2 (Ubuntu: iprouteInstallez iproute http://bit.ly/software-small =, iproute-docInstallez iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

L'autre moitié du travail consiste à reconnaître les paquets qui doivent obtenir la marque 1; puis utilisez iptables -t mangle -A OUTPUT … -j MARK --set-mark 1 sur ces paquets pour les acheminer via la table de routage 1. Je pense que ce qui suit devrait le faire (remplacer 1.2.3.4 par l'adresse de l'interface de route non par défaut):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Je ne sais pas si cela suffit, peut-être qu'une autre règle est nécessaire sur les paquets entrants pour dire au module conntrack de les suivre.

J'ai eu des problèmes avec les paquets générés localement avec la solution suggérée par Peter, j'ai trouvé que ce qui suit corrige cela:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

REMARQUE: Vous pouvez rencontrer des problèmes de syntaxe avec la 4ème ligne ci-dessus. Dans de tels cas, la syntaxe de la 4e commande peut être la suivante:

ip rule add iif <interface> table isp2 priority 1000
5
Héctor Sánchez

Je suppose que vous utilisez Linux et, en outre, que vous utilisez une distribution basée sur RedHat/CentOS. D'autres Unix et distributions nécessiteront des étapes similaires - mais les détails seront différents.


Commencez par tester (notez que cela est très similaire à la réponse de @ Peter. Je suppose ce qui suit:

  • eno0 est isp0 et possède la passerelle par défaut globale
  • eno1 est isp1 et a l'IP/plage 192.168.1.2/24 avec la passerelle 192.168.1.1

Les commandes sont les suivantes:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Le pare-feu n'est impliqué en aucune façon. Les paquets de réponse auraient toujours été envoyés à partir de l'adresse IP correcte - mais étaient auparavant envoyés via la mauvaise interface. Maintenant, ces paquets provenant de la bonne IP seront envoyés via la bonne interface.


En supposant que ce qui précède a fonctionné, vous pouvez maintenant rendre les modifications de règle et d'itinéraire permanentes. Cela dépend de la version d'Unix que vous utilisez. Comme précédemment, je suppose une distribution Linux basée sur RH/CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Testez que le changement de réseau est permanent:

$ ifdown eno1 ; ifup eno1

Si cela ne fonctionne pas, sur les versions ultérieures de RH/CentOS, vous devez également utiliser l'une des deux options suivantes:

  • N'utilisez pas la valeur par défaut NetworkManager.service; Utilisez network.service à la place. Je n'ai pas exploré les étapes exactes nécessaires pour cela. J'imagine que cela implique les commandes standard chkconfig ou systemctl pour activer/désactiver les services.
  • Installez le package NetworkManager-dispatcher-routing-rules

Personnellement, je préfère installer le package de règles car c'est l'approche la plus simple et la plus prise en charge:

$ yum install NetworkManager-dispatcher-routing-rules

Une autre recommandation forte est d'activer le filtrage arp car cela évite d'autres problèmes liés aux configurations de réseau double. Avec RH/CentOS, ajoutez le contenu suivant au fichier /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
3
zaTricky