Le but est d'agréger 2 lignes et d'avoir une IPv4/IPv6 fixe en sorti. Le fonctionnement est similaire à OverTheBox d'OVH.
Dans ce tutoriel on utilisera MultiPath TCP (MPTCP) ainsi que le proxy socks shadowsocks afin d'agréger deux lignes (par exemple une ligne ADSL et une ligne 4G).
Un serveur distant est nécessaire, un Kimsufi VPS SSD 1 sous Debian suffira, l'addition du débit des 2 lignes étant inférieur à 100Mb/s.
Un raspberry pi 3 est utilisé en tant que routeur. On considère qu'un modem/box a l'adresse 192.168.0.254 et qu'un autre posséde l'adresse 192.168.2.254, le raspberry ayant pour adresse 192.168.1.1
Ce guide est pour Debian Jessie
sudo apt-key adv --keyserver hkp://keys.gnupg.net --recv-keys 379CE192D401AB61
echo "deb https://dl.bintray.com/cpaasch/deb jessie main" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install linux-mptcp
Shadowsocks est un proxy socks supportant mptcp.
sudo sh -c 'printf "deb http://deb.debian.org/debian jessie-backports main\n" > /etc/apt/sources.list.d/jessie-backports.list'
sudo sh -c 'printf "deb http://deb.debian.org/debian jessie-backports-sloppy main" >> /etc/apt/sources.list.d/jessie-backports.list'
sudo apt update
sudo apt -t jessie-backports-sloppy install shadowsocks-libev
Il est très fortement recommandé de suivre la recommandation présente ici afin d'optimiser Shadowsocks.
Un exemple de /etc/sysctl.d/local.conf adapté :
# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
# for high-latency network
net.ipv4.tcp_congestion_control = iloa
Le fichier de configuration /etc/shadowsocks-libev/config.json doit ressembler à ceci :
{
"server":["[::0]", "0.0.0.0"],
"server_port":8388,
"local_port":1080,
"password":"votrepassword",
"timeout":600,
"method":"aes-256-cfb",
"verbose":2,
"prefer_ipv6": true
}
Pour le lancer manuellement :
ss-server -c /etc/shadowsocks-libev/config.json --mptcp -u --fast-open
Pour le lancer automatiquement, modifiez /etc/default/shadowsocks-libev et ajoutez -u --fast-open dans DAEMON_ARGS.
Il est plus que recommandé de mettre en place un firewall sur le serveur, mais ceci sort du cadre de ce tuto. Le port 8388 doit être ouvert en TCP et UDP vers les IPs des lignes aggrégées.
La première étape consiste à mettre raspbian sur une carte SD.
Téléchargez raspbian sur https://www.raspberrypi.org/downloads/raspbian/ puis copiez la sur la carte SD.
dd bs=4M if=2017-04-10-raspbian-jessie.img of=/dev/sdx
Pour activer SSH:
mount /dev/sdx1 /mnt
touch ssh /mnt/boot
Une fois le Raspberry démarré sur la carte sd, il faut mettre un noyau support mptcp
cd /usr/src
wget https://github.com/Ysurac/raspberry_kernel_mptcp/archive/4.4.50_mptcp0.92.tar.gz
tar xzvf 4.4.50_mptcp0.92.tar.gz
Configuration du noyau :
apt-get install libncurses5-dev
KERNEL=kernel7
make bcm2709_defconfig
make menuconfig
Vous ne devez pas avoir IPv6 en module, et vous devez ajouter OLIA TCP Congestion. Vérifiez également que TPROXY est en module.
Vous pouvez aussi utiliser ce .config.
Pour compiler le noyau :
make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/kernel7.img
Il est nécessaire de créer autant d'interfaces virtuelles que de lignes à aggréger.
Voici un example du fichier /etc/network/interfaces :
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
auto eth0:line1
iface eth0:line1 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.254
post-up /opt/mptcp/rules.sh
auto eth0:line2
iface eth0:line2 inet static
address 192.168.2.2
netmask 255.255.255.0
gateway 192.168.2.254
Le fichier /opt/mptcp/rules.sh contient ceci :
ip rule add from 192.168.0.2 table 1
ip rule add from 192.168.2.2 table 2
ip route add 192.168.0.0/24 dev eth0:line1 scope link table 1
ip route add default via 192.168.0.254 dev eth0:line1 table 1
ip route add 192.168.2.0/24 dev eth0:line2 scope link table 2
ip route add default via 192.168.2.254 dev eth0:line2 table 2
ip route add default scope global nexthop via 192.168.0.254 dev eth0:line1
ss-nat -s ipduserveur -l 1080 -u
#ss-nat6 -s ipv6duserveur -l 1080 -u
sudo apt-get install git ipset devscripts equivs
sudo sh -c 'printf "deb http://httpredir.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list'
sudo apt install libsodium-dev
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init --recursive
cd shadowsocks-libev
mk-build-deps --root-cmd sudo --install --tool "apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends -y –force-yes"
./autogen.sh && dpkg-buildpackage -b -us -uc
cd ..
sudo dpkg -i shadowsocks-libev*.deb
Il est très fortement recommandé de suivre la recommandation présente ici afin d'optimiser Shadowsocks.
Un exemple de /etc/sysctl.d/local.conf adapté :
# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096
# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1
# for high-latency network
net.ipv4.tcp_congestion_control = iloa
Le fichier de configuration /etc/shadowsocks-libev/config.json doit ressembler à ceci :
{
"server":"ipduserveur",
"server_port":8388,
"local":"::",
"local_port":1080,
"password":"votrepassword",
"timeout":600,
"method":"aes-256-cfb",
"verbose":2
}
Pour le lancer manuellement :
ss-redir -c /etc/shadowsocks-libev/config.json --mptcp -u --fast-open
Pour le lancer automatiquement, modifiez /etc/default/shadowsocks-libev et ajoutez -u --fast-open dans DAEMON_ARGS et modifiez /etc/init.d en remplaçant ss-server dans la ligne DAEMON par ss-redir.