Nie każdy w firmie czy domu ma możliwość zestawienia jednego, szybkiego i stabilnego połączenia z Internetem. Często dla bezpieczeństwa lub odciążenia części działających usług doprowadza się do abonenta kilka złączy, z różnych lub tych samych źródeł i odpowiednio steruje ruchem i przepustowością przez każde z nich. Dzisiaj przestawię jak połączyć kilka łączy w jedno, które będzie odporne na awarię jednego z nich, a w przypadku, gdy każde pojedyncze połączenie działa - przepustowość będzie sumowana. Rozwiązanie przydatne jest również w przypadku, gdy posiadamy stałe łącze oraz dostęp "mobilny" przez sieć 3G/LTE i nazywa się różnie: port-trunking, port-bonding, bonding, link-aggregation...
Starałem się, aby przedstawiona konfiguracja była elegancka, więc oparłem ją w całości o systemy typu Debian oraz wbudowane w nich mechanizmy konfiguracji. Bezproblemowo można jednak po staroświecku oskryptować sobie wszystko i uruchamiać przygotowany tak skrypt przy starcie systemu.
Zacznijmy od przygotowania serwera w naszym datacenter. Najpierw zainstalujmy sobie odpowiednie oprogramowanie apt-get install ifenslave vtun
, zmodyfikujmy w pliku /etc/network/interfaces odpowiednie interfejsy:
auto lo
iface lo inet loopback
# Pierwszy adres IP
auto eth0
iface eth0 inet static
address 10.20.30.2
netmask 255.255.255.248
network 10.20.30.0
broadcast 10.20.30.7
gateway 10.20.30.1
dns-nameservers 8.8.8.8 8.8.8.4
# Drugi adres IP
auto eth0:0
iface eth0:0 inet static
address 10.20.30.3
netmask 255.255.255.248
network 10.20.30.0
broadcast 10.20.30.7
# Trzeci adres IP
auto eth0:1
iface eth0:1 inet static
address 10.20.30.4
netmask 255.255.255.248
network 10.20.30.0
broadcast 10.20.30.7
## Dla większej ilości adresów, można odpowiednio dopisać dodatkowe sekcje
# Agregacja lacza:
auto bond0
iface bond0 inet static
address 192.168.204.1
netmask 255.255.255.252
bond-slaves tap11 tap12 tap13
bond_mode balance-rr
Teraz stwórzmy konfigurację tunelu. W tym poradniku skorzystamy z vtun, ale jeśli jest Ci wygodniej, możesz użyć openvpn czy nawet ssh. W pliku /etc/vtund.conf
powinny znaleźć się takie wpisy:
options {
port 5000;
ip /sbin/ip;
}
default {
compress no;
encrypt no;
keepalive yes;
proto tcp;
speed 0;
}
TRUNK11 {
passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
type ether;
device tap11;
up {
ip "link set up %% multicast off mtu 1420";
program "/sbin/ifenslave bond0 %%";
};
}
TRUNK12 {
passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
type ether;
device tap12;
up {
ip "link set up %% multicast off mtu 1420";
program "/sbin/ifenslave bond0 %%";
};
}
TRUNK13 {
passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
type ether;
device tap13;
up {
ip "link set up %% multicast off mtu 1420";
program "/sbin/ifenslave bond0 %%";
};
}
## Dla większej ilości tuneli, należy skopiować odpowiednio TRUNKXX, zmieniając niezbędne w środku parametry
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves
Ustawmy w pliku /etc/default/vtun zmienną RUN_SERVER=yes
, podnieśmy nowe interfejsy ifup bond0
(i jeżeli eth0:0 i eth0:1 zostały dodane, to również i je) oraz wystartujmy vtun: service vtun start
.
Pamiętać należy, ażeby dodać natowanie/maskaradę na interfejsie bond0, dla przykładu:
iptables -A FORWARD -i bond0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.204.2/32 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.204.2/32 ! -d 192.168.204.0/30 -o eth0 -j MASQUERADE
Przejdźmy do ustawień routera klienckiego. Tak samo jak w przypadku serwera, najpierw instalujemy niezbędne oprogramowanie: apt-get install vtun ifenslave
, konfigurujemy interfejs bond0 w /etc/network/interfaces, pamiętając o niezbędnych wpisach routingu (jeśli ich nie mielismy wcześniej):
auto lo
iface lo inet loopback
# Operator1
auto eth0
iface eth0 inet static
address 172.16.0.2
netmask 255.255.255.252
post-up ip route add 172.16.0.0/30 dev eth0 src 172.16.0.2 table link1
post-up ip route add default via 172.16.0.1 table link1
post-up ip rule add from 172.16.0.2 to all lookup link1
post-up ip rule add from all to 172.16.0.2 lookup link1
post-down ip route flush table link1
post-down ip rule del from 172.16.0.2 to all lookup link1
post-down ip rule del from all to 172.16.0.2 lookup link1
# Operator2
auto eth0:0
iface eth0:0 inet static
address 172.30.0.6
netmask 255.255.255.252
post-up ip route add 172.30.0.4/30 dev eth0 src 172.30.0.6 table link2
post-up ip route add default via 172.30.0.5 table link2
post-up ip rule add from 172.30.0.6 to all lookup link2
post-up ip rule add from all to 172.30.0.6 lookup link2
post-down ip route flush table link2
post-down ip rule del from 172.30.0.6 to all lookup link2
post-down ip rule del from all to 172.30.0.6 lookup link2
# Operator3
auto eth1
iface eth1 inet static
address 192.168.31.71
netmask 255.255.254.0
post-up ip route add 192.168.31.0/24 dev eth0 src 192.168.31.71 table link3
post-up ip route add default via 192.168.30.1 table link3
post-up ip rule add from 192.168.31.71 to all lookup link3
post-up ip rule add from all to 192.168.31.71 lookup link3
post-down ip route flush table link3
post-down ip rule del from 192.168.31.71 to all lookup link3
post-down ip rule del from all to 192.168.31.71 lookup link3
## Dla większej ilosci łącz można dodać więcej odpowiednich sekcji
# Agregacja łącza
auto bond0
iface bond0
address 192.168.204.2
netmask 255.255.255.252
gateway 192.168.204.1
dns-nameservers 8.8.8.8 8.8.4.4
bond-slaves tap11 tap12 tap13
bond_mode balance-rr
# Sieć lokalna
auto eth2
iface eth2 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
Następnie w pliku /etc/iproute2/rt_tables, dodajemy adekwatne wpisy (jeśli ich jeszcze nie mieliśmy):
11 link1
12 link2
13 link3
## można dodać więcej analogicznych wpisów, w przypadku chęci dodania większej ilości łącz
Uruchamiamy interfejsy: ifup bond0
(itd), a następnie edytujemy plik /etc/vtund.conf:
options {
port 5000;
ip /sbin/ip;
}
default {
compress no;
encrypt no;
stat yes;
speed 0;
}
TRUNK11 {
passwd supertajnepierwszehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
device tap11;
persist yes;
srcaddr {
iface eth0;
addr 172.16.0.2;
};
up {
ip "link set %% up multicast off mtu 1460";
program "/sbin/ifenslave bond0 %%";
};
}
TRUNK12 {
passwd supertajnedrugiehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
device tap12;
persist yes;
srcaddr {
iface eth0;
addr 172.30.0.6;
};
up {
ip "link set %% up multicast off mtu 1460";
program "/sbin/ifenslave bond0 %%";
};
}
TRUNK13 {
passwd supertajnetrzeciehaslodotuneluitrudnedozapamietaniazawierajacenajlepiejjedenznaknumeryczny;
device tap13;
persist yes;
srcaddr {
iface eth1;
addr 192.168.31.71;
};
up {
ip "link set %% up multicast off mtu 1460";
program "/sbin/ifenslave bond0 %%";
};
}
## Dla większej ilości tuneli, analogicznie dodać należy więcej sekcji TRUNKXX z odpowiednimi parametrami
## dodając również interfejs tap w /etc/network/interfaces: bond-slaves
W pliku /etc/default/vtun umieszczamy wpisy:
CLIENTO_NAME=TRUNK11
CLIENT0_HOST=10.20.30.2
CLIENT1_NAME=TRUNK12
CLIENT1_HOST=10.20.30.3
CLIENT2_NAME=TRUNK13
CLIENT2_HOST=10.20.30.4
## dla większej ilości analogicznie.
Odpalamy tunel: service vtun start
i jeżeli nasze trzy łącza klienckie są sprawne, maksymalna dostępna prędkość wyniesie 19mbps/19mbps. W przypadku awarii łącza od Operatora 1, prędkość spadnie do 9mbps/9mbps.
Należy pamiętać, że w przypadku awarii serwera w naszym datacenter nie będziemy mieli możliwości dostać się do Internetu.
Tekst trochę zagmatwany, a jakże! Starałem się nie pisać tekstu dla osób jedynie klikających myszką, choć pewnie mi trochę nie wyszło. Myślę jednak, że dla młodych administratorów, chcących coś zagregować tekst będzie świetnym punktem początkowym, a być może również i końcowym w poszukiwaniach ciekawych rozwiązań.
Publikowane komentarze są prywatnymi opiniami użytkowników witryny Michała Sternadela. Witryna Michała Sternadela nie ponosi odpowiedzialności za treść tych opinii.
|