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
ip route add default dev eth-for-network-C via ...
. Si cela ne fonctionne pas, modifiez votre question avec le résultat deip addr
etip route
.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.Réponses:
J'ai testé la configuration suivante avec deux espaces de noms réseau et deux paires veth:
L’objectif est d’acheminer tout le trafic de
Main
àwlan0
(réseau C), tout en acheminant toutveth0
(réseau A) à traversveth1
(réseau B).Il y a une route normale par défaut sur
wlan0
, acquis via DHCP:Le transfert est activé:
Nous ajoutons une route par défaut pour
veth1a
dans un nouveau tableau, en supposant10.0.1.1
est la passerelle:Tout le trafic de et vers
veth0a
(10.0.0.0/24) utilise ce tableau: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 verswlan0
et avancer immédiatement en utilisant la même table. Cela générera généralement des paquets d'erreur ICMP:Adaptez-vous à votre configuration si nécessaire.
Non
localhost
a même été mentionné à distance nulle part.la source