Routage localhost et uniquement localhost sur un autre réseau sous Linux?

0

Description du problème:

J'ai un problème assez compliqué où je n'arrive pas à comprendre comment le résoudre efficacement; Supposons qu'il y ait la configuration suivante:

Il y a 1 machine Linux connectée à 3 ensembles de réseaux, appelons-les A, B et C.

La machine Linux peut passer par Internet via le réseau A. Elle a un privé adresse IP sur ce réseau, mais NON NAT est activé dessus; par exemple. toutes les autres machines qui sont acheminées via ce réseau et qui ont un Publique ip donné par elle peut se connecter à Internet par l’intermédiaire de l’ordinateur, mais l’ordinateur en question ne peut pas le faire.

Le réseau B est un Publique ensemble de réseau ip; un ensemble de plusieurs réseaux publics. Par défaut, les paquets de B sont réexpédiés vers B et, pour toutes les autres destinations non B, sont acheminés via A.

Le réseau C est, comme A, également un réseau où la machine a une privé adresse. Cependant, ici NAT est activée. Le réseau C peut être utilisé pour communiquer avec Internet, mais les périphériques du réseau B ne sont pas autorisés à acheminer par C, ils doivent acheminer par A.

Actuellement, la machine Linux ne peut pas parler à Internet. Je veux qu'il puisse le faire (par exemple, ping sur www.stackoverflow.com pour ne pas renvoyer le délai d'attente).

Comment dire à Linux d'utiliser une autre passerelle pour son propre trafic, et uniquement pour son propre trafic (source ou destination == localhost)?

Important

Je ne souhaite pas acheminer tout le trafic sur Internet via un seul réseau. Le trafic entrant / sortant sur Internet doit être utilisé deux Réseaux, selon la source: Tout de la machine Linux sur un réseau (C), tout ce qu’elle route (qui n’est pas sur l’une de ses plages locales), elle route sur l’autre (A).

Solution provisoire

Tout d’abord, j’ai pensé à ajouter simplement 'from / to localhost' au ip rule table, mais ce n'est pas autorisé. Quel est le moyen le plus simple d'autoriser ce routeur à utiliser un autre routeur du réseau C comme passerelle, mais uniquement à partir du trafic provenant de la machine elle-même?

Essentiellement, ce que je souhaiterais, ce serait quelque chose qui serait équivalent à l'exemple ci-dessous, si cela fonctionnait réellement de manière naïve et intuitive:

0: from all lookup local
32000: from localhost lookup myroute
32100: from all lookup main 
32767: from all lookup default
aphid
la source
Le trafic ne provient pas de localhost car il s’agit de la connexion en boucle.
Daniel B
Terminologie confuse mise à part, mon intention devrait être claire; trafic en provenance de la machine elle-même: je veux qu'il choisisse l'adresse IP du réseau C par défaut comme étant sa propre adresse IP, mais il essaie de passer par A (qui échoue). Trafic venant de B: route passant par A.
aphid
Quelle que soit la solution, cela ne nécessite pas de réacheminer le périphérique de bouclage. Si je vous ai bien compris, vous souhaitez utiliser le réseau C comme route par défaut et NATing votre machine Linux sur C fonctionne déjà. Alors utilisez quelque chose comme ip route add default dev eth-for-network-C via .... Si cela ne fonctionne pas, modifiez votre question avec le résultat de ip addr et ip route.
dirkt
@dirkt. Ce n'est pas la bonne réponse et la seule réponse que j'ai trouvée en ligne jusqu'à présent. Lorsque vous faites tout simplement «acheminez tout via X», y compris le trafic provenant du réseau B, lorsque ce que je veux est; l'ordinateur lui-même utilise une passerelle en C, mais tout ce qui provient du réseau B est envoyé via la passerelle de A. Cette boîte est un véritable routeur, pas seulement un point d'extrémité.
aphid
Non, le trafic provenant du réseau B n'est transféré vers le réseau C que si vous activez le transfert, ce qui est normalement désactivé. Si vous voulez utiliser l'ordinateur tous les deux en tant que routeur de transfert et en tant que machine normale, alors oui, le routage de la politique aide (ou vous pouvez utiliser iptables ). Mais vous avez toujours besoin de la route par défaut vers le réseau C et cela n’a toujours rien à voir avec "forwarding localhost". Localhost est l'adresse de l'ordinateur lui-même via le périphérique de bouclage ("réseau D", si vous voulez), et rien d'autre.
dirkt

Réponses:

0

J'ai testé la configuration suivante avec deux espaces de noms réseau et deux paires veth:

+-- Main --+
|          | 192.168.2.21/24
|    wlan0 | ------------------- ...
|          |
|          | 10.0.0.254/24   10.0.0.1/24 +-- NS0 --+
|   veth0a | --------------------------- | veth0b  |
|          |                             +---------+
|          |
|          | 10.0.1.254/24   10.0.1.1/24 +-- NS1 --+
|   veth1a | --------------------------- | veth1b  |
|          |                             +---------+
+----------+

L’objectif est d’acheminer tout le trafic de Main à wlan0 (réseau C), tout en acheminant tout veth0 (réseau A) à travers veth1 (réseau B).

Il y a une route normale par défaut sur wlan0, acquis via DHCP:

$ ip route
default via 192.168.2.1 dev wlan0 
...

Le transfert est activé:

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

Nous ajoutons une route par défaut pour veth1a dans un nouveau tableau, en supposant 10.0.1.1 est la passerelle:

sudo ip route add 10.0.1.0/24 table 250 dev veth1a src 10.0.1.254
sudo ip route add default table 250 dev veth1a via 10.0.1.1

Tout le trafic de et vers veth0a (10.0.0.0/24) utilise ce tableau:

sudo ip rule add from 10.0.0.0/24 table 250
sudo ip rule add to 10.0.0.0/24 table 250

Si quelqu'un derrière veth1b (10.0.1.0/24) a l’idée stupide d’essayer de nous utiliser comme passerelle, d’empêcher le transfert vers wlan0 et avancer immédiatement en utilisant la même table. Cela générera généralement des paquets d'erreur ICMP:

sudo ip rule add from 10.0.1.0/24 table 250
sudo ip rule add to 10.0.1.0/24 table 250

Adaptez-vous à votre configuration si nécessaire.

Non localhost a même été mentionné à distance nulle part.

dirkt
la source