Répondre sur la même interface que entrant?

51

J'ai un système avec deux interfaces. Les deux interfaces sont connectées à Internet. L'un d'eux est défini comme route par défaut; Un effet secondaire de cela est que si un paquet arrive sur l'interface de route autre que celle 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 d'où elle provient?

Shawn J. Goff
la source

Réponses:

61
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 (de réponse) auront l'adresse IP qui était utilisée à l'origine pour se connecter à la 2ème interface en tant qu'adresse source (d'origine) sur le paquet sortant.

Peter
la source
7
Wow, c'est exactement ce que je cherchais. Si quelqu'un recherche des distributions basées sur RH, vous pouvez insérer les commandes de règle et de route appropriées dans des fichiers nommés 'rule-eth0' ou 'route-eth0' (par exemple), qui seront ajoutés ou supprimés sous ifup / ifdown. Placez ces fichiers à côté du fichier ifcfg-eth0. Pour IPv6, il existe une fonctionnalité "route6-eth0" intégrée, mais pas de "règle6-eth0" intégrée (pour le moment).
Kyle Brantley
18
Pour moi, cela ne fonctionnait que lorsque je devip ruleip rule add from <interface_IP> table isp2
laissais de
2
Vous pouvez faire en sorte que ceux-ci soient créés lorsque l'interface monte en ajoutant up ip rule add from <interface_IP> table isp2et up ip route add default via <gateway_IP> dev ppp0 table isp2à votre / etc / network / interfaces sous l'interface appropriée.
g.rocket
4
Je devais l'enlever dev <interface>de ip rulele faire fonctionner sur ma boîte. Si je comprends bien, dev <interface>est-ce que le filtrage des paquets qui étaient en quelque sorte configurés sur la mauvaise interface devait être arraché à la bonne interface par la route remplacée, mais le filtrage des règles par interface empêchait cela de se produire?
binki
2
Comme la plupart des gens, je devais me retirer dev <interface>de la ip rulecommande pour que cela fonctionne. S'il vous plaît mettre à jour la réponse! À part ce détail, cela a fonctionné à merveille. Merci beaucoup, Peter!
MoonSweep
6

Les commandes suivantes créent une autre table de routage via eth1pour les paquets portant la marque 1 (à l'exception des paquets vers localhost). La ipcommande provient de la suite iproute2 (Ubuntu: iproute Installez iproute http://bit.ly/software-small , iproute-doc Installez 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 recevoir la note 1; Ensuite, utilisez iptables -t mangle -A OUTPUT … -j MARK --set-mark 1ces 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 autre que celle 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, une autre règle est peut-être nécessaire sur les paquets entrants pour indiquer au module conntrack de les suivre.

Gilles, arrête de faire le mal
la source
Agréable. J'ai tout oublié de marquer. Cela devrait m'y amener.
Shawn J. Goff
5

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 4ème commande peut être la suivante:

ip rule add iif <interface> table isp2 priority 1000
Héctor Sánchez
la source
Essayé tellement mais rien n'a fonctionné à mon scénario, sauf cela .. merci beaucoup.
Agaggi
3

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 ceci est très similaire à la réponse de @ Peter. Je suppose ce qui suit:

  • eno0 est isp0 et a la passerelle par défaut globale
  • eno1 est isp1 et a l'adresse 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é d'aucune façon. Les paquets de réponse auraient toujours été envoyés à partir de la bonne adresse IP - mais étaient auparavant envoyés via une mauvaise interface. Maintenant, ces paquets de la bonne adresse 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 de route permanentes. Cela dépend de la version d'Unix que vous utilisez. Comme auparavant, 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

Vérifiez que le changement de réseau est permanent:

$ ifdown eno1 ; ifup eno1

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

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

Personnellement, je préfère installer le paquet de règles car il s’agit de l’approche la plus simple et la plus supportée:

$ yum install NetworkManager-dispatcher-routing-rules

Une autre recommandation forte consiste à activer le filtrage arp, afin d'éviter 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
zaTricky
la source