Deux interfaces, deux adresses, deux passerelles?

15

J'ai un système qui a deux interfaces réseau avec des adresses IP différentes, qui sont toutes deux dans la plage d'adresses publiques (bien que via NAT dans le cas de la première) et qui ont toutes deux des passerelles différentes. (Longue histoire, c'est à des fins de test)

Le problème est qu'en ce moment, si j'essaie d'envoyer une requête ping à l'adresse sur la deuxième interface, l'itinéraire par défaut indique via la première interface - et n'arrive jamais correctement.

Est-il possible de s’assurer que les réponses sortent toujours sur la même interface réseau (et avec la même IP source) qu’elles sont entrées? Et si oui, comment?

Shadur
la source
1
Peut-être une variante à cela: unix.stackexchange.com/questions/4420/…
Shawn J. Goff

Réponses:

17

Vous comprenez mal le problème. Tous les paquets ne sont pas une réponse et tous les paquets ne peuvent pas être mis en correspondance avec un autre paquet, de sorte que "la même interface réseau que celle sur laquelle ils sont entrés" est logique. Ce que vous voulez faire, c'est sélectionner la passerelle pour un paquet en fonction de son adresse IP source.

C'est ce qu'on appelle le routage basé sur la source ou le routage de stratégie. Vous pouvez le faire avec une règle simpleiptables , mais la meilleure façon est de configurer deux tables de routage, une pour chaque adresse source publique:

Créez d'abord deux tables (remplacez <NAME1> et <NAME2> par des noms raisonnables pour vos deux fournisseurs, de même avec IP1, DEV1, etc.):

echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables

Ajoutez une passerelle à chaque table de routage (si nécessaire):

ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>

Puis un itinéraire par défaut:

ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>

Ensuite, les règles pour sélectionner la table de routage en fonction de l'adresse source:

ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>

Voir Routage pour plusieurs liaisons montantes / fournisseurs pour plus de détails.

David Schwartz
la source
Vous avez écrit: «Tous les paquets ne sont pas une réponse et tous les paquets ne peuvent pas être mis en correspondance avec un autre paquet, de sorte que« la même interface réseau que celle sur laquelle ils sont entrés »est logique. «Pouvez-vous expliquer cela davantage? Je comprends que tous les paquets ne sont pas une réponse et que tous les paquets ne peuvent pas être associés à un autre paquet "source". Si nous excluons ces paquets de la considération, car ils ne posent aucun problème et ne nous concernent donc pas, pourquoi les paquets restants ne peuvent pas être acheminés vers la "même interface réseau que celle sur laquelle ils sont entrés"?
Andrew Savinykh
@AndrewSavinykh Cela ne résoudrait pas tout le problème. En particulier, il se brisait chaque fois qu'un paquet sortant provenait localement (comme une requête ping sortante) sortait de la mauvaise interface pour son adresse IP source et était abandonné par la passerelle. Le problème est, comme je l'ai expliqué, de s'assurer que les paquets sortent de la passerelle correspondant à leur adresse IP source.
David Schwartz
David, je veux réaliser la même chose que OP mais je ne peux pas. J'ai posté une question ici: serverfault.com/questions/992624/… , ce serait génial si vous pouviez y jeter un œil
Housemd
6

La réponse de David Schwartz est excellente, mais vous pouvez simplifier un peu les règles de routage en ayant une seule table supplémentaire et en utilisant votre route par défaut pour l'autre. J'ai un serveur derrière deux passerelles NAT, et j'ai récemment suivi le processus de recréation de ce scénario entre un tas de machines virtuelles. Mon /etc/network/interfacesressemble à ceci:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.13.13
    netmask 255.255.255.0
    up ip route add table optus default via 192.168.13.10
    up ip rule add from 192.168.13.213 table optus
    up ip route add default via 192.168.13.11

auto eth0:0
iface eth0:0 inet static
    address 192.168.13.213
    netmask 255.255.255.0

(c'est pour une configuration où les deux FAI sont Optus et iiNet, d'où le nom de table de 'optus')

Cela, plus la ligne de /etc/iproute2/rt_tablescréation de la table, devrait être tout ce dont vous avez besoin. Vous aurez deux adresses IP; le trafic de 192.168.13.13 sortira via 192.168.13.11, et le trafic de 192.168.13.213 sortira via 192.168.13.10. Configurez ces deux passerelles pour effectuer leur redirection de port de manière appropriée (192.168.13.11 transfère les éléments vers 192.168.13.13 et 192.168.13.10 transfère les éléments vers 192.168.13.213), et le reste devrait prendre soin de lui-même.

Vous devrez peut-être modifier un peu les choses pour votre situation, car vous utilisez directement des adresses IP publiques, mais quelque chose comme ça devrait toujours fonctionner. De plus, il est beaucoup plus facile de faire ces choses dans /etc/network/interfacespuis de gérer ce fichier, plutôt que d'essayer de se rappeler comment vous l'avez configuré, deux ans plus tard, lorsque le système doit être redémarré!

rosuav
la source
1

Exemple de double réseau

Cet exemple montre comment un complément eth1avec 10.130.0.2masque de réseau 255.255.255.255et la passerelle 10.130.0.1peuvent être mis à la disposition des services qui s'y lient commeping -I eth1 8.8.8.8

Techniquement, nous sommes:

  • Ajout d'une autre passerelle avec une métrique supérieure
  • Ajouter / utiliser la table 100 et la configurer
  • Ajout d'une règle pour acheminer le trafic vers / depuis eth1 à travers celui-ci
ip addr add 10.130.0.2/32 broadcast 10.130.0.2 dev eth1
ip link set eth1 up
ip route add 10.130.0.1 src 10.130.0.2 dev eth1
ip route add 10.130.0.1 src 10.130.0.2 dev eth1 table 100
ip route add default via 10.130.0.1 dev eth1 metric 10
ip route add default via 10.130.0.1 dev eth1 table 100
ip rule add from 10.130.0.2/32 table 100
ip rule add to 10.130.0.2/32 table 100
curl --interface eth1 ifconfig.co
curl --interface eth0 ifconfig.co
ping -I eth1 8.8.8.8
intika
la source