Toon posts:

[linux] Load Balancer - uitval 1 verbinding

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste luitjes,
Ik heb een linux bak geconfigureerd voor het gebruik van twee adsl lijnen. Met iproute2 heb ik 3 verschillende routing tables gemaakt, default en 1 voor elke inet verbinding. Elke routing table heeft zijn eigen default route en de main table heeft een multipath default route.
In de iptables configuratie worden de pakketjes voorbereid op de multipath route. Hoe precies weet ik niet, voor de firewall heb ik hulp gehad. Als het van groot belang is kan ik het wel nagaan.

Alles werkt prima, totdat 1 verbinding uitvalt. Logischerwijs zou ik zeggen dat de andere verbinding het moet overnemen, maar dat gebeurt dus niet. Misschien ook wel logisch. Is er een eenvoudige methode om te zorgen dat de gebruiker weinig merkt zodra een verbinding uitvalt. De twee verbindingen draaien niet alleen voor extra snelheid maar ook de redundantie.

Of wordt het scripten met elke 10 minuten een ping test via een gateway en a.d.h. van de resultaten de routing tables evt. opnieuw definiëren?
thnx

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 09:54

Koffie

Koffiebierbrouwer

Braaimeneer

Hier is zeer weinig over te zeggen zonder inzicht te hebben in de betreffende scripts. Ik stel dus voor dat je die eens post en aangeeft waar het volgens jou misgaat.

En een move richting Non-Windows Operating Systems :)

Tijd voor een nieuwe sig..


Verwijderd

Topicstarter
Okee, thnx voor verhuizing :)
Ik zal mijn best doen op de betreffende scripts. Routing is geen probleem om te posten, maar daar gaat het wel fout denk ik.

De tabellen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@alpha root]# ip route show table main
192.168.100.0/24 dev eth2  scope link
192.168.2.0/24 dev eth0  scope link
192.168.1.0/24 dev eth1  scope link
169.254.0.0/16 dev eth2  scope link
127.0.0.0/8 dev lo  scope link

[root@alpha root]# ip route show table 201
default via 192.168.2.1 dev eth0  proto static  src 192.168.2.200
prohibit default  proto static  metric 1

[root@alpha root]# ip route show table 202
default via 192.168.1.1 dev eth1  proto static  src 192.168.1.200
prohibit default  proto static  metric 1

[root@alpha root]# ip route show table 222
default  proto static
        nexthop via 192.168.2.1  dev eth0 weight 1
        nexthop via 192.168.1.1  dev eth1 weight 1

Dan de ip rules
code:
1
2
3
4
5
6
7
8
[root@alpha root]# ip rule show
0:      from all lookup local
50:     from all lookup main
201:    from 192.168.2.0/24 lookup 201
202:    from 192.168.1.0/24 lookup 202
222:    from all lookup 222
32766:  from all lookup main
32767:  from all lookup 253

Wat ik weet over de firewall is dat het niet met een -J MARK --set-mark 1 o.i.d. wordt gedaan, maar met POSTROUTING en -J MASQUERADE
Of sla ik de plang nu helemaal mis?
Ik gebruik een script van iemand anders en diegene heeft voor mij een kleine modificatie in het script gedaan voor masquerading over 2 interfaces.
Het script is simpelweg te groot, ik heb het hier vandaan: http://rocky.molphys.leidenuniv.nl/
Arno heeft die aanpassingen gedaan. Het enige dat ik kan doen is het werkende firewall script ter download aanbieden: www.middelhoek.nl/linux/firewallscript.tgz
Configfile is default, dus nog niet aan mijn situatie aangepast, uit veiligheid.

Ik hoop dat jullie met deze info meer kunnen. Het is mij een raadsel hoe ik dit moet aanpakken.

Toch nog ff iets toevoegen, volgens mij heb ik het stukje code in het script gevonden waarmee de masquerading over de meerdere interfaces wordt geregeld:
code:
1
2
3
4
5
6
7
8
9
10
11
echo "Enabling masquerading(NAT) for (internal) subnet(s) $NAT_INTERNAL_NET."
        for net in $NAT_INTERNAL_NET; do
          if [ "$MASQ_MULTI_ROUTE" != "1" ]; then
            # the "-d ! $net" is to avoid problems with Freeswan
            $IPTABLES -t nat -A POSTROUTING -o $INET_IF -s $net -d ! $net -j MASQUERADE
          else
            # Rule doesn't contain a -o $INET_IF which should allow you to load balance over multiple
            # external (internet) interfaces (multi route)
            $IPTABLES -t nat -A POSTROUTING -s $net -d ! $net -j MASQUERADE
          fi
        done

Hier moet de specialist toch mee uit de voeten kunne? :D Zo niet, vraag maar raak, ik doe mijn best de info te geven die nodig is, ik wil graag tot een oplossing komen.

Nog wat wijzigen, nog een stukje code gevonden, bij nader inzien misschien meer van belang dan het voorgaande:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
for eif in $EXT_IF; do
            $IPTABLES -t nat -A PREROUTING -i $eif -s $shost -p udp --dport $sport -j DNAT --to-destination $dhost_dport

            if [ `echo "$dhost_dport" | grep ':' ` ]; then
              # This code makes it possible to forward to a different port on the internal host
              dport=`echo "$dhost_dport" |awk -F: '{ print $2 }' |awk -F- '{ print $1":"$2 }'`
            else
              # Forward the default way. This means that the port on the firewall is the same is the one on the internal host
              dport=$sport
            fi

            $IPTABLES -A FORWARD -i $eif -o ! $eif -s $shost -p udp --dport $dport -j ACCEPT
          done

[ Voor 34% gewijzigd door Verwijderd op 31-05-2004 11:54 ]


Verwijderd


  • Arnout
  • Registratie: December 2000
  • Laatst online: 17-02 21:41
Ik denk dat je het beste elke minuut oid moet testen of de 2 links nog goed werken.

Werkt er 1 niet meer goed: multipath opnieuw initialiseren met 1 path en die naar de nog werkende verbinding laten wijzen.

Uit de lartc.org manual:

code:
1
2
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
        nexthop via $P2 dev $IF2 weight 1


Bovenstaande zul je dan even tot een scriptje moeten ombouwen.

Verwijderd

Topicstarter
MetHod schreef op 31 mei 2004 @ 12:21:
Ik denk dat je het beste elke minuut oid moet testen of de 2 links nog goed werken.

Werkt er 1 niet meer goed: multipath opnieuw initialiseren met 1 path en die naar de nog werkende verbinding laten wijzen.

Uit de lartc.org manual:

code:
1
2
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
        nexthop via $P2 dev $IF2 weight 1


Bovenstaande zul je dan even tot een scriptje moeten ombouwen.
Okee, dat is een goeie, maar daar ben ik mee bezig geweest. Hierbij kom ik dan uit op een aantal vragen:
1. Hoe test je GOED of 1 verbinding niet meer werkt?
2. Multipath opnieuw instellen zeg je, maar welke is dat dan, enkel de table 222? Of iets in de main table, maar die bevat nu géén default route
3. Mogen de ip rules blijven staan? Lijkt me niet, maar hoe verwijder je zo'n ding?
4. Bij het opnieuw instellen van de routing tabel, krijg je dan geen problemen met de firewall?

Kortom wat moet er in de routing tabel en ip rules gebeuren om via de werkende link, als die al is gedetecteerd, naar buiten te gaan?

Nou, dat was het wel weer even, bedankt voor je reactie iig.

  • Arnout
  • Registratie: December 2000
  • Laatst online: 17-02 21:41
Verwijderd schreef op 31 mei 2004 @ 12:54:
[...]

Okee, dat is een goeie, maar daar ben ik mee bezig geweest. Hierbij kom ik dan uit op een aantal vragen:
Ik kan je niet tot op detail helpen omdat ik zelf geen ervaring mee heb, ik maak zelf gebruik van traffic shaping van LARTC.
1. Hoe test je GOED of 1 verbinding niet meer werkt?
Je zou bijvoorbeeld de default gateway van die verbinding kunnen pingen. Elke 20 sec. Bij 3x ping (60sec dus) geen reactie dan mag je ervan uitgaan dat de link down is. Zo werkt LCP ook (ppp).
2. Multipath opnieuw instellen zeg je, maar welke is dat dan, enkel de table 222? Of iets in de main table, maar die bevat nu géén default route
In mijn vorige reactie post ik het stukje die de multipath initialiseert. Misschien dat je op dezelfde manier ook de multipath kunt wissen of aanpassen. Maar dat is een kwestie van uitzoeken, daarvoor zitten we hier ook op GoT. :)
3. Mogen de ip rules blijven staan? Lijkt me niet, maar hoe verwijder je zo'n ding?
Zover ik de LARTC manual begrijp kunnen de ip rules blijven staan.
4. Bij het opnieuw instellen van de routing tabel, krijg je dan geen problemen met de firewall?
Ik gebruik zelf traffic shaping en als ik daar aanpassingen aan doe dan moet de firewall altijd opnieuw geinitialiseerd worden. Maar dit lijkt me geen probleem.
Kortom wat moet er in de routing tabel en ip rules gebeuren om via de werkende link, als die al is gedetecteerd, naar buiten te gaan?

Nou, dat was het wel weer even, bedankt voor je reactie iig.
:)

Verwijderd

Topicstarter
Het kost wat moeite, maar met eens een blik (of bevestiging) van iemand anders lukt het me meestal wel. Nu dan een script gefabriekt dat elke x seconden controleert of de verbinding actief is, zo niet wordt de routing tabel opnieuw ingesteld en de firewall opnieuw geïnitialiseerd. Na hetzelfde x seconden wordt de routing tabel gecontroleerd of het een multi route bevat, zo niet wordt deze wederom opgebouwd en begint het script weer van voor af aan. Controleren en evt. de routing opnieuw instellen, etc.
Ik zal het script hieronder posten, het is best groot geworden, en hoogstwaarschijnlijk kennen jullie betere methoden. Ik heb voor mij de eenvoudigst te bedenken oplossing gekozen. Daarbij komt de tijdnood. Wie een opmerking heeft, laat maar komen :)
Komt ie:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# Auteur:       Hans Middelhoek
# Doel:         Bij 2 internetverbindingen testen op uitval en opnieuw instellen routing en firewall
# Configfile:   /etc/routing.conf moet worden aangepast naar de eigen situatie

source /etc/routing.conf

DEFAULT_EXIST=`ip route show table 222 | grep "nexthop" | wc -l`
if [ $DEFAULT_EXIST -lt 2 ]
then
        echo "Geen multi route, setting..." >> $LOGFILE

        ip rule del prio 50 table main
        ip rule add prio 50 table main
        ip route del default table main

        ip rule del prio 222 table 222
        ip rule add prio 222 table 222
        ip route replace default table 222 proto static nexthop via $EXGW1 dev $EXIF1 weight $EXWEIGHT1 nexthop via $EXGW2 dev $EXIF2 weight $EXWEIGHT2

        # interface 1
        ip rule del prio $TABLE1 from $EXNET1/$EXMASK1 table $TABLE1
        ip rule add prio $TABLE1 from $EXNET1/$EXMASK1 table $TABLE1
        ip route replace default via $EXGW1 dev $EXIF1 src $EXIP1 proto static table $TABLE1

        # interface 2
        ip rule del prio $TABLE2 from $EXNET2/$EXMASK2 table $TABLE2
        ip rule add prio $TABLE2 from $EXNET2/$EXMASK2 table $TABLE2
        ip route replace default via $EXGW2 dev $EXIF2 src $EXIP2 proto static table $TABLE2

        echo "ATTENTIE: Multi route: opnieuw ingesteld" >> $LOGFILE
        echo "Firewall initialiseren..." >> $LOGFILE
        /usr/sbin/firewall "$EXIF1 $EXIF2" > /dev/null
fi

for i in $EXIF1 $EXIF2
do
        if [ "$i" = "$EXIF1" ]
        then
                VAR=`ping -q -s 5 -c 2 -w 2 -I $i $PING_HOST1 | awk -F"," '{ print $2 }'`
                VAR2=`echo $VAR | awk -F" " '{ print $1 }'`
                if [ "$VAR2" -ge 1 ]
                then
                        echo "Verbinding op interface $i ACTIEF!" > /dev/null
                else
                        echo "ATTENTIE: Verbinding op interface $i MISLUKT!" >> $LOGFILE
                        ALTERNATIEF=1
                        FAILED_EXNET=$EXNET1
                        FAILED_EXMASK=$EXMASK1
                        FAILED_TABLE=$TABLE1
                        EXGW=$EXGW2
                        EXIF=$EXIF2
                        break
                fi
        elif [ "$i" = "$EXIF2" ]
        then
                VAR=`ping -q -s 5 -c 2 -w 2 -I $i $PING_HOST2 | awk -F"," '{ print $2 }'`
                VAR2=`echo $VAR | awk -F" " '{ print $1 }'`
                if [ "$VAR2" -ge 1 ]
                then
                        echo "Verbinding op interface $i ACTIEF!" > /dev/null
                else
                        echo "ATTENTIE: Verbinding op interface $i MISLUKT!" >> $LOGFILE
                        ALTERNATIEF=1
                        FAILED_EXNET=$EXNET2
                        FAILED_EXMASK=$EXMASK2
                        FAILED_TABLE=$TABLE2
                        EXGW=$EXGW1
                        EXIF=$EXIF1
                        break
                fi
        fi                         
done

if [ "$ALTERNATIEF" = 1 ]
then
        echo "Failed: $FAILED_EXNET/$FAILED_EXMASK table: $FAILED_TABLE"
        echo "Active: $EXGW dev: $EXIF"
        ip rule del from $FAILED_EXNET/$FAILED_EXMASK > /dev/null
        ip route del table $FAILED_TABLE > /dev/null
        ip route replace default via $EXGW dev $EXIF proto static table 222 > /dev/null
        echo "Alternatieve route ingesteld: int: $EXIF  via: $EXGW" #>> $LOGFILE
        echo "Firewall initialiseren..." #>> $LOGFILE
        /usr/sbin/firewall "$EXIF" > /dev/null
        ALTERNATIEF=0
fi

sleep $COUNTER
exec $0

De inhoud van /etc/routing.conf
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Config script voor: /usr/sbin/routing
# Onderstaande Variabelen aanpassen!

LOGFILE="/var/log/routing"      #Logfile voor meldingen uit dit script m.b.t. routing
COUNTER=120             #Om de hoeveel tijd runt dit script (in seconden)
EXNET1=192.168.2.0      #External network 1
EXNET2=192.168.1.0      #External network 2
EXMASK1=24              #Network mask 1 - 255.255.255.0 = 24
EXMASK2=24              #Network masl 2
EXGW1=192.168.2.1       #Gateway of network 1
EXGW2=192.168.1.1     #Gateway of network 2
EXIF1=eth0              #Interface connected to network 1
EXIF2=eth1              #Interface connected to network 2
EXIP1=192.168.2.200     #IP address of network 1
EXIP2=192.168.1.200     #IP address of network 2
EXWEIGHT1=1             #Route weight - External network appreciated above another? 4096 against 2048 down is 2 against 1
EXWEIGHT2=1             #Route weight of network 2
TABLE1=201              #First routing table
TABLE2=202              #Second routing table
PING_HOST1="194.109.4.44"        #DNS XS4ALL, beste aanpassen aan eerste router van provider
PING_HOST2="194.109.6.66"        #DNS SX4ALL, beste aanpassen aan eerste router van tweede provider

firewall script wordt geladen met een extra parameten om te zorgen dat de nat over de juiste interface wordt geregeld door iptables.

Ik hoop dat iemand hier iets aan heeft.
Mocht één der moderators van mening zijn dat dit script hier beter niet kan staan, of vervuiling, of wat dan ook, wees zo vrij het te verwijderen. Ik heb de vraag gesteld opgelost en wilde dat met jullie delen, lijkt me eerlijk toch?
Groetjes
Pagina: 1