J'ai un Raspberry Pi, fonctionnant sous Raspbian (basé sur Debian), avec 2 interfaces réseau.
L'une des interfaces est le WAN, provenant d'un modem satellite. L'autre est le routeur du client, pour lequel le Pi fournit l'Internet.
Le problème est que je n'ai affaire qu'à un /30, et que le modem satellite possède déjà l'une des deux IP sur ce /30, il ne me reste donc qu'une IP (1.1.1.2/30), et deux appareils qui la veulent (mon Raspberry Pi, et le routeur du client).
Je sais que je peux facilement faire du NAT, et donner au client une IP de réseau local. Ce n'est pas ce que je veux. J'ai besoin que le client ait une IP publique. Je sais également que je peux configurer le Pi pour qu'il ne soit qu'un commutateur, sans IP propre, mais le Pi n'aura alors pas d'accès à Internet. Ce n'est pas ce que je veux non plus. J'ai besoin que le Pi et le routeur du client aient tous deux accès à Internet.
Je sais que c'est possible, car j'ai utilisé des modems cellulaires MicroHard dans le passé qui font exactement la même chose. Le modem cellulaire obtient une IP publique lorsqu'il se connecte à la tour cellulaire, et lorsque vous activez le mode IP passthrough, un routeur branché sur ce modem cellulaire obtiendra également la même IP publique.
Si vous accédez à cette IP publique depuis Internet sur le port 80, 443 ou 22, vous parlerez au modem cellulaire, mais si vous accédez à un autre port, vous parlerez au routeur derrière le modem cellulaire. C'est exactement ce que je veux faire. Je ne suis juste pas sûr de savoir exactement comment ils font, et comment je le reproduis sous Linux. Les modems cellulaires MicroHard sont basés sur Linux, donc c'est possible sous Linux.
Pour l'instant, c'est mon plan :
- IP statique de 1.1.1.2/30 sur eth0 du Raspberry Pi (Interface Sat Modem)
- IP statique de 1.1.1.254/24 sur eth1 du Raspberry Pi (Interface du routeur client)
- Serveur DHCP sur eth1 donnant le routeur du client :
- 1.1.1.2/24
- DG : 1.1.1.254
- Activé net.ipv4.ip_forward
- Puisque les 2 sous-réseaux sur les 2 interfaces se chevauchent évidemment, utilisez des règles de routage basées sur des politiques pour indiquer au Pi quand et où il doit envoyer le trafic.
Cela ressemble maintenant à ceci :
J'ai essayé de le faire fonctionner, mais le dernier point est évidemment la partie la plus difficile. Tout le reste (routeur DHCP, IP statiques, transfert d'IP) est terminé et fonctionne.
Je l'ai fait :
# Rules to prevent ARP from going out the wrong interface
$ sudo arptables -A INPUT -i eth0 --destination-ip ! 1.1.1.2 -j DROP
$ sudo arptables -A INPUT -i eth1 --destination-ip ! 1.1.1.254 -j DROP
# Create custom routing tables
$ sudo vim /etc/iproute2/rt_tables
190 to_sat_modem
200 to_customer_router
# Add rules to tables
$ sudo ip route add default dev eth0 table to_sat_modem
$ sudo ip route add default dev eth1 table to_customer_router
# Add policy based routing rules
$ sudo ip rule add fwmark 0x1 lookup to_sat_modem
$ sudo ip rule add fwmark 0x2 lookup to_customer_router
# Add masq rule
$ sudo iptables -t nat -A POSTROUTING -o eth0 ! -s 1.1.1.2 -j SNAT --to 1.1.1.2
# Add rules for when to use these routing tables
$ sudo iptables -t mangle -N TO_CUSTOMER_ROUTER
$ sudo iptables -t mangle -N TO_SAT_MODEM
$ sudo iptables -t mangle -A OUTPUT -d 1.1.1.2 -j TO_CUSTOMER_ROUTER # From localhost
$ sudo iptables -t mangle -A PREROUTING -i eth0 -d 1.1.1.2 -p udp -j TO_CUSTOMER_ROUTER # All UDP ports
$ sudo iptables -t mangle -A PREROUTING -i eth0 -d 1.1.1.2 -p tcp --match multiport ! --dports 22,80 -j TO_CUSTOMER_ROUTER # Most TCP ports
$ sudo iptables -t mangle -A TO_CUSTOMER_ROUTER -j MARK --set-xmark 0x2
$ sudo iptables -t mangle -A TO_CUSTOMER_ROUTER -j ACCEPT
$ sudo iptables -t mangle -A OUTPUT -d 1.1.1.1 -j TO_SAT_MODEM # From localhost
$ sudo iptables -t mangle -A PREROUTING -i eth1 -d 1.1.1.1 -j TO_SAT_MODEM
$ sudo iptables -t mangle -A TO_SAT_MODEM -j MARK --set-xmark 0x1
$ sudo iptables -t mangle -A TO_SAT_MODEM -j ACCEPT
J'ai l'impression d'être sur la bonne voie, mais je ne parviens pas à le faire fonctionner. Avez-vous des idées ?
PS. Oui, je sais que la plupart de mes règles ne survivront pas à un redémarrage. Je corrigerai cela une fois que j'aurai une solution qui fonctionne.
PPS. Cela revient à essayer d'obtenir une transparence à sens unique. Le modem satellite ne verra qu'un seul appareil derrière lui (1.1.1.2), tandis que le routeur client pourra parler au Pi (1.1.1.254) et au modem satellite (1.1.1.1). Cela devrait fonctionner, mais pose le problème du masquage d'un /24 entier d'adresses IP publiques réelles. Je peux remplacer le /24 par un /29 pour réduire l'effet, mais cela se produira quand même. À terme, je voudrais une transparence bidirectionnelle pour pouvoir réutiliser les IP /30 aux deux extrémités du Pi, mais je me suis dit que ce serait plus simple pour commencer
PPPS. Je suis conscient que la réponse évidente à cette question est la suivante
Ne faites pas ça. Faites autre chose. Donnez au client une IP de réseau local, ou mettez votre Pi derrière le routeur du client et donnez-lui une IP de réseau local, ou mettez le pi en mode pont, ou ...
Je ne veux pas écrire une explication de 10 pages sur les raisons pour lesquelles cela doit être fait de cette façon, mais croyez-moi, cela doit être fait de cette façon, si c'est possible, ce qui, comme je l'ai dit, est possible parce que je l'ai vu faire