Portál AbcLinuxu, 7. května 2025 20:00

Dotaz: rozdeleni provozu podle portu

houska avatar 14.5.2009 18:43 houska | skóre: 41 | blog: HW
rozdeleni provozu podle portu
Přečteno: 920×
Odpovědět | Admin
Zdravím,

mám dvě připojení a potřebuji aby každé ze dvou navázaných spojení šlo přes jiného ISP.

Našel jsem šikovný návod jak toho dosáhnout.
Označkoval jsem si tedy pakety s cílovým portem 60353 a 60354 značkou 100 resp. 101:

debian:~# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       udp  --  anywhere             anywhere            udp dpt:60353 MARK xset 0x64/0xffffffff
MARK       udp  --  anywhere             anywhere            udp dpt:60354 MARK xset 0x65/0xffffffff
MARK       tcp  --  anywhere             anywhere            tcp dpt:60353 MARK xset 0x64/0xffffffff
MARK       tcp  --  anywhere             anywhere            tcp dpt:60354 MARK xset 0x65/0xffffffff

Vytvořil jsem si dvě routovací tabulky podle defaultní brány a udělal pravidlo které pošle označkované pakety na příslušnou bránu:

debian:~# ip route ls table cdma
default via 10.160.3.42 dev ppp1
debian:~# ip route ls table umts
default via 10.6.6.6 dev ppp0
debian:~#
debian:~# ip rule ls
0:      from all lookup local
32764:  from all fwmark 0x65 lookup cdma
32765:  from all fwmark 0x64 lookup umts
32766:  from all lookup main
32767:  from all lookup default
debian:~#

Problém je, že když smažu defaultní routu z hlavní routovací tabulky, tak spojení vůbec nenavážu. Např. tcptraceroute píše "Network is unreachable".
Poradí někdo? Díky
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

houska avatar 15.5.2009 08:24 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Odpovědět | | Sbalit | Link | Blokovat | Admin
ten návod samozřejmě není na OpenDNS, ale zde
15.5.2009 12:48 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Odpovědět | | Sbalit | Link | Blokovat | Admin

Smazat default route z tabulky main není moc dobrý nápad, protože potom neoznačkované pakety nebude možné směrovat vůbec. Pochybuji, že byste veškerý provoz chtěl posílat výhradně jen na ty dva (resp. čtyři) porty, co třeba DNS dotazy?

Ještě jeden nápad: nezkoušel jste to spojení navazovat ze svého počítače? Pak by byl problém v tom, že lokálně generované pakety neprocházejí řetězcem PREROUTING.

houska avatar 15.5.2009 13:34 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Smazat default route z tabulky main není moc dobrý nápad, protože potom neoznačkované pakety nebude možné směrovat vůbec. To co jsem popsal jsem si chystal pro provoz dvou OpenVPN tunelů, na které pak pustím bonding a budu veškerý provoz routovat přes obě zbondovaná rozhraní na server.

A proč to dělám?
Potřebuju "spojit" dvě pomalá internetová spojení do jednoho rychlejšího.

houska avatar 15.5.2009 13:40 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Ještě jeden nápad: nezkoušel jste to spojení navazovat ze svého počítače? Pak by byl problém v tom, že lokálně generované pakety neprocházejí řetězcem PREROUTING.

To bohužel nepůjde, jde o počítač bez veřejné adresy. ... ještě mě napadlo že by to mohla dělat cache routovaci tabulky

15.5.2009 14:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
To bohužel nepůjde, jde o počítač bez veřejné adresy

Jak to souvisí s tím, na co reagujete?

houska avatar 15.5.2009 14:22 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Ta moje reakce byla jen na první část - tzn. spojení můžu navazovat jen jedním směrem.

Jestli lokálně generované lokálně neprocházejí chainem PREROUTING tak se nemůžou označkovat a tudíž nepůjdou na správnou bránu - to by to celé vysvětlovalo.
Budu to moct vyzkoušet až večer, tak jsem zvědav.

houska avatar 15.5.2009 17:59 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
...lokálně generované pakety neprocházejí řetězcem PREROUTING.

Zkusil jsem si oznacit pakety v retezci OUTPUT:

debian:/home/houska# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
MARK       udp  --  anywhere             anywhere            udp dpt:60353 MARK xset 0x64/0xffffffff
MARK       udp  --  anywhere             anywhere            udp dpt:60354 MARK xset 0x65/0xffffffff
MARK       tcp  --  anywhere             anywhere            tcp dpt:60353 MARK xset 0x64/0xffffffff
MARK       tcp  --  anywhere             anywhere            tcp dpt:60354 MARK xset 0x65/0xffffffff
routovaci tabulky mam dve a pravidlo mam taky nastavene:
debian:/home/houska# ip route ls table cdma
default via 10.160.3.42 dev ppp1
debian:/home/houska# ip route ls table umts
default via 10.6.6.6 dev ppp0
debian:/home/houska#
debian:/home/houska# ip rule ls
0:      from all lookup local
32764:  from all fwmark 0x65 lookup cdma
32765:  from all fwmark 0x64 lookup umts
32766:  from all lookup main
32767:  from all lookup default
debian:/home/houska#
V hlavni routovaci tabulce defaultni routu nemam. OpenVPN i tcptraceroute (oboje zkousene na stejnem portu), hlasi shodne:
debian:/home/houska# tcptraceroute 62.84.145.5 60354
connect: Network is unreachable
debian:/home/houska# 
debian:/home/houska# grep unreachable /etc/openvpn/client1-pri.log  | tail -n3
Fri May 15 17:48:11 2009 write UDPv4 []: Network is unreachable (code=101)
Fri May 15 17:48:13 2009 write UDPv4 []: Network is unreachable (code=101)
Fri May 15 17:48:16 2009 write UDPv4 []: Network is unreachable (code=101)
debian:/home/houska# 


15.5.2009 21:44 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Označkování v chainu OUTPUT v tomto případě bohužel nepomůže, protože tím paket prochází až poté, co se rozhodne o jeho směrování (jinak bychom nemohli znát odchozí rozhraní). Jako náhražku by v tomto případě mělo být možné použít akci ROUTE netfilteru.
houska avatar 16.5.2009 13:39 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Jako náhražku by v tomto případě mělo být možné použít akci ROUTE netfilteru.

To jste mě moc nepotěšil ... ze zdrojáků debianu byla podpora z netfiltru odstraněná na podzim 07 :( vrrr

Každopádně díky moc za pomoc.

houska avatar 17.5.2009 17:21 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Pro info:

Nasel jsem patch-o-matic, ktery je bohuzel dlouho neudrzovany.

Pak jsem objevil xtables-addons a nebo zde, ktery se tvari jako nastupce P-O-M a je docela cerstvy a udrzovany. Bohuzel zatim nepodporuje -j ROUTE. Nedalo mi to a napsal jsem do konference zda se tato podpora chysta.

Vyvojar xtables-addons mi odpovedel ze po omarkovani je paket znovu routovan ... coz odporuje me zkusenosti.

... tak uvidime
18.5.2009 08:30 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Vyvojar xtables-addons mi odpovedel ze po omarkovani je paket znovu routovan ... coz odporuje me zkusenosti.

Takhle to určitě funguje, pokud dojde ke změně cílové adresy v nat.OUTPUT (jinak by celý ten řetězec neměl smysl). Některé zdroje tvrdí, že se totéž děje i při změně značky v mangle.OUTPUT, ale když jsem to kdysi zkoušel, nechovalo se to tak. Jestli budu mít čas, zkusím se na to podívat ještě jednou.

Ještě poznámka k tomu, co jste psal dříve: pokud by problém způsobovala směrovací cache, mělo by stačit ji vyprázdnit (ip route flush cache).

houska avatar 18.5.2009 08:41 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Jestli budu mít čas, zkusím se na to podívat ještě jednou.

Díky

houska avatar 26.5.2009 10:43 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Některé zdroje tvrdí, že se totéž děje i při změně značky v mangle.OUTPUT

podle tohoto obrázku by se tak dít mělo

poradíte mi jak to ozkoušet?

26.5.2009 21:51 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Příloha:

Tak jsem to právě vyzkoušel a zdá se, že to tak opravdu funguje. Použil jsem topologii podle obrázku v příloze. Na routeru 83 je v tabulce main pro síť 10.0.23.0/24 směrování přes gateway 10.0.11.84. Když přidám

ip route add 10.0.23.0/24 via 10.0.10.85 table 100
ip rule add priority 1000 fwmark 1 lookup 100
iptables -t mangle -A PREROUTING -m length --length 0:500 -j MARK --set-mark 1

a zkusím se podívat, jak chodí pakety z 10.0.21.82 na 10.0.23.88, tak podle očekávání "dlouhé" chodí dál přes 84, ale "krátké" přes 85. To se ale týká pouze paketů z 10.0.21.0/24, lokálně generované (tj. ping přímo z 83) podle očekávání dál chodí všechny přes 84. Jakmile jsem ale přidal stejné pravidlo i do chainu OUTPUT:

iptables -t mangle -A OUTPUT -m length --length 0:500 -j MARK --set-mark 1

začaly se i lokálně generované pakety (z 83) rozdělovat mezi obě trasy podle délky.

Vyvodil jsem z toho poučení, že aby člověk nebyl za blbce, je dobré čas od času vyzkoušet, jestli to, o čem už léta tvrdí že nefunguje, náhodou mezitím fungovat nezačalo.

houska avatar 27.5.2009 18:20 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu

Moc děkuju, fakt to funguje.
S vaší pomocí jsem to podle délky taky dovedl rozběhat.

Ještě se v tom zkusim povrtat a pak napíšu nějaký zápis do blogu. Zatim nevim co jsem dělal špatně.
U ip rule jsem nepoužíval prioritu a místo lookup jsem měl table ...

Ještě jednou díky. Máte u mě pivo, čokoládu nebo tak něco, dle vašeho výběru.
Jste pořád v Sot-ftroniku?

27.5.2009 19:05 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
U ip rule jsem nepoužíval prioritu a místo lookup jsem měl table

To by nemělo vadit. Klíčová slova lookup a table jsou synonyma a pokud se nespecifikuje priorita, přiřadí se automaticky a stejně bude mezi 0 (kterou má pravidlo, které všechno zkouší vyhledat v local) a 32766 (kterou má pravidlo, které všechno zkouší vyhledat v main).

Jste pořád v Sot-ftroniku?

V tom smyslu, že pro ně dělám lektora, ano. Zaměstnanec ale nejsem (ani jsem nikdy nebyl).

houska avatar 27.5.2009 20:50 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Zatim nevim co jsem dělal špatně.

Zjistil jsem ze kdyz to mam rozbehane a odstranim z hlavni routovaci defaultni routu tak to zase zacne rvat Network is unreachable

18.5.2009 06:57 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
A co je v té hlavní routovací tabulce? Zkoušel jste strace/tcpdump? To by mohlo napovědět kam se to snaží posílat pakety a proč to nejde.
In Ada the typical infinite loop would normally be terminated by detonation.
18.5.2009 08:25 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Hlášení Network is unreachable znamená, že se je nesnaží posílat nikam, protože neví kam.
18.5.2009 16:54 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Někam se něco poslat musí snažit, jinak by mu to nemohlo říct, že to poslat nemůže :-) v strace bude určitě ten syscall vidět...
In Ada the typical infinite loop would normally be terminated by detonation.
18.5.2009 17:12 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
Jistě, ale tohle tazatele nezajímá, protože on samozřejmě ví, na jakou adresu a port zkoušel navázat spojení. Jeho zajímá, jak na základě toho určí router odchozí interface a první hop. Nebo ještě přesněji: testuje, jestli to opravdu dělá tak, jak se ho snažil přesvědčit, aby to dělal (a zjišťuje že ne). V tom mu strace nepomůže.
houska avatar 18.5.2009 08:45 houska | skóre: 41 | blog: HW
Rozbalit Rozbalit vše Re: rozdeleni provozu podle portu
V hlavní routovací tabulce je jen routa:
debian:/home/houska# ip route ls
10.160.3.42 dev ppp0  proto kernel scope link   src 10.162.62.199
debian:/home/houska#

Podrobnosti v mailkonferenci netfiltru.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.