Nejprve definujme proměnné:
$ cat /etc/balance/vars
- #!/bin/bash
- # LAN rozhraní
- IF0="eth1"
- # WAN rozhraní 1
- IF1="eth0"
- # WAN rozhraní 2
- IF2="ppp0"
- IP1="194.9.xx.xx"
- IP2="`ip addr show $IF2 | grep inet | awk '{print $2}'`"
- # brána 1
- P1="194.9.xx.xx"
- # brána 2
- P2="195.5.xx.xx"
- # LAN maska podsítě
- P0_NET="192.168.0.0/24"
- # WAN1 maska podsítě
- P1_NET="194.9.xx.xx/xx"
- # WAN2 maska podsítě
- P2_NET="195.5.xx.xx/xx"
- TBL1="provider1"
- TBL2="provider2"
- # Relativní váha šířky pásma kanálů
- W1="2"
- W2="1"
Přidejte do souboru /etc/iproute2/rt_tables dvě další tabulky směrování:
echo "1 provider1" >> /etc/iproute2/rt_tables
echo "2 provider2" >> /etc/iproute2/rt_tables
Nyní napíšeme skript, který nastaví všechny potřebné směrovací pravidla a pravidla firewallu:
cat /etc/balance/routing.sh
- #!/bin/bash
- . /etc/balance/vars
- echo "1" > /proc/sys/net/ipv4/ip_forward
- ip route add $P1_NET dev $IF1 src $IP1 table $TBL1 > /dev/null 2>&1
- ip route add default via $P1 table $TBL1 > /dev/null 2>&1
- ip route add $P2_NET dev $IF2 src $IP2 table $TBL2 > /dev/null 2>&1
- ip route add default via $P2 table $TBL2 > /dev/null 2>&1
- ip route add $P1_NET dev $IF1 src $IP1 > /dev/null 2>&1
- ip route add $P2_NET dev $IF2 src $IP2
- ip route add default via $P1 > /dev/null 2>&1
- ip rule add from $IP1 table $TBL1 > /dev/null 2>&1
- ip rule add from $IP2 table $TBL2 > /dev/null 2>&1
- ip route add $P0_NET dev $IF0 table $TBL1 > /dev/null 2>&1
- ip route add $P2_NET dev $IF2 table $TBL1 > /dev/null 2>&1
- ip route add 127.0.0.0/8 dev lo table $TBL1 > /dev/null 2>&1
- ip route add $P0_NET dev $IF0 table $TBL2 > /dev/null 2>&1
- ip route add $P1_NET dev $IF1 table $TBL2 > /dev/null 2>&1
- ip route add 127.0.0.0/8 dev lo table $TBL2 > /dev/null 2>&1
- iptables -t nat -F POSTROUTING
- iptables -t nat -A POSTROUTING -s $P0_NET -o $IF1 -j MASQUERADE
- iptables -t nat -A POSTROUTING -s $P0_NET -o $IF2 -j MASQUERADE
Tato sada příkazů zajišťuje směrování odpovědí přes rozhraní, na kterém byl požadavek přijat, a také maskarádu na obou rozhraních.
Nyní napíšeme skript, který bude zjišťovat, zda daný kanál funguje, a příslušně měnit záznamy výchozí brány.
$ cat /etc/balance/check.sh
- #!/bin/bash
- . /etc/balance/vars
- OLDIF1=0
- OLDIF2=0
- . /etc/balance/routing.sh
- while true; do
- ping -c 3 -s 100 $P1 -I $IF1 > /dev/null
- if [ $? -ne 0 ]; then
- echo "Failed IF1!"
- NEWIF1=0
- else
- NEWIF1=1
- fi
- ping -c 3 -s 100 $P2 -I $IF2 > /dev/null
- if [ $? -ne 0 ]; then
- echo "Failed IF2!"
- NEWIF2=0
- else
- NEWIF2=1
- fi
- if (( ($NEWIF1!=$OLDIF1) || ($NEWIF2!=$OLDIF2) )); then
- echo "Changing routes"
- if (( ($NEWIF1==1) && ($NEWIF2==1) )); then
- echo "Both channels"
- ip route delete default
- ip route add default scope global nexthop via $P1 dev $IF1 weight $W1 \
- nexthop via $P2 dev $IF2 weight $W2
- elif (( ($NEWIF1==1) && ($NEWIF2==0) )); then
- echo "First channel"
- ip route delete default
- ip route add default via $P1 dev $IF1
- elif (( ($NEWIF1==0) && ($NEWIF2==1) )); then
- echo "Second channel"
- ip route delete default
- ip route add default via $P2 dev $IF2
- fi
- else
- echo "Not changed"
- fi
- OLDIF1=$NEWIF1
- OLDIF2=$NEWIF2
- sleep 3
- done
Stav kanálu kontrolujeme pingováním brány; pokud nedojde k odpovědi na tři po sobě jdoucí pingy, považujeme kanál za nefunkční a příslušně jej vyloučíme z tabulky směrování.
Tím pádem, pokud fungují oba kanály:
$ ip route
195.5.xx.xx dev ppp0 proto kernel scope link src 95.133.xx.xx
194.9.xx.xx/xx dev eth0 proto kernel scope link src 194.9.xx.xx
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.75
default
nexthop via 194.9.xx.xx dev eth0 weight 2
nexthop via 195.5.xx.xx dev ppp0 weight 1
Máme celkem dvě výchozí brány (default gw), první s vahou 2 a druhá s vahou 1. To znamená, že přes první kanál půjde dvakrát více provozu než přes druhý.
Aby bylo možné tyto skripty přizpůsobit vašim potřebám, je nutné nastavit hodnoty v souboru vars; ostatní skripty téměř nevyžadují konfiguraci.
