Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Bawił się ktoś tutaj konfiguracją łącza kilku ISP? Chodzi generalnie o możliwość osiągnięcia internetu przez dwa interfejsy na kompie. [url=http://www.policyrouting.org/PolicyRoutingBook/ONLINE/CH05.web.html#5.3]Niby sobie czytam t[/url]o ale coś ta książka jest nieco przestarzała. xD Zatrzymałem się w sumie na:
ip route add equalize default \ nexthop via 1.1.1.30 dev eth1 \ nexthop via 2.2.2.30 dev eth1
Chciałem dać swoje interfejsy i adresy, tylko system nie chce przyjąć tego [b]equalize[/b] . Niby [url=http://linux.die.net/man/8/ip]tu[/url] piszą, że
equalize
allow packet by packet randomization on multipath routes. Without this modifier, the route will be frozen to one selected nexthop, so that load splitting will only occur on per-flow base. equalize only works if the kernel is patched.[/quote]
Czyli z tym parametrem pakiety są rozdzielane do kolejnych bramek, a bez niego to strumienie są rozdzielane do osobnych bramek, czyli transfer pliku (jedno połączenie) rozłoży się tylko na łączu jednego ISP. Z kolei [url=http://manpages.ubuntu.com/manpages/xenial/en/man8/ip-route.8.html]tutaj[/url] nie ma w ogóle wzmianki o tym equalize — to jakiś przeżytek w końcu jest? xDOstatnio edytowany przez morfik (2016-05-21 22:19:12)
Offline
[quote=morfik]A z tej wielościeżkowej trasy domyślnej się nie korzysta już? xD[/quote]
Można, tutaj ładny przykład: http://www.tipsternet.com/articles/advance%20routing.htm
Tylko aktualnie większość sieci buduje się na jednym łącznym i na drugim zapasowym. Przełączanym gdy to pierwsze padnie.
Offline
No właśnie problem jest, że to nie działa. Nie przyjmuje w ogóle tego equalize .
# ip route add equalize default nexthop via 192.168.1.1 weight 1 nexthop via 10.136.105.1 weight 1 Error: ??? prefix is expected rather than "equalize".
Offline
A to jeszcze w sumie mam takie pytanie. Prze /etc/network/interfaces skonfigurowałem sobie dwa interfejsy: bond0 i wwan0 . Na chwilę obecną ustawiłem różne metryki i tak się prezentuje tablica routingu:
# ip route show default via 192.168.1.1 dev bond0 metric 10 default via 10.140.66.161 dev wwan0 metric 100 10.140.66.160/30 dev wwan0 proto kernel scope link src 10.140.66.162 192.168.1.0/24 dev bond0 proto kernel scope link src 192.168.1.150 192.168.10.0/24 dev br-lxc proto kernel scope link src 192.168.10.100
Chodzi generalnie o testy i zasadę działania. Jak odpalę wiresharka na interfejsie wwan0, to tam nie ma żadnego ruchu. No i to rozumiem, bo bond0 ma mniejszą metrykę i to przez niego leci ruch. Niemniej jednak, na necie pisali, że jak się sprawdza łączność ze światem przez jakąś bramę, to przy ping najlepiej dać przełącznik -I i nazwę interfejsu. Przykładowo:
# ping -c 3 -I wwan0 8.8.8.8 PING 8.8.8.8 (8.8.8.8) from 10.140.66.162 wwan0: 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=33.4 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=34.2 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=33.3 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 33.343/33.670/34.228/0.423 ms
W wiresharku jednak nie ma ruchu żadnego dalej. Czy ktoś wie może dlaczego pakiety lecą przez bond0 w tym przypadku? Przecie wyraźnie się określiło którędy mają lecieć.
Dodatkowo, jak wyciągnę kabel z tego bond0, to połączenia zdychają, mimo, że ten wwan0 działa. Jak się usunie te bramę z bond0, to wtedy połączenie wraca. Jak to wyjaśnić? xD
Ostatnio edytowany przez morfik (2016-05-17 17:10:19)
Offline
drobna uwaga: z wielościeżkowych tras korzysta się wyłącznie w przypadkach, gdy wszystkie są równoważne (czyli nie ma różnicy jak puścisz pakiet). w przypadku kilku isp takiej równoważności nie ma - jeśli nawiązałeś połączenie z jednego interfejsu to musisz z niego korzystać do końca.
nie pamiętam już jak to rozwiązałem (jakieś paręnaście lat temu) ale było tam powiązanie ip docelowy i interfejs...
Offline
drobna uwaga: z wielościeżkowych tras korzysta się wyłącznie w przypadkach, gdy wszystkie są równoważne (czyli nie ma różnicy jak puścisz pakiet).[/quote]
Jak to rozumieć? Mam jednego ISP i drugiego ISP, puszczam pakiet i co musi być spełnione by korzystać z takiej wielościeżkowej trasy?
Offline
Przy połączeniach TCP, każdy flow musi iść tą samą ścieżką, bo twój adres IP musi pasować do tego, w nawiązanym już połączeniu (a wybierając inne łącze, o ile nie rozgłaszasz się przez BGP, masz inny adres). Możesz jedynie próbować z połączeniami UDP, ale podejrzewam, że duża część protokołów tak czy siak sprawdza adres IP w wyższych warstwach.
Offline
Hmm, to zostawmy na tę trasę wielościeżkową. No to teraz pytanie jest, jak to zrobić w oparciu o trasy routingu? Patrzyłem jak to mwan3 na OpenWRT zrobił i wychodzi na to, że powinienem dodać do pliku /etc/iproute2/rt_tables dwie tablice. Dodałem:
10 home 20 lte
Skonfigurowałem sobie dwa interfejsy sieciowe bond0 i wwan0 przez /etc/network/interfaces i podniosłem je oba. Tak wygląda tablica routingu main:
# ip route show table main default via 192.168.1.1 dev bond0 metric 10 default via 10.140.17.21 dev wwan0 metric 100 10.140.17.20/30 dev wwan0 proto kernel scope link src 10.140.17.22 192.168.1.0/24 dev bond0 proto kernel scope link src 192.168.1.150 192.168.10.0/24 dev br-lxc proto kernel scope link src 192.168.10.100
Te bramki domyślne, co tutaj są, dodałem do osobnych tablic routingu. Ta od bond0 jest w home, a ta od wwan0 w lte:
# ip route show table home default via 192.168.1.1 dev bond0 # ip route show table lte default via 10.140.17.21 dev wwan0
Czyli w tym momencie wystarczy dodać odpowiednie reguły dla routingu i powinno działać? Patrząc na to co mwan3 uzupełnił na OpenWRT, dodałem parę reguł i wyszło coś takiego:
# ip rule show 0: from all lookup local 1001: from all iif bond0 lookup main 1002: from all iif wwan0 lookup main 2002: from all fwmark 0x2/0xff lookup lte 32766: from all lookup main 32767: from all lookup default
Czyli zgodnie z tym powyższym, wszytko co jest oznaczane markiem 0x2/0xff powinno powędrować do tablicy lte, a tam, że jest wpis od bramy domyślnej, to pakiet powinien powędrować przez interfejs wwan0. Pakiety są oznaczane w łańcuchu INPUT tablicy mangle w iptables, czyli przed decyzją o routingu. No ale jest problem, bo to nie działa. xD Połączenia oznaczone mark=2 zwyczajnie nie są realizowane. Tzn. pakiety są wysyłane ale najwyraźniej nie potrafią wrócić:
# cat /proc/net/nf_conntrack | grep mark=2 ipv4 2 tcp 6 37 SYN_SENT src=192.168.1.150 dst=185.52.170.19 sport=39142 dport=80 [UNREPLIED] src=185.52.170.19 dst=192.168.1.150 sport=80 dport=39142 mark=2 zone=0 use=2 ipv4 2 tcp 6 116 SYN_SENT src=192.168.1.150 dst=185.52.170.8 sport=56180 dport=80 [UNREPLIED] src=185.52.170.8 dst=192.168.1.150 sport=80 dport=56180 mark=2 zone=0 use=2 ipv4 2 tcp 6 104 SYN_SENT src=192.168.1.150 dst=52.25.175.6 sport=37906 dport=443 [UNREPLIED] src=52.25.175.6 dst=192.168.1.150 sport=443 dport=37906 mark=2 zone=0 use=2
Ciągle mają ten SYN_SENT. W wiresharku mam mnóstwo retransmisji. Czyli coś gdzieś źle jest ustawione albo o czymś zapomniałem, tylko o czym? xD Dlaczego w tych oznaczonych połączeniach jest adres src=192.168.1.150 , on przecie jest powiązany z interfejsem bond0? Ja powinienem tym pakietom jakoś to źródło przepisać w oparciu o coś? xD
EDIT:
Niby dałem:
# iptables -S -t nat -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -o wwan0 -j MASQUERADE -A POSTROUTING -o bond0 -j MASQUERADE
W tablicy conntracka są wpisy typu:
ipv4 2 tcp 6 431993 ESTABLISHED src=192.168.1.150 dst=5.39.94.136 sport=45186 dport=80 src=5.39.94.136 dst=10.140.17.22 sport=80 dport=45186 [ASSURED] mark=2 zone=0 use=2
I tera działa. To tak ma być?
Ostatnio edytowany przez morfik (2016-05-18 17:32:32)
Offline
Chyba jednak ma być z tą maskaradą. Inaczej nie chcą biegać te pakiety. xD Przy okazji udało mi się przy pomocy skryptów dhclient zaprogramować automat, który tworzy odpowiednie tablice routingu i dodaje w nich trasy. Jeszcze mi został do obmyślenia failover i load balancing tych dwóch łącz. Póki co na sztywno ustawiłem marki dla usera 0 i 1000 i niby chodzi:
[img]http://i.imgur.com/fGDWpAn.png[/img]
Offline
Mam takie pytanie jeszcze odnośnie tej wielościeżkowej bramy domyślnej. Tak sobie testuje równoważenie połączeń za pomocą tej bramy i coś to nie działa tak jak mi się wydawało, że powinno. xD Wagi są ustawione 1:1, czyli 50% połączeń powinno iść przez jeden interfejs i 50% przez drugi. No to nawiązuje połączenie z pierwszym lepszym serwisem www. No i chyba działa, bo pakiety w wiresharku lecą na obu interfejsach, no bo przecie włażąc na taki serwis www, to się generuje dziesiątki czy setki połączeń.
No to robię drugą próbę, tym razem z pojedynczymi połączeniami. Chcę odpytać o mój IP dwa różne serwisy:
$ curl text.whatisyourip.org $ curl http://eko.one.pl/host.php
Każdy z nich zwraca inny adres i na wiresharku widać, że pakiety lecą raz przez jeden interfejs, raz przez drugi. Problem w tym, że zawsze w tych serwisach mam ten sam adres IP. xD On się nie zmienia, a przecie wykonuję nowe połączenia. Nie ważne ile połączeń wykonam pod jeden z tych powyższych adresów i tak zawsze będzie mi zwrócony taki sam IP, czyli pakiety idą przez ten sam interfejs. Ktoś umiałby wytłumaczyć dlaczego tak się dzieje? Coś te docelowe adresy IP zapamiętuje i nie zezwala na połączenie z nimi przez kolejny interfejs? Myślałem, że może wpisy w tablicy conntracka ale nawet przy ich ciągłym czyszczeniu pakiety lecą tym samym interfejsem. Jakiś pomysł czym takie zachowanie może być spowodowane?
Offline
No to w końcu ustaliłem WTF.
IPv4: Hash-based multipath routing. When the routing cache was removed in 3.6, the IPv4 multipath algorithm changed from more or less being destination-based into being quasi-random per-packet scheduling. This increased the risk of out-of-order packets and made it impossible to use multipath together with anycast services. In this release, the multipath routing implementation is replaced with a flow-based load balancing based on a hash over the source and destination addresses merge commit
-- http://kernelnewbies.org/Linux_4.4[/quote]
Wychodzi na to, że z wypuszczeniem kernela 3.6 usunęli cache routingu, bo był "bee" (mniej niż 10% trafień i otwierał drogę do szeregu ataków). xD Na jego miejsce wprowadzili coś o nazwie "routing exception" ale to też było do dupy, bo było w stanie rozwalić połączenia przesyłając części pakietów przez inne interfejsy. xD Teraz od kernela 4.4 jest cache oparty na hashu, który spina adres źródłowy i docelowy. Każdy pakiet wysłany z określonego adresu IP na pewien adres docelowy zawsze będzie leciał tym samym interfejsem. Dlatego ta wielościeżkowa brama domyślna tak się zachowuje. Jeśli chce się robić bardziej zaawansowany load balancing (wciąż jednak oparty o połączenia, a nie o pakiety), to trzeba jechać na osobnych tablicach routingu, markować pakiety w stanie NEW w iptables i na podstawie tych marków rozdzielać ruch do osobnych interfejsów. No to z tym raczej już nie powinno być problemów, choć jeszcze nie wiem jak losowo markować pakiety różnymi markami ale to było chyba w mwan3. xD
Póki co przetestowałem przydzielając interfejsowi losowe adresy z mojej sieci i faktycznie w końcu zapytanie do serwera w necie poszło przez drugi interfejs.
Tutaj jest jeszcze więcej info: https://lwn.net/Articles/657431/Ostatnio edytowany przez morfik (2016-05-20 19:29:04)
Offline
A co tu do rozkminiania? xD
I jeszcze taki bajer znalazłem czytając ten powyższy artykuł:
net.ipv4.conf.all.ignore_routes_with_linkdown = 1 net.ipv4.conf.default.ignore_routes_with_linkdown = 1
Ten parametr ignore_routes_with_linkdown włącza failover łącza. Domyślnie jest on ustawiony na 0, gdzie przy zaniku połączenia i ciągle aktywnym interfejsie, przy próbie połączenia zwykle dostaniemy komunikak [b]No route to host[/b]. Jeśli się ten parametr przestawi na 1, wtedy taka trasa zostanie zignorowana i połączenie pójdzie przez drugi interfejs. Oczywiście sesje TCP zostaną uwalone ale np. ping automatycznie zostanie przerzucony na drugie łącze, z utratą może 2-3 pakietów. Fajny bajer, nie trzeba monitorować połączenia. xD
Ostatnio edytowany przez morfik (2016-05-20 19:30:57)
Offline
Udało się!!!111one xD
W końcu zaprojektowałem se load balancer 50:50 z markowaniem pakietów w iptables i rozdzielaniem ruchu w oparciu o różne tablice routingu. Całość działa dynamicznie dzięki skryptom dhclienta no i oczywiście jest failover, również automatyczny na poziomie kernela. Nie potrzeba żadnych dodatkowych mechanizmów zbrojących i zabezpieczających na wypadek awarii łącza.
Dla ciekawych, regułki iptables oznaczające pakiety:
iptables -t mangle -A qos-egress -m mark --mark 0x0/0xff -m statistic --mode random --probability 0.5 -j MARK --set-xmark 0x2/0xff iptables -t mangle -A qos-egress -m mark --mark 0x0/0xff -j MARK --set-xmark 0x5/0xff iptables -t mangle -A qos-ingress -m mark --mark 0x0/0xff -m statistic --mode random --probability 0.5 -j MARK --set-xmark 0x2/0xff iptables -t mangle -A qos-ingress -m mark --mark 0x0/0xff -j MARK --set-xmark 0x5/0xff
Oczywiście do tego potrzebna jest baza markująca w oparciu o target CONNMARK ale to nie problem raczej. Proporcje łącza można sobie dopasować zmieniając --probability , dzięki któremu iptables markuje mniej więcej 50% nowych połączeń. Pozostałe, które nie zostaną oznaczone, wpadają na drugą regułę i ta już ustawia tym nieoznaczonym pakietom inne marki. I właśnie w oparciu o te marki pakiety lecą do osobnych tablic routingu.
Dobrze, że wyjaśniłem se wcześniej ten cały --set-xmark , bo by nie szło tego spiąc z TC, a tak to bez problemu te dwa mechanizmy se działają razem. xD Całość wyszła o wiele prościej niż w OpenWRT przy tym całym mwan3.
Oczywiście można w dalszym ciągu przemarkować te pakiety pod kątem usług i dodać dodatkowe reguły w tablicach routingu z wyższym priorytetem i rozdzielić sobie np. www od torrentów między obu ISP. Full wypas. Szkoda tylko, że za 8 dni jeden ISP przestanie mi świadczyć usługi. xD
Offline
A i jeszcze taka sprawa odnośnie tego całego routowania. To niesie ze sobą pewne komplikacje, jeśli ktoś np. korzysta z własnego LAN dostępnego przez jednego z tych operatorów. Np. ja mam po drodze domowy router, i połowa połączeń do sieci 192.168.1.0/24 szła by przez drugiego ISP, co oczywiście nie zadziała i trzeba porobić odpowiednie regułki dla tych sieci. Podobnie jest w przypadku korzystania z kontenerów LXC, czy nawet gdy ktoś używa VPN.
Nie wiem czy gdy się odpali VPN to można przesyłać pakiety do obu ISP ale póki co to do tego skryptu co miał aktualizować resolver i blokować zapytania DNS w iptables (/etc/openvpn/update-resolv-conf.sh) musiałem też dodać regułki typu:
ip rule add from all table main prio 500 ip rule del from all table main prio 500
Bez tego, ruch omija kompletnie VPN. xD
Ostatnio edytowany przez morfik (2016-05-25 11:30:30)
Offline
Time (s) | Query |
---|---|
0.00011 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00090 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='13.59.183.186' WHERE u.id=1 |
0.00063 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '13.59.183.186', 1732994523) |
0.00047 | SELECT * FROM punbb_online WHERE logged<1732994223 |
0.00094 | DELETE FROM punbb_online WHERE ident='54.36.148.86' |
0.00080 | SELECT topic_id FROM punbb_posts WHERE id=301572 |
0.00008 | SELECT id FROM punbb_posts WHERE topic_id=28632 ORDER BY posted |
0.00061 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=28632 AND t.moved_to IS NULL |
0.00010 | SELECT search_for, replace_with FROM punbb_censoring |
0.00272 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=28632 ORDER BY p.id LIMIT 0,25 |
0.00075 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28632 |
Total query time: 0.00815 s |