---Deze post wordt progressief opgebouwd en kan daarom mogelijks nog niet volledig zijn---
Na veel zwoegen en zweten ben ik eindelijk een heel stuk verder geraakt.
Onderstaande is ter informatie voor iedereen die het wil gebruiken

In principe zouden onderstaande tutorials ook moeten bruikbaar zijn voor >2 internetverbindingen.
Load balancen van 2 PPPoe (ADSL) internet verbindingen
Belangrijke opmerking!!
Ikzelf maak gebruik van Debian 'Ech" 4.0
Echter zit er in één van deze recentere kernels een probleem wanneer er gebruik gemaakt wordt van multipath routing (load balancen over meerdere links dus).
Het was daarom nodig om de kernel te her-compileren met een optie (die ik niet uit het hoofd meer ken op no).
Zie ook
http://www.debian-administration.org/articles/377.
Inleiding
Wanneer er gebruik wordt gemaakt van 2 (ADSL PPPoe in mijn geval) internet verbindingen waarbij het wenselijk is dat er ge-load balanced wordt tussen de 2 verbindingen. Hoe de connecties precies verdeeld worden, zal vooral afhangen van de "destination": routes worden namelijk gecached, dus op termijn zullen altijd dezelfde routes gebruikt worden voor dezelfde destinations (bvb het ip adres van een webserver).
Het is echter mogelijk af en toe de routing tabel te "flushen", zodat de verdeling wat meer ad random loopt.
- Variabelen definiëren waar oa de naam van de providers en hun interfaces in komen te staan. De naam van de providers is belangrijk voor het opzetten van de verbinding (daartoe wordt het configuratiebestand /etc/ppp/peers/<naam_isp> gebruikt).
- Definiër enkele basis regels voor IPtables (bijvoorbeeld, default policy op drop, enkel voor lokale LAN interface alles open zetten)
- Zet de internet verbinding op (PPPoe sessie starten)
- Hou de ip adressen en gateways van beide verbindingen bij in variabelen (voor 2 internetverbindingen kom je dus uit bij 4 variabelen).
- Voeg nu een load balanced default gateway toe.
- Uitgebreide IPtables configuratie: instellen van masuerading, eventuele poorten die je wilt openzetten naar de firewall, port forwarding,...
In de praktijk
Hier ga ik concreet uitwerken wat in de punten hierboven kort uitgelegd werd.
- Variabelen instellen
code:
1
2
3
4
5
6
| # Definiëren van interfaces en providers
LAN="eth1"
WAN1_IF="ppp0"
WAN1_ISP="Skynet"
WAN2_IF="ppp1"
WAN2_ISP="Skynet2" |
Op dit moment heb ik nog maar één internet verbinding (in afwachting van een 2de ADSL abonnement die op een 2de telefoonlijn en dus ook via een 2de modem zal gebruikt worden). In mijn geval is het echter wèl mogelijk om 2 PPPoe sessie op te zetten naar dezelfde provider.
Merk op dat deze situatie geen prestatieverbetering opleverd: de beperking zit hem nog steeds in het ADSL lijnprofiel dat van toepassing is. Dit dient dus ook louter ter illustratie.
Tevens heeft het systeem dat als firewal/gateway wordt gebruikt slechts één interface. De modem staat in bridged modus en wordt op het gewone LAN netwerk aangesloten via een switch, evenals de firewall/gateway machine. - Basis regels voor IPtables
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Standaard policy instellen op drop voor ingaand, doorgaand en uitgaand verkeer
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# Alle verkeer via de loopback interface toelaten
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Alle verkeer via de LAN interface toelaten
iptables -A INPUT -i $LAN -j ACCEPT
iptables -A OUTPUT -o $LAN -j ACCEPT
# Alle verkeer van/naar ongeldige connecties blokkeren
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP |
- Opzetten van PPPoe verbindingen
code:
1
2
3
4
5
6
7
| # Verbindingen maken
pon $WAN1_ISP
echo "Verbinding maken met \"$WAN1_ISP\"..."
sleep 5 # 5 seconden wachten totdat 2de verbinding wordt opgezet
pon $WAN2_ISP
echo "Verbinding maken met \"$WAN2_ISP\"..."
sleep 5 # 5 seconden wachten vooraleer verder te gaan |
De wachttijd tussen de 2 verbindingen is om ervoor te zorgen dat er geen 2 connecties tegelijkertijd of te snel op elkaar geopend worden. De 2de "sleep" is om zeker te zijn dat de connectie tot stand is gekomen vooraleer er verder wordt gegaan. - IP adressen en gateway adressen voor iedere verbinding in variabelen bijhouden en ter controlle laten echo'en:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # IP adressen WAN interfaces en gateway IP adressen ophalen
# WAN1
WAN1_IP=`ifconfig $WAN1_IF | grep inet | cut -f2 -d ":" | cut -f1 -d " "`
WAN1_GW=`route -n | grep UH | grep $WAN1_IF | cut -f1 -d " "`
# WAN2
WAN2_IP=`ifconfig $WAN2_IF | grep inet | cut -f2 -d ":" | cut -f1 -d " "`
WAN2_GW=`route -n | grep UH | grep $WAN2_IF | cut -f1 -d " "`
echo
echo "$WAN1_ISP ADSL:"
echo -e "\t WAN1_IP: $WAN1_IP"
echo -e "\t WAN1_GW: $WAN1_GW"
echo
echo "$WAN2_ISP ADSL:"
echo -e "\t WAN2_IP: $WAN2_IP"
echo -e "\t WAN2_GW: $WAN2_GW" |
- Een load balanced default route toevoegen
code:
1
2
3
4
| # Een default gateway toevoegen die aan load balancing doet
ip route add default equalize scope global \
nexthop via $WAN1_GW dev $WAN1_IF weight 1 \
nexthop via $WAN2_GW dev $WAN2_IF weight 1 |
De weight waarde bepaald welke verbinding er meer geprefereerd wordt dan de andere. Hier zijn deze gelijk. Hoe hoger de waarde, hoe lager de prioriteit. - Overige IPtables configuratie: NAT (masquerade) uitvoeren op de WAN interfaces, eventueel poorten openzetten, portforwarding instellen,... + extra zaken die moeten gebeuren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| # Activeer forwarding in de kernel:
echo "1" > /proc/sys/net/ipv4/ip_forward
# Enkel van toepassing op de WAN interfaces
# Accepteer alle inkomende verkeer als de connectie zelf geinitialiseerd werd
iptables -A INPUT -i $WAN1_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $WAN2_IF -m state --state ESTABLISHED,RELATED -j ACCEPT
# Uitgaand WAN verkeer onbeperkt toestaan
iptables -A OUTPUT -o $WAN1_IF -j ACCEPT
iptables -A OUTPUT -o $WAN2_IF -j ACCEPT
# Forwarding tussen interfaces toestaan
# 1ste wan interface
iptables -A FORWARD -i $WAN1_IF -o $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -o $WAN1_IF -j ACCEPT
# 2de wan interface
iptables -A FORWARD -i $WAN2_IF -o $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -o $WAN2_IF -j ACCEPT
# WAN1 en WAN2 interfaces masqueraden (NAT)
iptables -t nat -A POSTROUTING -o $WAN1_IF -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN2_IF -j MASQUERADE
# Verplicht gebruik maken van Squid proxy server
# iptables -t nat -A PREROUTING -i $LAN -p tcp -d 192.168.24.3 --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128
# Inkomende SSH connecties toelaten
iptables -A INPUT -i $WAN1_IF -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $WAN2_IF -p tcp --dport 22 -j ACCEPT
# Inkomende Bittorrent connecties forwarden naar debian-server
iptables -t nat -A PREROUTING -i $WAN1_IF -p tcp --dport 6881:6889 -j DNAT --to-destination 192.168.24.3:6881-6889
iptables -t nat -A PREROUTING -i $WAN2_IF -p tcp --dport 6881:6889 -j DNAT --to-destination 192.168.24.3:6881-6889
# IP adressen updaten bij DynDNS => Wordt ook om de minuut door cronjob uitgevoerd
# /root/updateDynDNS.sh |
Dit laatste stuk is vooral een persoonlijke voorkeur: in mijn geval zorg ik ervoor dat iedere client gebruik maakt van de Squid proxy server door alle verkeer naar poort 80 te redirecten naar de proxy server.
Ook is het mogelijk om enkele poorten open te zetten of te forwarden naar een andere machine in het netwerk.
Als laatste kan het ook handig zijn om hierin een script aan te roepen die uw DynDNS account update.
In mijn geval worden er in het aangeroepen script 2 updates doorgevoerd: 1 hostname per verbinding (wat dus neerkomt op 2 hostnames voor deze 2 verbindingen).
Op die manier zijn beide WAN interfaces makkelijk te benaderen vanaf het internet.
Load balancing uittesten
Ik weet niet of er een betere manier bestaat om te zien via welke verbinding uw verkeer gaat, maar ik heb in elk geval bij deze toch een eenvoudig voorbeeld.
Op het internet bestaan er genoeg diensten waarmee je uw eigen ip adres kan gebruiken:
http://dynamic.zoneedit.com/checkip.html
http://www.komar.org/cgi-bin/ip_to_country.pl
http://ipinfo.info/index.php
http://www.edpsciences.org/htbin/ipaddress
http://www.showmyip.com/
http://ip.kify.com/
http://www.showipaddress.com/
http://showip.net/
http://www.nirsoft.net/show_my_ip_address.php
http://www.mediacollege.com/internet/utilities/show-ip.shtml
http://www.bionixwallpaper.com/tools/ip.php
http://web.forret.com/tools/whatsmyip.asp
http://www.iopus.com/myip/
http://www.proxydetect.com/
http://www.whatismyipaddress.com/
http://www.ip-adress.com/
http://myipadress.info/
Wat ik doe: bookmarken in één folder in firefox en ze allemaal in afzonderlijke tabbladen openen. Dan zie je goed het effect van het load balancen.

Verkeer voorwaardelijk spreiden over 2 PPPoe (ADSL) internet verbindingen
Inleiding
In bepaalde gevallen is het wenselijk dat iedere internetverbinding zijn bestemming krijgt, enkele voorbeelden hiervan:
- pc a,b en c moeten van ISP x gebruikmaken, terwijl pc d en e langs ISP y gaan.
- Regulier HTTP en mailverkeer langs ISP x, grote downloads (Bittorrent, nieuwsgroepen,...) langs ISP y.
- Het bekijken van website a, b en c via ISP x en website d en e via ISP y. Dit is vooral nuttig voor pagina's die enkel maar bereikbaar zijn via een connectie via deze specifieke ISP (bijvoorbeeld HTTPS pagina voor de configuratie van de mailboxen van uw ISP).
- Uitaande (SMTP) mailserver a van provider x ook daadwerkelijk via provider x sturen, terwijl mailserver b van provider y via provider y sturen. Dit is dan weer vooral handig voor e-mail verkeer van de provider zelf: vaak zijn SMTP servers enkel toegankelijk vanaf een internetverbinding via deze ISP
- Web en mailservers via een SDSL verbinding laten gaan, reguliere internet verkeer voor de LAN via ADSL.
- ...
- Er zijn oneinding veel combinaties waarin bovenstaande voorbeelden gebruikt kunnen worden. Zo zou het mogelijk zijn om bepaalde pc's altijd via ISP x te sturen en andere via y, maar dat tegelijkertijd website a altijd via ISP x gaat en website b via ISP y, ongeacht vanop welke pc dit gebeurd (overriden van eerste regels).
In de praktijk
Stap 1 t.e.m. 4 blijven dezelfde zoals bij de situatie hierboven, dus:
- Variabelen definiëren waar oa de naam van de providers en hun interfaces in komen te staan. De naam van de providers is belangrijk voor het opzetten van de verbinding (daartoe wordt het configuratiebestand /etc/ppp/peers/<naam_isp> gebruikt).
- Definiër enkele basis regels voor IPtables (bijvoorbeeld, default policy op drop, enkel voor lokale LAN interface alles open zetten)
- Zet de internet verbinding op (PPPoe sessie starten)
- Hou de ip adressen en gateways van beide verbindingen bij in variabelen (voor 2 internetverbindingen kom je dus uit bij 4 variabelen).
- Custom routing tabellen definiëren + in iedere tabel een route voor die bepaalde ISP toevoegen.
- Routing rules aanmaken
- Uitgebreide IPtables configuratie: instellen van masuerading, eventuele poorten die je wilt openzetten naar de firewall, port forwarding,...
- IPtables vervolg: definiëren welk verkeer er via welke route loopt
De laatste stap blijft ook min of meer dezelfde. De stappen in het blauw aangeduid zijn verschillend. We werken hieronder enkel de gewijzigde stappen t.o.v. load balancing uit.
Custom routing tabellen definiëren + in iedere tabel een route voor die bepaalde ISP toevoegen.
In het bestand
/etc/iproute2/rt_tables moet er per ISP een custom routing tabel worden toegevoegd:
code:
1
2
| 1 WAN1_table
2 WAN2_table |
Vervolgens voor iedere ISP een default gateway in iedere tabel toevoegen + laten verifiëren bij het runnen van het script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| ip route add default via $WAN1_GW dev $WAN1_IF table WAN1_table
ip route add default via $WAN2_GW dev $WAN2_IF table WAN2_table
# Verifieren
WAN1_table=`ip route show table WAN1_table`
echo
echo "Routing tabel \"WAN1_table\":"
echo -e "\t $WAN1_table"
WAN2_table=`ip route show table WAN2_table`
echo
echo "Routing tabel \"WAN2_table\":"
echo -e "\t $WAN2_table" |
Routing rules aanmaken
code:
1
2
3
| # Routing rules op basis van iptables markeringen die later opgezet worden
ip rule add fwmark 1 table WAN1_table
ip rule add fwmark 2 table WAN2_table |
Er zijn meerdere mogelijkheden om rules toe te voegen. één ervan die ik prefereer, is door het markeren van paketten.
In deze situatie worden alle paketten die gemarkeerd worden met een "1" via WAN1_table gerouteerd terwijl alle paketten gemarkeerd met een "2" via WAN2_table lopen.
Het markeren van deze paketten gebeurd dan weer voorwaardelijk, en dat door IPTables wat hieronder wordt besproken.
Opmerking: Alle vormen van verkeer waarvoor geen regels gedefiniërd worden (zie verder) worden altijd langs de laatst toegevoegde gateway gerouteerd.
Concreet: alle verkeer die niet expliciet gemarkeerd wordt om via ISP x of y gerouteerd te worden, wordt langs ISP2 gestuurd (ip route add default via $WAN2_GW dev $WAN2_IF table WAN2_table).
Een goede manier van werken zou dus zijn: voor de standaard internetverbinding wordt als laatst een default gateway toegevoegd. Voor alle uitzonderingen hierop worden er voor de andere verbindingen regels aangemaakt.
Een andere manier is door dit louter af te handelen via "ip rule add".
...
ip rule - routing policy database management
Rules in the routing policy database control the route selection algo‐
rithm.
Classic routing algorithms used in the Internet make routing decisions
based only on the destination address of packets (and in theory, but
not in practice, on the TOS field).
In some circumstances we want to route packets differently depending
not only on destination addresses, but also on other packet fields:
source address, IP protocol, transport protocol ports or even packet
payload. This task is called ’policy routing’.
To solve this task, the conventional destination based routing table,
ordered according to the longest match rule, is replaced with a ’rout‐
ing policy database’ (or RPDB), which selects routes by executing some
set of rules.
...
IPtables vervolg: definiëren welk verkeer er via welke route loopt
Het stuk hieronder plaats ik in een afzonderlijk script voor betere onderhoudbaarheid (alles hierboven is min of meer statisch).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # ISP kiezen op basis van protocol, source en destination IP,...
# Eventueel bestaande rules in de mangle tabel verwijderen
iptables -t mangle -F
iptables -t mangle -X
# Verkeer voor ISP1
for line in `cat ISP1.txt` ; do
iptables -t mangle -A PREROUTING -d $line -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -d $line -j MARK --set-mark 1
done
# Verkeer voor ISP2
for line in `cat ISP2.txt` ; do
iptables -t mangle -A PREROUTING -d $line -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -d $line -j MARK --set-mark 2
done |
Hier is het mogelijk om 2 tekstbestanden te gebruiken: ISP1.txt en ISP2.txt.
In ieder bestand worden FQDN's (volledige URL, dus hostname + domain) geplaatst, één per regel.
Afhankelijk van wat je wilt laten routeren via welke ISP plaats je daar URL's in.
Bijvoorbeeld: de SMTP server van ISP1 plaats ik in ISP1.txt en de SMTP server van ISP2 plaats ik in ISP2.txt.
Op die manier ben ik er zeker van dat iedere SMTP server ook via die welbepaalde ISP loopt.
PREROUTING is van toepassing op alle gerouteerde verkeer (op de LAN), terwijl OUTPUT geldig is voor de lokale machine (de machine waarop de firewall/gateway dus op draait). Deze regels hoeven uiteraard niet per se dezelfde zijn.
Uiteraard, zoals in de voorbeelden reeds vernoemd kan men hier zover in gaan als men zelf wilt, enkele voorbeelden:
code:
1
| iptables -t mangle -A PREROUTING -s 192.168.24.7 -j MARK --set-mark 2 |
Alle verkeer van pc met het ip 192.168.24.7 via ISP 2 routeren.
code:
1
2
3
4
| iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 21 -j MARK --set-mark 2 |
Alle HTTP verkeer langs ISP1, FTP verkeer langs ISP2 (zowel op de firwall/gateway machine als alle andere pc's op het netwerk).
[
Voor 255% gewijzigd door
Tom_G op 17-07-2007 15:44
]