In English

Agrégation de lignes

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

Configuration du serveur

MPTCP

Il suffit d'utiliser apt, comme indiqué ici:

  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

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.

Firewall

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.

Configuration du routeur

Raspbian

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

MPTCP

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

Réseau

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

Shadowsocks


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.