loadbalacing über 2 Uplinks

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

loadbalacing über 2 Uplinks

Beitrag von frankw » 27.01.2019 10:19:15

Hallo,

nachdem ich meine ppp-route in eine separate routing-Tabelle gepackt habe (die andere RT enthält eine statische route als default), würde ich gerne zwischen diesen beiden routingtabellen eine Art load-balancing definieren.

die eine routing-Tabelle (telekom) stellt ca. 1/3 der Gesamtbandbreite zur Verfügung. Bambit die anderen 2/3

nach einigem googlen würde ich es etwa so realisieren:

Code: Alles auswählen

ip route add default scope global \
                     nexthop via $telekom-gateway dev $telekom-iface weight 1 \
                     nexthop via $bambit-gateway dev $bambit-iface weight 2
wäre das soweit richtig? und wäre das ausreichend, oder muss ich in den IPtables noch irgendwas markieren (habe da einige Beispiele gefunden) oder spezielle rules (die aber dann wieder recht statisch wären), diese würden aber auch die angelegten Tabellen nutzen...das Beispiel oben würde das nicht...ich habe aber keins gefunden, welches sich auf die Tabellen bezieht

hier gibt es z.b. Probleme (Beitrag ist aber auch schon sehr alt):
https://unix.stackexchange.com/question ... l-handling

Benutzeravatar
unitra
Beiträge: 372
Registriert: 15.06.2002 21:09:38
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Kölle

Re: loadbalacing über 2 Uplinks

Beitrag von unitra » 28.01.2019 00:33:31

Vermutlich ist auch da auch NAT im Spiel, auch wenn es nicht explizit erwähnt worden ist.. Wie stellt man sicher daß IP Packete die zu einer bereits bestehenden TCP Session dazu gehören, über das "richtige" Gateway rauskommen?
Von der Backbone Seite ist das einfach, es sind unterschiedliche IP Adressen, pro PPP Session. Aber von der Kundenseite aus, also von deiner Seite aus gesehen, ist das nicht so einfach. Bei UDP ist das egal, aber bei TCP?, Vor allem wenn NAT im Spiel ist. Es gibt keine Ende zu Ende Konnektivität, die wird durch das NAT gebrochen.

Vielleicht liege ich falsch, aber die bereits aufgebaute, beispielhafte TCP Session, wird dann von über 2 unterschiedliche IP Adressen aufgebaut, wenn ein load-sharing mit NAT dazwischen ist. Es wäre kein Problem wenn deine beiden Router (PPPoE Sessions) ein gemeinsames öfffentliches IP Netz ins backbone propagieren würden.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 28.01.2019 08:44:42

NAT ist im Spiel ja,und nat muss sich ja auch merken,welcher rausgehende port zu welcher ip+innerem port gehört damit die Antwort richtig zugeordnet werden kann. Ich dachte für das Loadbalancing gibt es einen ähnlichen Ablauf. Also dass der Kernel schaut,ob er die session schon kennt (source/destination+port) und den entsprechenden uplink nimmt. Er muss sich ja "nur" aktive sessions merken...die abgebauten fliegen wieder raus.

Aus backbone-sicht zählt nur destination/source...

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 06.03.2019 15:59:47

hallo,

habe hier etwas gefunden, was evtl. funktionieren kann:

https://serverfault.com/a/584764

hier wird mittels CONNMARK eine Markierung gesetzt (per zufall), die den Uplink bestimmt

Code: Alles auswählen

iptables -t mangle -A OUTPUT -j MARK --set-mark 10
iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 11
iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 12
iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 13
ein ähnliches Beispiel, aber auch ohne markirung nach Interface (wichtig für ankommenden Traffic) soweit ich das sehe: https://home.regit.org/netfilter-en/lin ... balancing/

ich habe aktuell schon CONNMARK laufen, um den ankommenden Traffic zu markieren, damit die Antwort darauf den gleichen uplink nimmt

Code: Alles auswählen

wan1=ppp0
wan2=ppp8

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -i $wan1 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i $wan2 -j MARK --set-mark 2
iptables -A PREROUTING -t mangle -j CONNMARK --save-mark

ip rule add fwmark 1 table telekom
ip rule add fwmark 2 table bambit
da ich nur 2 Uplinks habe, müsste ich vermutlich vor dem --save-mark die folgenden 2 Zeilen einfügen:

Code: Alles auswählen

iptables -t mangle -A OUTPUT -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.5 -j MARK --set-mark 2
es darf jedoch eine vorhandene Markierung nicht überschrieben werden, das machen die 2 Zeilen aber scheinbar...also zuerst mark=1 und dann mit einer Wahrscheinlichkeit von 50% wird die 1 durch 2 ersetzt...

wie kann ich den block nur ausführen, wenn das Mark noch nicht gesetzt wurde (Traffic kommt von innen)?

wanne
Moderator
Beiträge: 5941
Registriert: 24.05.2010 12:39:42

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 06.03.2019 20:25:58

Wenn du NAT machst, kannst du vor den Mark-regeln ein --state ESTABLISHED setzen und dann dafür sorgen, das dein NAT das danach richtig regelt.
Üblicher ist es halt die Source IP und SNAT zu routern. Wichtig ist, dass du trotzdem noch dafür sorgen musst, dass je nach src-IP die richtige Routingentscheidung getroffen wird. (Normalerweise routest du immer nur nach destination.)
Die Lehrbuchwariante (und IMHO auch die beste) macht das so, dass man halt sagt dass man Verbinudngen die von gleicher ip/port kombinationen kommen gleich routet: Dann musst du dir gar keine Verbindungen merken.

Code: Alles auswählen

iptables -t mangle -A PREROUTING -j HMARK --hmark-offset 10 --hmark-tuple sport --hmark-mod 3 --hmark-rnd 0xdeb1a4f0 
Danach routest du für 10 und 11 über das schnelle Inerface und für 12 über das langsame.

Siehe auch: https://fossies.org/linux/iptables/exte ... _HMARK.man
rot: Moderator wanne spricht, default: User wanne spricht.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 07.03.2019 08:22:58

So ganz verstehe ich das Konzept nicht, aber dein established -Ansatz hat mich auf diese idee gebracht:

ich könnte doch bei den 2 neuen regeln das mit reinnehmen:

Code: Alles auswählen

−m conntrack −−ctstate NEW 
also nur neue verbindungen mit dem zufallsmark versehen. Die verbindungen von außen (bzw.die erste Antwort von innen) sind im ersten step zwar noch nicht established (3way handshake) aber afair nicht mehr new

mhm, scheint nicht zu funktionieren, aber ich habe auf der zweiten Seite noch was gefunden:

Code: Alles auswählen

iptables -N MARKING
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m mark  --mark 0x0 -j MARKING
 
iptables -A MARKING -t mangle ...
wenn ich das richtig lese, wird alles ohne Markierung in eine neue Chain "verschoben" und dann darin die Markierung ermittelt...somit tastet es die bisherigen marks nicht an...habe leider das statistic-modul noch nicht im kernel und will jetzt ungern neustarten.

habe das jetzt mal so probiert:

Code: Alles auswählen

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
#iptables -A PREROUTING -t mangle --match mark --mark 1 -j ACCEPT
iptables -A PREROUTING -t mangle -i $wan1 -j MARK --set-mark 1
#iptables -A PREROUTING -t mangle --match mark --mark 2 -j ACCEPT
iptables -A PREROUTING -t mangle -i $wan2 -j MARK --set-mark 2

iptables -t mangle -N MARKING
iptables -A PREROUTING -t mangle -m mark  --mark 0x0 -j MARKING #without mark move to new chain

#currently statistic is missing
iptables -t mangle -A MARKING -j MARK --set-mark 3
#iptables -t mangle -A MARKING -m statistic --mode random --probability 0.5 -j MARK --set-mark 2

iptables -A PREROUTING -t mangle -j CONNMARK --save-mark
somit wird jedes Packet, was noch keine Markierung hat mit 3 markiert und auf dem zugeordneten uplink rausgeschickt...klappt soweit...die anderen beiden Markierungen bleiben erhalten

jetzt muss ich nur noch das fail_over (wenn ein Uplink ausfält) und das richtige load-balancing umsetzen...
habe nur aktuell noch keine Idee, wie ich das fail_over mit der statistic verbinden kann...bzw. wie LINK[12]_UP definiert ist....condition scheint es im kernel 4.14 und 4.19 auch nicht zu geben...

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 10.03.2019 00:11:07

ich habe das loadbalancing jetzt (mit 2 zusätzlichen marks wegen der prio) umgesetzt und habe mir in Anlehnung an dieses Script ein eigenes gebaut:

http://blog.sfsoft.it/2016/01/19/config ... oppia-wan/

prinzipiell macht es via "ping -I $IF $IP -c 1" eine Prüfung, ob der jeweilige uplink funktioniert (mit 2 Ziel-IPs), dann wird sich der Status gemerkt und wenn beide uplinks funktionieren wird das loadbalacing entsprechend geroutet...sollte einer ausfallen werden die Pakete mit dem jeweiligen Mark auf den anderen Uplink geroutet. Im Gegensatz zu dem verlinkten Script, ändere ich die rules nur, wenn sich was ändert und das Ganze läuft in einer Schleife (mit 15s-sleep am Ende)

bin noch am testen, ob es sauber funktioniert, falls dem so ist, kann ich gerne den code hier posten

btw. nachdem ich mich in snat bisschen eingelesen habe, kann ich es wohl nicht nutzen, da ich keine feste öffentliche IP habe...es sind 2 dynamisch vergebene ;)

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 11.03.2019 18:08:26

so wie es aussieht, wird der Ausfall erkannt und die Marks angepasst (habe telekom jetzt deaktiviert...)

Code: Alles auswählen

^C[17:56] frank@bpi-r2-e:~$ ip rule show
0:	from all lookup local 
8:	from 192.168.0.8 lookup bambit-voip 
10:	from all to 217.79.184.12 lookup bambit 
11:	from all to 8.23.224.120 lookup telekom 
100:	from all fwmark 0x1 lookup bambit 
101:	from all fwmark 0x2 lookup telekom 
500:	from 192.168.10.26 lookup bambit 
501:	from 192.168.0.80 lookup bambit 
10000:	from all fwmark 0x3 lookup bambit 
10001:	from all fwmark 0x4 lookup bambit 
32766:	from all lookup main 
32767:	from all lookup default
jedoch scheinen nicht alle Pakete umgeroutete zu werden

mark 1&2 werden eigentlich nur von außen gesetzt und #11 ist für dyndns

ich vermute, dass es Probleme mit DNS gibt, da die Namensauflösung schon nicht funktioniert

Code: Alles auswählen

ping www.gmx.de
ping: www.gmx.de: Temporärer Fehler bei der Namensauflösung

Code: Alles auswählen

Mar 11 18:04:06 bpi-r2-e kernel: [254359.924645] fwmark 3: IN=lan0 OUT= MAC=08:00:00:00:00:00:50:46:5d:38:5c:96:08:00 SRC=192.168.0.21 DST=192.168.0.10 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=61181 DF PROTO=UDP SPT=47881 DPT=53 LEN=51 MARK=0x3 
Mar 11 18:04:06 bpi-r2-e kernel: [254359.928129] fwmark 4: IN=lan0 OUT= MAC=08:00:00:00:00:00:50:46:5d:38:5c:96:08:00 SRC=192.168.0.21 DST=192.168.0.10 LEN=71 TOS=0x00 PREC=0x00 TTL=64 ID=61185 DF PROTO=UDP SPT=50739 DPT=53 LEN=51 MARK=0x4
das mark passt,aber out ist leer weil DST ist mein router...es sind aber scheinbar nur DNS-Anfragen an meinen Router...eine weitere Anfrage wird scheinbar nicht markiert...ich habe einen lokalen dnsmasq als dns-server

aktuell sehen meine Regeln so aus:

Code: Alles auswählen

wan1=ppp8
wan2=ppp0

iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
#iptables -A PREROUTING -t mangle --match mark --mark 1 -j ACCEPT
iptables -A PREROUTING -t mangle -i $wan1 -j MARK --set-mark 1
#iptables -A PREROUTING -t mangle --match mark --mark 2 -j ACCEPT
iptables -A PREROUTING -t mangle -i $wan2 -j MARK --set-mark 2
#set -x
#try load-balancing
iptables -t mangle -N MARKING
iptables -A PREROUTING -t mangle -m mark  --mark 0x0 -j MARKING #without mark move to new chain

iptables -t mangle -A MARKING -j MARK --set-mark 3 #bambit
iptables -t mangle -A MARKING -m statistic --mode random --probability 0.3 -j MARK --set-mark 4 #telekom
iptables -t mangle -A MARKING -m mark --mark 3 -j LOG --log-prefix "fwmark 3: "
iptables -t mangle -A MARKING -m mark --mark 4 -j LOG --log-prefix "fwmark 4: "
#set +x
iptables -A PREROUTING -t mangle -j CONNMARK --save-mark
fehlt noch irgendeine Ausgabe?

ping auf ip geht auch nicht von lokal...scheinbar werden lokale pakete nicht markiert und damit über die default-route der main-tabelle (in meinem Fall telekom) rausgeschickt, was nicht geht. Wie kann ich lokale Pakete markieren? Die sollten doch auch via masquerading markiert werden...aber ich vermute,dass dies zu spät passiert (meine regeln sind ja prerouting und bei lokal wird nicht geroutet).

ich habe gelesen, dass man die marking-rule auf die OUTPUT-Chain anwenden soll und nicht auf PREROUTING um das Problem zu umgehen, hat aber bei mir nicht funktioniert (dann geht trotz funktionierendem Uplink kein ping mehr von lokal), auch wenn ich eine pseudo-default-route in die main-table reinnehme (und die andere davor lösche) und komplett auf der nat-table statt mangle arbeite. Bei letzterem funktioniert das load-balancing scheinbar nicht mehr...ich gehe dann immer auf der default-route raus.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 18.03.2019 17:11:38

Niemand eine idee?

wanne
Moderator
Beiträge: 5941
Registriert: 24.05.2010 12:39:42

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 18.03.2019 18:53:36

Ich würde mal die Variante von mir verscuehn. Das ist halt ein Einzieler statt deinen 10. Das ist deutlich weniger Fehleranfällig.
Daneben kannst du mal mit traceroute versuchen, wo was schief geht.
rot: Moderator wanne spricht, default: User wanne spricht.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 18.03.2019 18:57:50

Das problem ist,dass lokaler traffic nicht über die prerouting-chain geht. Traffic, der durchgeht, funktioniert problemlos. Mit traceroute komme ich nicht weiter...ich müsste sehen,mit welchem maek es zu welchem interface raus rausgeht

Wenn ich die output-chain nehme,habe ich andere phämonene...ich vermute dass folgendes passiert:

- interne packete werden richtung default-route geroutet (da nicht markiert)
- nat greift und ersetzt die interne ip durch die öffentliche ip des interfaces der default-route
- evtl findet ein tagging statt...sehe es aber nicht in der log
-packet geht evtl. Zum anderen interface raus,aber mit der alten ip-adresse,somit greift das reverse-path-filtering des isp

wanne
Moderator
Beiträge: 5941
Registriert: 24.05.2010 12:39:42

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 18.03.2019 19:28:29

Wenn durchgehende Traffic wirklich raus geht: Das ist immer ein bisschen das Problem mit Linux, der nimmt interfaces wie es ihm passt.
Du kannst an dein NAT entweder dein Interface (als -o) dranhängen oder halt explizit nur eine route setzen. Vor allem: nach ppp8 und ppp0 willst du unterschiedliche Subnetze haben.
Linux-Routing kommt per default gar nicht damit zurecht, dass das gleiche Subnetz mehrfach verwendet wrid. (z.B. 192.168.1/24 auf verschiedenen Routern.)
kannst du mal ip r zeigen?
Und zu aller letzt guck, dass dein connect() auf die richtige output Adresse geht.
Und traceroute hilft dir halt schon. Der sagt von welcher Adresse und wo es hängen bleibt (mit Addresse) (Auch wenn du wenig metall hast, hast du ne Menge Adressen.)

Üblicher Feheler geht so:
dein Paket geht nach x.y.z.a Der Linux-Kernel findet die als erstes die Adressse 192.168.2.3 auf eth0. Da schickt er mal los.
Aber dann findet er die route 0/0 via 192.168.1.1 für 192.168.1/24 auf eth1. Also schickt er das Paket von der Adresse 192.168.2.3 über eth1 raus. Und das fällt dann auf die Fresse.
rot: Moderator wanne spricht, default: User wanne spricht.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 18.03.2019 19:43:42

er nimmt die interfaces nicht wie es ihm passt, sondern er findet keine passende route und nimmt daher die default...von daher ist es nachvollziehbar. und da ich auf der Kiste selbst das NAT mache (es sind also 2 interfaces mit je einer öffentlichen IP vorhanden), ist in der OUTPUT-table bereits die öffentliche IP gesetzt, somit kann das acket nicht ohne weiteres zu dem anderen Interface routen. und ich vertehe den Ansatz mit dem traceroute nicht, da der erste host (=access-router des ISP) entweder nicht antwortet (default) oder das Paket wegen der falschen source-Adresse verwirft

Code: Alles auswählen

[19:37] frank@bpi-r2-e:~$ ip r
default dev ppp8 scope link 
10.0.3.0/24 dev lxcbr0 proto kernel scope link src 10.0.3.1 
10.0.8.0/24 via 10.0.8.2 dev tun0 
10.0.8.2 dev tun0 proto kernel scope link src 10.0.8.1 
185.53.40.x dev ppp8 proto kernel scope link src 185.53.42.x 
192.168.0.0/24 dev lan0 proto kernel scope link src 192.168.0.10 
192.168.1.0/24 dev lan1.6 proto kernel scope link src 192.168.1.10 linkdown 
192.168.10.0/24 dev ap0 proto kernel scope link src 192.168.10.1 
192.168.11.0/24 dev wlan1 proto kernel scope link src 192.168.11.1 
192.168.50.0/24 dev lan0 scope link 
192.168.178.0/24 dev wan proto kernel scope link src 192.168.178.10 
217.0.118.54 dev ppp0 proto kernel scope link src 93.201.38.x 

Code: Alles auswählen

[19:40] frank@bpi-r2-e:~$ ip a | grep ppp
42: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp 
    inet 93.201.38.x peer 217.0.118.54/32 scope global ppp0
43: ppp8: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp 
    inet 185.53.42.x peer 185.53.40.1/32 scope global ppp8

wanne
Moderator
Beiträge: 5941
Registriert: 24.05.2010 12:39:42

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 18.03.2019 20:03:42

Der saubere weg wäre IMHO:

Code: Alles auswählen

ip route del default dev ppp8 scope link 
ip route add default dev ppp8 scope global src 185.53.42.x 
Eventuell auch ein

Code: Alles auswählen

ip route add default dev ppp8 scope global src 185.53.42.x via 185.53.40.1
Aber ich glaube das via braucht es bei ppp nicht und wird dann auch nicht verstanden.

Erfahrungsgemäß tut das aber aus unerfindlichen Gründen nicht immer.
Notfalls noch ein NAT hinterherschicken:

Code: Alles auswählen

iptables --table nat --append POSTROUTING --out-interface ppp8 -j MASQUERADE
rot: Moderator wanne spricht, default: User wanne spricht.

frankw
Beiträge: 100
Registriert: 24.10.2018 11:34:33

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 19.03.2019 22:15:10

Damit biege ich halt die default-route um,mache aber von lokal kein loadbalancing...das wäre für dwn failover-fall mein notnagel (defaultroute auf das noch funktionierende interface setzen) halte ich aber nicht für sauber,da diese dann bis zum nächsten reconnect so bleibt

Antworten