Comment réaliser un routage multivoie par paquet sous Linux?

9

Le noyau Linux avant 3.6 utilisait la mise en cache de routage pour effectuer le routage multivoie IPv4, ce qui signifiait que le routage entre deux lignes / FAI distinctes était assez facile. À partir de 3.6, l'algorithme est devenu par paquet, ce qui signifie que certaines astuces de table de routage / règle / iptables étaient nécessaires pour atteindre les deux lignes / FAI.

Cependant, si vous aviez deux lignes avec le même FAI qui pouvaient acheminer une seule IP sur les deux lignes par paquet de manière équilibrée / avec basculement, alors à partir de 3.6, vous pourriez facilement obtenir une liaison de ligne (au niveau IP) en raison de le routage par paquet dans les deux sens.

Depuis la version 4.4, le noyau est à nouveau passé à un équilibrage de charge basé sur le flux basé sur un hachage sur les adresses source et de destination.

J'utilise actuellement le noyau 4.4.36 et j'utilise le routage par trajets multiples sur les connexions PPPoE. Mon trafic en aval du FAI est acheminé sur les deux lignes distinctes par paquet (une IP acheminée sur les deux lignes). Cela me donne une vitesse de téléchargement plus rapide que la vitesse d'une ligne individuelle. Presque la vitesse des deux lignes s'ajoutait. Cela fonctionne très bien, la vidéo Skype, la VoIP (UDP), YouTube, etc. fonctionnent tous très bien.

En raison de cette bonne expérience en aval, je veux l'essayer en amont, mais mon trafic en amont est acheminé selon le nouvel algorithme basé sur les flux sur les deux appareils ppp (qui ont la même adresse IP). Cela signifie que je ne peux pas atteindre une vitesse de téléchargement plus rapide que la vitesse d'une seule ligne.

Existe-t-il un moyen de configurer le noyau actuel pour utiliser l'algorithme par paquet? Ou une autre méthode pour réaliser un routage par trajets multiples par paquet? Aurais-je besoin de revenir à un ancien noyau (ce que je ne veux pas faire pour diverses autres raisons)?

Mon FAI ne prend pas en charge ppp multi-liens.

Au cas où cela serait pertinent, j'utilise actuellement Arch Linux ARMv7 sur un Raspberry Pi 3.

bao7uo
la source
3
C'est une très mauvaise idée. L'équilibrage par paquet à L2 (c'est-à-dire MLPPP) inclut suffisamment de logique pour réassembler les paquets dans l'ordre. L'exécution de cette fonctionnalité sur IP ouvre une formidable opportunité (sinon une quasi-certitude) pour une livraison en panne. Cela va causer un grand nombre de problèmes avec des sessions TCP lentes, des UDP complètement cassés, des problèmes avec tout type de streaming en temps réel, etc. L'autre problème est que même si vous envoyez des paquets à tour de rôle à votre FAI, il y a absolument aucune suggestion qu'ils seront pareillement équilibrés vers vous.
rnxrx
@rnxrx merci pour votre commentaire - ont modifié la question pour fournir des détails supplémentaires. De ma question: "le trafic en aval du FAI est acheminé sur les deux lignes distinctes par paquet". Le FAI fournit un panneau de contrôle - lorsque je choisis une adresse IP à acheminer sur les deux lignes, il l'achemine par round-robin parfaitement équilibré par paquet. Fonctionne bien, à environ 90% du total des vitesses des deux lignes additionnées, et fournit un basculement instantané. Vidéo Skype, appels VOIP, YouTube, streaming BBC, etc. Tout est génial - Une telle expérience en aval me donne envie d'essayer en amont
bao7uo
1
Ahh - j'ai compris ... Donc, à l'heure actuelle, avez-vous deux adresses IP uniques (une par connexion) ou acheminent-elles vers une seule IP (ou un sous-réseau) de votre côté via deux chemins parallèles? Si vous exécutez n'importe quel type de NAT, il est évidemment crucial qu'il se produise avant cet équilibrage. Quoi qu'il en soit - avez-vous jeté un coup d'œil à support.aa.net.uk/… ? Il utilise des extensions iptables pour accomplir essentiellement ce que vous décrivez et, en tant que tel, devrait être assez cohérent dans les versions du noyau raisonnablement modernes.
rnxrx
Merci @rnxrx - oui, je peux faire l'une ou l'autre option (deux adresses IP uniques ou une adresse IP unique via les chemins parallèles). J'ai préféré l'option IP unique car elle semblait plus logique.
bao7uo

Réponses:

3

Ok, donc après avoir eu plus de temps pour enquêter, j'ai trouvé un moyen de le faire en utilisant Linux TEQL (True Link Equalizer). Voici un lien que j'ai vaguement suivi, mais avec quelques ajustements.

http://lartc.org/howto/lartc.loadshare.html

Voici comment je l'ai fait fonctionner sur Arch Linux ARMv7 (Raspberry Pi 3)

Au démarrage:

La commande suivante doit être exécutée au démarrage pour charger le module de noyau approprié.

modprobe sch_teql

Les commandes suivantes doivent également être exécutées au démarrage en supposant que vous souhaitiez NAT depuis un réseau local sur eth0.

sysctl -w net.ipv4.ip_forward=1
iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE

Le trafic de retour FORWARD est sur ppp + et le MASQUERADE POSTROUTING sur teql + car le trafic sortant sort sur teql et le trafic de retour revient sur ppp.

Lorsque des liens ppp apparaissent:

En supposant que les liens à équilibrer la charge sont ppp, les commandes suivantes à exécuter dans un script dans un /etc/ppp/ip-up.d/script.

sysctl -w net.ipv4.conf.ppp1.rp_filter=2
sysctl -w net.ipv4.conf.ppp2.rp_filter=2
tc qdisc add dev ppp1 root teql0
tc qdisc add dev ppp2 root teql0
ip address add 1.1.1.1/32 dev teql0
# you can add additional public IP addresses teql0 if you need to
ip link set teql0 up
ip route replace default scope global dev teql0

Où se 1.1.1.1trouve votre adresse IP publique face au FAI. Des adresses IP publiques supplémentaires peuvent être attribuées au périphérique teql0, mais n'ont pas besoin d'être attribuées aux périphériques ppp. Dans ma configuration, les deux liens ppp partagent la même IP (négociée par pppoe, etc.) Le lien teql a été attribué manuellement comme indiqué ci-dessus. Le FAI doit envoyer le trafic pour l'IP également sur les deux liaisons.

Le chemin inverse ( rp_filter) est défini sur 2(lâche) dans le script ci-dessus afin que les paquets de retour ne soient pas supprimés car ils reviennent sur les interfaces ppp plutôt que teql0.

Je l'ai configuré de cette façon et cela fonctionne parfaitement. Très facile! Lorsque les liens échouent, le basculement est transparent. Quand ils arrivent, ils recommencent à travailler. On dirait qu'il n'y a pas de perte ou de retard de paquet quand il bascule, et aucun quand il revient.

En outre, l'un des commentateurs a suggéré le lien ci-dessous qui utilise le routage des politiques, avec iptables pour marquer tous les autres paquets, etc., mais j'essaierai dans quelques jours pour voir s'il fonctionne mieux que ce qui précède et fournir des commentaires ici en conséquence.

http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing

bao7uo
la source
Je n'ai jamais essayé le routage des politiques car le TEQL fonctionnait si bien. Si ce n'est pas cassé ....
bao7uo
J'essaie de faire fonctionner ça. J'ai la liaison qui fonctionne, je peux utiliser l'interface liée du routeur. Je ne peux pas faire fonctionner le NAT cependant, le trafic de mon LAN ne descend pas le lien lié :(
andynormancx
si vous postez une nouvelle question sur la défaillance du serveur et que vous y liez un commentaire, je vais essayer de le comprendre pour vous. inclure autant d'informations que possible comme la configuration interface / ip, la table de routage, les règles iptables, etc., sauf si vous pouvez insérer toutes les informations ici dans les commentaires?
bao7uo
1
PS. vient de remarquer une erreur dans ma config. il a dit sysctl -w net.ipv4.ip_forwardmais devrait le dire sysctl -w net.ipv4.ip_forward=1, j'ai corrigé ci-dessus. Cela empêcherait certainement le trafic du LAN de descendre la liaison liée.
bao7uo
Je ne pense pas que c'est ce qui l'a empêché de fonctionner pour moi, j'avais le transfert activé dans sysctl. J'essaie maintenant de savoir si le nombre énorme de paquets en panne que je vois est prévu.
andynormancx