Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

[Tuto] Agrégation WAN - VPN Bonding

Brelok
Timide
Messages : 66
Inscription : 22 août 2016, 13:45

[Tuto] Agrégation WAN - VPN Bonding

Message par Brelok » 20 nov. 2017, 17:32

Salut à tous,


Le but de ce tuto est de vous présenter comment agréger plusieurs connexions (Fibre, ADSl, 4G, FH, ...) et ainsi cumuler les débit.
Il existe aujourd'hui des Firewalls/Routeurs avec plusieurs interfaces WAN (Pfsense, Sophos, ...). Alors oui, ça fonctionne bien, les débits sont effectivement cumulés. Par contre ça ne fonctionne que pour le sens descendant (Download), pas pour le sens montant. De plus, si vous hostez des serveurs et que vous voulez les exposer sur Internet, seulement une seule connexion sera utilisée; il n y aura pas d'agrégation. (Petit souci en passant sur les accès 4G, ou il n'est pas possible de faire de l'entrant de part l'architecture opérateur CGNAT).

La solution exposée ici permet de réellement agréger les connexions, de pouvoir faire l'entrant, de profiter de service anti DDoS ... la belle vie quoi !
J'ai quelques serveurs accessibles depuis le net (Notamment mon jeedom), et l'upload est primordial pour ne pas crever d'ennuis devant la page qui charge.

Pour info j'habite en campagne. Mon débit est correct en ADSL : 16Mb down, 1Mb up.
Par contre le calvaire est que je perds la méga dose de paquet, donc navigation difficile, TV qui passe en SD, l'accès à mes serveurs web passe souvent en timeout.....
Je peux rêver pour avoir la fibre avant ma retraite....
J'ai donc décidé de souscrire à une offre 4G et de cumuler les débits. (Antenne pas trop loin : entre 30 et 60Mb/s Down et entre 15 et 20 Mb/s up)

Voici un schéma de l'architecture
Bonding.png
Bonding.png (29.93 Kio) Consulté 13346 fois
Le fonctionnement:

La machine locale initie 2 tunnels VPN. Un tunnel via l'IP A du VPS via l'ADSL et un second tunnel via l'IP B du VPS via la 4G. Avec la fonctionnalité de bonding sous linux, on va créer une interface virtuelle qui agrégera les deux interfaces tunnels et ainsi cumulera les débits de façon transparente.
La gateway de mon firewall est donc la machine linux en DMZ (avec l'ip en 2)

Matériel nécessaire
  • Minimum 2 connexions internet (Ça marche avec autant de connexion que vous voulez. Les perfs des machines sont a prévoir en conséquence)
  • Pour l'accès 4G, j'ai pris red 100Go sur un routeur TP-link
  • Un serveur dans le cloud (Perso j'ai pris un VPS: VPS SSD 1 -> 40€/an - De mon coté il s'agit d'une Ubuntu server en 16.04
  • J'ai repris 2 IP Failover chez OVH aussi (on verra par la suite l’intérêt) -> 4.8€ de mise en service et 0€ mensuel
  • Une machine linux (Je pense que ça peut tourner sur un raspberry) - De mon coté il s'agit d'une Ubuntu server en 16.04

Cout total:
  • Le cout de chaque connexion
    Pour l'ADSL, c'est plutôt simple de trouver des Ventes privées à moins de5 € par mois (En plus, si vous êtes coupés car vous passez d'une offre à l'autre, la connexion 4G prendra le secours)
    Pour la 4g, entre 15 et 20€ pour de l'illimité
  • Le serveur VPS -> 45 €/an, soit 3 € par mois (+ l'installation des 2 IP 4.8€ à l'installation. Il n y a pas de récurrent)
  • OPEX : 25 € par mois
Pour la partie matos:
  • Machine linux a la maison
    --Perso ça tourne sur un serveur avec ESXI. Vu les performances demandées, un Raspberry Pi3 fera l'affaire : 50 € avec carte SD ...
  • Routeur 4g -> TP-LINK MR6400 90€
  • CAPEX: 140 €
Préparatif
Alors pas de mystère, il faut que les 2 machines (locale et distante) soient à jour

Code : Tout sélectionner

apt update
apt upgrade
Pour que tout fonctionne il faut aussi les packets
  • Openvpn (Pour monter les tunnels OpenVPN)

Code : Tout sélectionner

apt install openvpn
  • ifenslave (Pour gérer le bonding)

Code : Tout sélectionner

apt install ifenslave
  • iptables-persistent (Pour faire en sorte que les règles Iptables soient persistantes et qu'on ne soit pas obligé de tout refaire à chaque reboot)

Code : Tout sélectionner

apt install iptables-persistent
  • Coté serveur, on installe également easy rsa (Couche sécu sur Openvpn)

Code : Tout sélectionner

apt install easy-rsa

Ok, on est prêt, on peut passer à la configuration.
Dernière édition par Brelok le 18 déc. 2017, 14:38, édité 2 fois.

Brelok
Timide
Messages : 66
Inscription : 22 août 2016, 13:45

Re: Agregation WAN

Message par Brelok » 20 nov. 2017, 17:33

Config sur le serveur:
On a commandé 2 IP supplémentaires sur notre VPS. Alors il faut les configurer et créer des Alias (Ce sera vers chacune de ces IPs que les tunnels seront montés)
On édite le fichier suivant : /etc/network/interfaces.d/eth0.cfg et on ajoute la conf. Il faut modifier les valeurs A.A.A.A et B.B.B.B avec les IPs respectives A et B

Code : Tout sélectionner

auto eth0:0
iface eth0:0 inet static
address A.A.A.A
netmask 255.255.255.255

auto eth0:1
iface eth0:1 inet static
address B.B.B.B
netmask 255.255.255.255

post-up /sbin/ifconfig eth0:0 A.A.A.A netmask 255.255.255.255 broadcast A.A.A.A
pre-down /sbin/ifconfig eth0:0 down

post-up /sbin/ifconfig eth0:1 B.B.B.B netmask 255.255.255.255 broadcast B.B.B.B
pre-down /sbin/ifconfig eth0:1 down
On redémarre le service et normalement ces IPs sont pingables.

Code : Tout sélectionner

systemctl restart networking.service

On va générer ensuite les clefs nécessaires au VPN

Code : Tout sélectionner

cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa/
openvpn --genkey --secret keys/ta.key
cp keys/ta.key /etc/openvpn
Puisque l'on monte 1 tunnels par connexion, il faut une fichier de conf par tunnel (Dans mon cas, un via la ligne free adsl, l'autre via la 4G Sfr). Donc le serveur écoute sur le port 1194 sur l'IP A et B.
On créé alors celui pour free dans /etc/openvpn/free.conf

Code : Tout sélectionner

local A.A.A.A
port 1194
proto udp
txqueuelen 1000
dev tap0
dev-type tap
mode p2p
cipher AES-256-CBC
secret ta.key
keepalive 1 2
user nobody
group nogroup
persist-tun
persist-key
comp-lzo no
verb 4
log-append /var/log/ovpn_free.log
replay-window 512 15
status /var/log/ovpn_free_status.log
On créé ensuite celui pour SFR dans /etc/openvpn/sfr.conf

Code : Tout sélectionner

local B.B.B.B
port 1194
proto udp
txqueuelen 1000
dev tap1
dev-type tap
mode p2p
cipher AES-256-CBC
secret ta.key
keepalive 1 2
user nobody
group nogroup
persist-tun
persist-key
comp-lzo no
verb 4
log-append /var/log/ovpn_sfr.log
replay-window 512 15
status /var/log/ovpn_sfr_status.log
Puis, on peut démarre OpenVPN. Normalement, on voit déjà les deux interfaces tunnels (Tap0 et tap1)

Code : Tout sélectionner

systemctl start openvpn
le ifconfig doit bien vous montrer les 2 interfaces tap

Code : Tout sélectionner

tap0      Link encap:Ethernet  HWaddr 86:77:8c:e2:21:7e 
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1668985 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3014439 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:151981631 (151.9 MB)  TX bytes:3575872869 (3.5 GB)

tap1      Link encap:Ethernet  HWaddr 86:77:8c:e2:21:7e 
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:1207141 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1354715 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:305452564 (305.4 MB)  TX bytes:1170742898 (1.1 GB)

Conf sur le client:
On défini dans le fichier interface (en plus des paramètres IP) les routes vers les deux IP du serveurs VPS. On remarque que l'on précise bien que IP A pointe vers l'ADSL, et IP B vers la 4G.

Code : Tout sélectionner

auto ens192
iface ens192 inet static
    address 192.168.0.2
    netmask 255.255.255.0
    post-up /sbin/ip route add A.A.A.A. via 192.168.0.254 dev ens192
    post-up /sbin/ip route add B.B.B.B via 192.168.0.253 dev ens192
    post-up /sbin/modprobe bonding
  • Il est possible de faire tout ca avec une seule et même IP coté VPS. Il faut alors jouer avec la table Mangle et iproute2 pour aiguiller le traffic (qui est remarqué via la table mangle) en fonction de la destination; mais je n’apprécie pas cette méthode pour des raisons de complexité de troubleshooting. De la même façon, il doit être possible de le faire via du PBR (Policy based routing), mais je n'ai pas testé.
    Pour le prix que coute 2 IP alias sur un serveur, j'ai préféré partir sur quelque chose de plus simple...
Il faut ensuite créer les fichiers de conf pour OpenVPN. De la même façon, il faut créer autant de fichier de conf, que l'on a de connexion.
Il ne faut pas oublier le paramètre keepalive (Dans ma conf à 10 120). Cela permet en cas de perte d'un tunnel de le forcer a renégocier au bout de 120 secondes. Si non précisé, c'est le comportement par defaut de OpenVPN, mais ça ne fonctionnait pas chez moi , d’où le paramètre.
On créé le fichier /etc/openvpn/free.conf

Code : Tout sélectionner

remote A.A.A.A 1194
proto udp
dev tap0
dev-type tap
up-delay 2
down-pre
down /root/del_tap0
up /root/add_tap0
txqueuelen 1000
mode p2p
keepalive 10 120
secret ta.key
cipher AES-256-CBC
nobind
persist-key
comp-lzo no
verb 4
log-append /var/log/ovpn_free.log
replay-window 512 15
Pareil pour sfr, dans /etc/openvpn/sfr.conf

Code : Tout sélectionner

remote B.B.B.B 1194
proto udp
dev tap1
dev-type tap
up-delay 2
down-pre
down /root/del_tap1
up /root/add_tap1
txqueuelen 1000
mode p2p
keepalive 10 120
secret ta.key
cipher AES-256-CBC
nobind
persist-key
comp-lzo no
verb 4
log-append /var/log/ovpn_sfr.log
replay-window 512 15
Nous avons généré au tout début une clef sur le serveur distant. Il faut récupérer cette clef ta.key dans
/etc/openvpn/ta.key.
Donc soit copié via SCP, SFTP ou bien éditer le fichier sur le serveur, copier l’intégralité puis créer un nouveau fichier sur le serveur local et coller


On va ensuite créer 4 scripts permettant aux tunnels de joindre/quitter le bonding en fonction de leur état. On voit que ces script sont appelés dans le fichier de conf openvpn:
/root/add_tap0

Code : Tout sélectionner

#!/bin/bash
/sbin/ifenslave bond0 tap0
exit 0
/root/add_tap1

Code : Tout sélectionner

#!/bin/bash
/sbin/ifenslave bond0 tap1
exit 0
/root/del_tap0

Code : Tout sélectionner

#!/bin/bash
/sbin/ifenslave -d bond0 tap0
exit 0
/root/del_tap1

Code : Tout sélectionner

#!/bin/bash
/sbin/ifenslave -d bond0 tap1
exit 0
On peut redémarrer Openvpn. Normalement les interfaces Tap sont up. Comme pour le serveur
Dernière édition par Brelok le 18 déc. 2017, 14:38, édité 6 fois.

Brelok
Timide
Messages : 66
Inscription : 22 août 2016, 13:45

Re: Agregation WAN

Message par Brelok » 20 nov. 2017, 17:33

Configuration du bonding:
Alors, il existe plein de méthode de bonding : https://doc.ubuntu-fr.org/bonding.
En fonction de vos liens (latence, perte de paquet, ...) il faudra choisir entre le mode 0 (RR -> load balancing par paquet) ou le mode 2 (XOR - partage par session couche 3/4). Il faut tester pour voir ce qui va le mieux pour vous. Moi étant donné que ma connexion DSL n'est pas fiable (perte de paquet) le mode RR me donnait des perf pourries. Je suis donc en mode XOR layer3+4. A vous de tester ce qui va le mieux.

Configuration coté Serveur
On édite ce fichier /etc/modprobe.d/aliases-bond.conf pour préciser le type de bonding. Si vous voulez tester le RR, alors il faut mettre le mode a 2 et supprimer le hash_policy

Code : Tout sélectionner

alias bond0 bonding
options bonding mode=2 xmit_hash_policy=layer3+4
On rajoute le bond0 dans le fichier interface: /etc/network/interfaces Je précise aussi le routage de mon réseau en 192.168.0.0/24. On précise l'intervalle des requetes ARP à 100ms. De ce fait, si un tunnel tombe, il faudra 100ms pour aiguiller le trafic vers le tunnel up.

Code : Tout sélectionner

auto bond0
iface bond0 inet static
    address 172.16.16.1
    netmask 255.255.255.252
    bond-slaves none
    bond-mode 2
    bond-arp_interval 100
    bond-arp_ip_target 172.16.16.2
pre-up /etc/init.d/openvpn start
pre-up /sbin/modprobe bonding
post-up /sbin/ip route add 192.168.0.0/24 via 172.16.16.2 dev bond0
post-down /etc/init.d/openvpn stop
post-down /sbin/rmmod bonding

auto tap0
iface tap0 inet manual
        bond-master bond0

auto tap1
iface tap1 inet manual
        bond-master bond0
On modifie le fichier /etc/sysctl.conf pour autoriser le forward. Il faut decommenter la ligne

Code : Tout sélectionner

net.ipv4.ip_forward=1
On démarre l'interface et valide que le bonding contient bien tap0 et tap1. On valide aussi le mode du bonding

Code : Tout sélectionner

ifup bond0
Puis

Code : Tout sélectionner

cat /proc/net/bonding/bond0
On doit obtenir un output :

Code : Tout sélectionner

Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
ARP Polling Interval (ms): 100
ARP IP target/s (n.n.n.n form): 172.16.16.2

Slave Interface: tap1
MII Status: up
Speed: 10 Mbps
Duplex: full
Link Failure Count: 69
Permanent HW addr: 86:77:8c:e2:21:7e
Slave queue ID: 0

Slave Interface: tap0
MII Status: up
Speed: 10 Mbps
Duplex: full
Link Failure Count: 8985
Permanent HW addr: ce:b6:17:96:f6:36
Slave queue ID: 0
Configuration coté Client
Comme sur le serveur, on édite /etc/modprobe.d/aliases-bond.conf afin de préciser le balancing

Code : Tout sélectionner

alias bond0 bonding
options bonding mode=2 xmit_hash_policy=layer3+4
On rajoute le bond0 dans le fichier interface:

Code : Tout sélectionner

auto bond0
iface bond0 inet static
    address 172.16.16.2
    netmask 255.255.255.252
    bond-mode 2
    pre-up sleep 2
    bond-arp_interval 100
    bond-arp_ip_target 172.16.16.1
    pre-up /etc/init.d/openvpn start
    post-up /sbin/ip route add 0.0.0.0/0 via 172.16.16.1 dev bond0
    post-down /usr/sbin/service openvpn stop
    post-down /sbin/rmmod bonding

auto tap0
iface tap0 inet manual
        bond-master bond0
auto tap1
iface tap1 inet manual
        bond-master bond0

On modifie le fichier /etc/sysctl.conf pour autoriser le forward. Il faut decommenter la ligne

Code : Tout sélectionner

net.ipv4.ip_forward=1
On démarre l'interface et valide que le bonding contient bien tap0 et tap1. On valide aussi le mode du bonding avec la commande

Code : Tout sélectionner

ifup bond0
Puis

Code : Tout sélectionner

cat /proc/net/bonding/bond0
Règles iptables.
On créer les règles iptables qui vont bien sur le serveur pour autoriser les connexions et créer le Masquerading (NAT) pour pouvoir sortir. Pour cela on edite le fichier /etc/iptables/rules.v4

Code : Tout sélectionner

-A POSTROUTING -o eth0 -j MASQUERADE
-A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1194 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i tap0 -j ACCEPT
-A INPUT -i tap1 -j ACCEPT
-A INPUT -i bond0 -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -i bond0 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tap0 -j ACCEPT
-A FORWARD -i tap1 -j ACCEPT
-A FORWARD -i bond0 -j ACCEPT
-A OUTPUT -o tap0 -j ACCEPT
-A OUTPUT -o tap1 -j ACCEPT
-A OUTPUT -o bond0 -j ACCEPT
COMMIT

Check:
On valide que tout est OK. Depuis le client, on ping bien le serveur, et le net.
On fait un test de débit et on valide que tout est OK. Latence et débit plus qu'acceptable :)
nperf.png
nperf.png (140.95 Kio) Consulté 13325 fois
On valide aussi que l'on sort bien avec une IP OVH (masquée).
J'ai pas précisé, mais si je perds la 4G ou l'ADSL, c'est transparent. Je perds du débit, mais pas la connectivité.

Règles entrantes

Perso j'héberge des serveurs web. J'ai donc fait pointer mes sous-domaine vers l'IP du VPS.
Il faut donc que j'ajoute en plus des règles pour forwarder le traffic web (en fonction de vos besoins) vers le VPS sur le port 80 et 443 vers mon firewall. (Mon firewall fait office de revers-proxy pour le hosting de mes serveurs).
Depuis le serveur j'ai edité le fichier /etc/iptables/rules.v4 et forward le port 443 et 80 vers mon firewall:

Code : Tout sélectionner

-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.0.1:443
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80
Dernière édition par Brelok le 18 déc. 2017, 14:31, édité 1 fois.

Bosquetia
Actif
Messages : 6783
Inscription : 10 mai 2016, 07:54

Re: Agregation WAN

Message par Bosquetia » 20 nov. 2017, 19:19

Merci pour ce partage, je passe le titre en tuto !

Verrouillé

Revenir vers « Tutoriels »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invités