loadbalacing über 2 Uplinks

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
wanne
Moderator
Beiträge: 7448
Registriert: 24.05.2010 12:39:42

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 19.03.2019 22:41:22

Von Lokal laod-balancing outgoing ist eher schwierig.
Normalerweise macht man das von Lokal aus über die Anwendung, dass man auf das richtige Interface bindet. Dein dnsmask unterstützt das (wie praktisch alle Programme, die connect() statt bind() machen) aber nicht.
Mit NAT ist es aber relativ gut machbar:

Code: Alles auswählen

ip route add default dev ppp8 table 8 scope global src 185.53.42.x 
ip route add default dev ppp0 table 0 scope global src 93.201.38.x
ip rule add fwmark 0 table 0
ip rule add fwmark 1 table 8
# Alternativ auch dein statefulles marking. Wichtig ist, dass du OUTPUT nimmst.
iptables -t mangle -A OUTPUT -j HMARK --hmark-offset 0 --hmark-tuple sport,dport --hmark-mod 2 --hmark-rnd 0xdeb1a4f0 
iptables --table nat --append POSTROUTING --out-interface ppp8 -j SNAT --to-source 185.53.42.x 
iptables --table nat --append POSTROUTING --out-interface ppp0 -j SNAT --to-source 93.201.38.x
Der Trick ist, dass der dnsmask sich einfach irgend eine (möglicherweise falsche) IP schnappt und das NAT das ganz am Ende beim POSTROUTING, wenn die Entscheidung gefallen ist wieder gerade zieht.

Edit: Hilfreich ist auch https://s3.amazonaws.com/cp-s3/wp-conte ... wchart.jpg
rot: Moderator wanne spricht, default: User wanne spricht.

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

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 21.03.2019 19:15:43

Kann ich die letzten beiden zeilen auch ohne snat nutzen? Ich habe ja keine festen ip's,somit müsste diese regel immer wieder angepasst werden. Die ersten beiden habe ich bereits über ein ip-up-script realisiert. Die nachfolgenden 2 rules habe ich prinzipiell auch schon

Das nachfolgende marking verstehe ich nicht 100% besonders den rnd-teil. In den letzten 3 zeilen steckt scheinbar die magie,wieder neu zu routen

Lokal muss nicht zwingend loadbalancing gemacht werden,aber ich benötige das marking,um es im failover umrouten zu können

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

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 22.03.2019 15:51:16

Kann ich die letzten beiden zeilen auch ohne snat nutzen?
Ja du solltest auch auch Maquerade nehmen können. Das ist etwas weniger effizient, du hast ja aber gemeint, dass Rechenleistung eher Wurst ist.
Ich habe ja keine festen ip's,somit müsste diese regel immer wieder angepasst werden.
Du brauchst die IP aber halt eh im src (das ist leider wichtig und wird von den meisten tools nicht korrekt gesetzt.) und da kannst du sie nicht ersetzen. Und wenn du sie hast, kannst du sie auch in der IP-Tables-Ruel verwenden. Kannst du ja auch im ip-up-script machen.
Das nachfolgende marking verstehe ich nicht 100% besonders den rnd-teil. In den letzten 3 zeilen steckt scheinbar die magie,wieder neu zu routen
Die verteilt halt je nach Ports auf Mark 0 und 1. Welche Ports du auf welches Interface haust ist Pseudozufällig.
Je nach Seed Legt er andere Portkombinationen auf die eine Route. Aber egal was du angibst halt immer die Hälfte auf die eine und die andere Hälfte auf die andere.
Algorithmus ist leider etwas komplizierter, sodass man das nicht so einfach nachrechnen kann (rnd ist dann die Variable interval):
https://code.woboq.org/linux/linux/incl ... ash.h.html
Ist aber völlig Wurst. Hat den großen Vorteil zu einer echt zufälligen Auswahl, dass du auf nem anderen Rechner das selbe Mapping verwenden kannst oder nach einem reboot die Verbindungen trotzdem weiter laufen, wenn du wieder den selben seed eingibst. Du spielst da halt mehr oder minder den Zufallsgenerator für den Rechner.
Du kannst da angeben was du willst. deb1a4f0 war leet für Debianfo[rum]
rot: Moderator wanne spricht, default: User wanne spricht.

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

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 22.03.2019 19:09:01

Wie würden die beiden letzten Zeilen mit masquerade aussehen? Das Problem ist,dass die Firewall unabhängig vom ip-up-script läuft und ich die snat-zeilen dann zwischendrin löschen und wieder einfügen müsste.

Rechenlast ist nicht egal, habe aber mit dem masqerading-Ansatz bisher keine Performance-Einbußen oder hohe CPU-AUslastung beobachtet

Wenn ich marks 3+4 haben möchte,muss ich die 0 bei hmark-offset auf 3 setzen oder? Die 2 dahinter sagt ja sicher die möglichen marks,oder? wenn es nur den lokalen traffic betrifft ist die Verteilung eigentlich egal...wenn es den gesamten Traffic betrifft strebe ich eine 2:1 Verteilung an ( 25Mbit/s vs 13Mbit/s )

das ganze darf natürlich die evtl. vorhandenen marks nicht ändern (bestehende Verbindungen) wegen dem NAT, also würde ich die letzten 3 Zeilen in der separaten Chain machen, was evtl. auch das löschen vereinfacht

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

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 23.03.2019 20:50:45

Wenn ich marks 3+4 haben möchte,muss ich die 0 bei hmark-offset auf 3 setzen oder? Die 2 dahinter sagt ja sicher die möglichen marks,oder? wenn es nur den lokalen traffic betrifft ist die Verteilung eigentlich egal...wenn es den gesamten Traffic betrifft strebe ich eine 2:1 Verteilung an ( 25Mbit/s vs 13Mbit/s )
Ja. Klar.
Wenn du das machst, bekommst du 3,4,5 damit kannst du das 2:1 Verhältnis machen.

Code: Alles auswählen

iptables -t mangle -A OUTPUT -j HMARK --hmark-offset 3 --hmark-tuple sport,dport --hmark-mod 3 --hmark-rnd 0xdeb1a4f0 
Einfach den, den du da schon hast:

Code: Alles auswählen

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

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

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 26.03.2019 19:10:52

danke dir, werde das mal ausprobieren...dabei bin ich evtl. auf meinen Fehler gestoßen

nachdem die bisherige markierung gelaufen ist habe ich so das Mark gespeichert:

Code: Alles auswählen

iptables -A PREROUTING -t mangle -j CONNMARK --save-mark
wenn ich natürlich was aus der OUTPUT-Chain markiert hatte (lokal), war die Markierung danach weg, weil nur die PREROUTING gespeichert wurde. sehe ich das richtig?

habe jetzt an meine vorhandenen Regeln das hintenran:

Code: Alles auswählen

iptables -t mangle -N MARKING_LOCAL
iptables -t mangle -A OUTPUT -m mark --mark 0x0 -j MARKING_LOCAL #without mark move to new chain
iptables -t mangle -A MARKING_LOCAL -j HMARK --hmark-offset 3 --hmark-tuple sport,dport --hmark-mod 4 --hmark-rnd 0xdeb1a4f0

iptables -t mangle -A MARKING_LOCAL -j CONNMARK --save-mark
also alles was noch nicht markiert ist in der OUTPUT-Chain in die neue MARKING_LOCAL "schieben", darin dann die Änderungen durchführen und am Ende speichern.

danach kommen dann die 2 MASQUERADING-Zeilen von dir

leider funktioniert das trotzdem nicht mit dem lokalen Traffic...er wird aber markiert...ich habe für die Chain massive einträge in der log, wenn ich das log anschalte:

das ist lokaler Traffic von dem Router an meinen Client (die SSH-Verbindung, über die ich aktuell teste)

Code: Alles auswählen

Mar 26 19:14:08 bpi-r2-e kernel: [1163165.096478] fwmark 3 (l): IN= OUT=lan0 SRC=192.168.0.10 DST=192.168.0.21 LEN=320 TOS=0x10 PREC=0x00 TTL=64 ID=15952 DF PROTO=TCP SPT=22 DPT=42282 WINDOW=713 RES=0x00 ACK PSH URGP=0 MARK=0x3 
Mar 26 19:14:08 bpi-r2-e kernel: [1163165.106421] fwmark 3 (l): IN= OUT=lan0 SRC=192.168.0.10 DST=192.168.0.21 LEN=320 TOS=0x10 PREC=0x00 TTL=64 ID=15953 DF PROTO=TCP SPT=22 DPT=42282 WINDOW=713 RES=0x00 ACK PSH URGP=0 MARK=0x3 
Mar 26 19:14:08 bpi-r2-e kernel: [1163165.116510] fwmark 3 (l): IN= OUT=lan0 SRC=192.168.0.10 DST=192.168.0.21 LEN=320 TOS=0x10 PREC=0x00 TTL=64 ID=15954 DF PROTO=TCP SPT=22 DPT=42282 WINDOW=713 RES=0x00 ACK PSH URGP=0 MARK=0x3 
Mar 26 19:14:08 bpi-r2-e kernel: [1163165.126733] fwmark 3 (l): IN= OUT=lan0 SRC=192.168.0.10 DST=192.168.0.21 LEN=320 TOS=0x10 PREC=0x00 TTL=64 ID=15955 DF PROTO=TCP SPT=22 DPT=42282 WINDOW=713 RES=0x00 ACK PSH URGP=0 MARK=0x3 
Mar 26 19:14:08 bpi-r2-e kernel: [1163165.136486] fwmark 3 (l): IN= OUT=lan0 SRC=192.168.0.10 DST=192.168.0.21 LEN=320 TOS=0x10 PREC=0x00 TTL=64 ID=15956 DF PROTO=TCP SPT=22 DPT=42282 WINDOW=713 RES=0x00 ACK PSH URGP=0 MARK=0x3
interessant ist, dass scheinbar jedesmal ein neues mark vergeben wird...obwohl die Verbindung doch bekannt ist (TCP) und ich doch nur unmarkierte Packete in die Chain verschiebe..sollte da vielleicht die lokalen netze ausklammern...

ich habe aber auch traffic, der scheinbar richtig markiert wird

Code: Alles auswählen

Mar 26 19:14:02 bpi-r2-e kernel: [1163159.172762] fwmark 4 (l): IN= OUT=ppp8 SRC=93.201.43.x DST=y.y.y.y LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=54015 DF PROTO=TCP SPT=22 DPT=54631 WINDOW=31248 RES=0x00 ACK URGP=0 MARK=0x4 
Mar 26 19:14:02 bpi-r2-e kernel: [1163159.238274] fwmark 4 (l): IN= OUT=ppp8 SRC=93.201.43.x DST=y.y.y.y LEN=900 TOS=0x00 PREC=0x00 TTL=64 ID=54016 DF PROTO=TCP SPT=22 DPT=54631 WINDOW=31248 RES=0x00 ACK PSH URGP=0 MARK=0x4
mhm, evtl. liegt das an der Prüfmethode:

Code: Alles auswählen

frank@frank-N56VZ:~
[19:29:26]$ ping www.test.de
PING www.test.de (104.40.176.254) 56(84) bytes of data.
^C
--- www.test.de ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5113ms
wenn ich die IP-Adresse bei der RIPE eingebe, wird nichts gefunden...sehr mysteriös für eine deutsche Domain...nehme ich eine andere domain geht der Ping...aufrufen kann ich die webseite der Stiftung Warentest aber....da wird wohl nur der Ping blockiert...warum auch immer die IP in der RIPE nicht eingetragen ist

jedenfalls lasse ich es mal laufen und schaue, ob es irgendwelche Probleme gibt

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

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 01.04.2019 15:17:47

so wie es aussieht, landen die Packete nicht mehr in der OUTPUT-Chain, wenn die default-route (aktuell bambit,ppp8) wegbricht...und aktuell nutze ich als filter für "externen Verkehr" das ppp-interface

Code: Alles auswählen

iptables -t mangle -N MARKING_LOCAL

iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -o ppp0 -m mark --mark 0x0 -j MARKING_LOCAL #without mark move to new chain
iptables -t mangle -A OUTPUT -o ppp8 -m mark --mark 0x0 -j MARKING_LOCAL #without mark move to new chain
iptables -t mangle -A MARKING_LOCAL -j HMARK --hmark-offset 3 --hmark-tuple sport,dport --hmark-mod 2 --hmark-rnd 0xdeb1a4f0
iptables -t mangle -A MARKING_LOCAL -m mark --mark 3 -j LOG --log-prefix "fwmark 3 (l): "
iptables -t mangle -A MARKING_LOCAL -m mark --mark 4 -j LOG --log-prefix "fwmark 4 (l): "
iptables -t mangle -A MARKING_LOCAL -j CONNMARK --save-mark

iptables --table nat --append POSTROUTING --out-interface ppp8 -j MASQUERADE
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
die rules werden von meinem Script korrekt umgebogen (3+4 auf den verbleibenden Uplink):

Code: Alles auswählen

# 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 telekom 
10001:	from all fwmark 0x4 lookup telekom 
32766:	from all lookup main 
32767:	from all lookup default
was hier jetzt noch in bambit landet sind meine Test-Rechner bzw. der eine Dyndns.

kann ich irgendwie die Pakete trotzdem packen? oder kann ich eine pseudo-default-route (virtuelles Interface o.ä.) anlegen, auf der ich die Pakete dann richtig routen kann?

so ganz sauber läuft es scheinbar nicht...gerade seiten mit captchas weisen öfters die verbindung ab, vermutlich weil die 2.Anfrage dann von einer anderen IP kommt

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

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 03.04.2019 01:27:37

so ganz sauber läuft es scheinbar nicht...gerade seiten mit captchas weisen öfters die verbindung ab, vermutlich weil die 2.Anfrage dann von einer anderen IP kommt
Willkommen im Cloudflarenet. Das ist zwar kaputt, da kannst du aber nichts machen.
rot: Moderator wanne spricht, default: User wanne spricht.

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

Re: loadbalacing über 2 Uplinks

Beitrag von frankw » 03.04.2019 14:40:42

Wie kommst auf cloudflarenet?

Aber ich denke das problem werde ich nicht gelöst bekommen...Bei den captchas (google) dauert es ja ne weile und dann fliegt die zuordnung (auch hmark raus)...tcp ists eh eine neue verbindung,wenn der link angeklickt wird

maximal das failover, wenn per default alles über einen Anschluss läuft, bei ausfall über den anderen und ohne loadbalancing

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

Re: loadbalacing über 2 Uplinks

Beitrag von wanne » 04.04.2019 11:18:49

Wie kommst auf cloudflarenet?
Weil die die Googlecptchas (und auch alles andere) mit IP-Bindung machen.
Google selbst ist es wurst, von welcher IP du kommst. Die reagieren nur auf Cookies und Referer.
Aber ich denke das problem werde ich nicht gelöst bekommen... […] dauert es ja ne weile und dann fliegt die zuordnung (auch hmark raus)
Nein. hmarks sind hashes. Die gelten für immer auch wenn du nach einem Jahrzehnt wieder rebootest, sind die noch stabiel.
Du kannst dstip hashen:

Code: Alles auswählen

iptables -t mangle -A MARKING_LOCAL -j HMARK --hmark-offset 3 --hmark-tuple dst --hmark-mod 4 --hmark-rnd 0xdeb1a4f0
Hast du nicht so ne schöne verteilung wenn gerade viele Verbindungen zum gleichen Server laufen. Sollte im modernen Internet aber nicht mehr so stark stören.
Die Frage ist eher ob das funktioniert, weil cloudflare viele Server hat.
Wie gesagt: Das ist halt kaputt.
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten