Hlavní navigace

Využití dvou internetových připojení (ve FreeBSD)

V dnešní době poměrně levné konektivity se docela často řeší záložní konektivita nebo rozložení zátěže mezi více připojení. Tento článek vám ukáže jednu z několika možností, kterou lze rozdělit traffic do více nezávislých linek. Řešení je postavené na FreeBSD a využívá více routovacích tabulek.

Tweetni to Odměnte autora  Jak to funguje?

Co potřebuji nakonfigurovat? Máme LAN, která má dvě (nebo více) internetové konektivity. Chceme rozdělit provoz klientů přes dvě konektivity, například podsíť 192.168.1.0/25 přes WAN2 a vše ostatní přes WAN1. Rozdělení podle podsítí není jediná možnost, provoz je možné dělit třeba podle služeb (smpt, www, …), záleží jen na nás.

LAN používá adresy 192.168.1.0/24, na WAN rozhraních běží naty. Více napoví obrázek.

                       ______________
                 fxp0 |              |  em0
LAN ------------------|  FreeBSD     |-------------- WAN1 (nat, gw 10.11.12.254)
      192.168.1.1/24  |______________| 10.11.12.1/24
                              |
                              | em1
                              --------------------- WAN2 (nat, gw 20.11.12.2)
                                20.11.12.1/252

Linuxáři se možná pozastaví nad značením síťových karet. Místo ethX jsou názvy emX,vrX, … FreeBSD značí karty dle ovladače. Možná to někomu přijde divné, ale zběhlý správce z ifconfigu rovnou pozná, s jakou kartou pracuje. Více třeba v man em, man vr, …

Pokud to někomu nevyhovuje, je možné si názvy změnit v  /etc/rc.conf:

ifconfig_em0="inet 10.11.12.1 netmask 255.255.255.0 name wan0"

nebo z ruky ifconfig em0 name wan1

Další možností je přidat si popis karty, opět v rc.conf:

ifconfig_em0="inet 10.11.12.1 netmask 255.255.255.0 descr WAN1"

nebo z ruky ifconfig em0 descr popis. Otázkou je, proč ale takové přejmenování dělat.

Jak tedy rozdělit zátěž? Použijeme více routovacích tabulek a utilitu setfib. Je to specialita FreeBSD, v systému od verze 7.1, používá se také u jailů. FreeBSD má více firewallů, my použijeme ipfw. Princip je v tom, že si vytvoříme další routovací tabulku (fib) a firewallovým ipfw pravidlem setfib označkujeme IP paket tak, že bude použit s námi definovanou routovací tabulkou. Takže v našem případě budeme mít běžnou routovací tabulku (fib0) a fib1. Pokud používáte firewall PF, místo setfib použijde rtable. Více v  man 5 pf.conf.

Pro zprovoznění je ale nutné zkompilovat kernel a oznámit mu, kolik routovacích tabulek máme, pomocí

options ROUTETABLES=2

Nejsme omezeni na dvě routovací tabulky, je možné si vytvořit až 16 tabulek (0 – 15). Kolik jich systém umožní v tomto okamžiku, můžeme zjistit pomocí sysctl:

root@kaktus ~ # sysctl net.fibs
net.fibs: 1

Doteď veškerý provoz odcházel přes WAN1, v rc.conf  tedy máme:
ifconfig_em0="inet 10.11.12.1 netmask 255.255.255.0"
defaultrouter="10.11.12.254"

Ve firewallu je nastaven nat a je do něj směrován provoz:
  ipfw nat 1 config ip 10.11.12.1 unreg_only
ipfw add 5000 nat 1 all from any to any via em0 // nat

Malá poznámka k poslednímu řádku – ipfw firewall umožňuje u každého pravidla napsat poznámku. Docela užitečná věc.

Pro druhou konektivitu přidáme druhý nat a pravidlo pro značení paketů. Celé to tedy bude vypadat takto.
První řádek je důležitý. Bez něj by paket označený pomocí setfib dále firewallem nepokračoval:
  ipfw disable one_pass

Konfigurace natů
ipfw nat 1 config ip 10.11.12.1 unreg_only
ipfw nat 2 config ip 20.11.12.1 unreg_only

Přesměrování poloviny sítě na druhou konektivitu
  ipfw add setfib 1 ip from 192.168.1.128/25 to any via fxp0 // znacka paketu

Zde by nemuselo ani přesně definované IP podsítě, důležité je
via interface. Routovací tabulkou už jsme řekli, že podsíť 192.168.1.12/25 odchází přes em1.
  ipfw add 5000 nat 1 all from 192.168.1.0/25 to any via em0 // nat 1
ipfw add nat 2 all from 192.168.1.128/25 to any via em1 // nat 2

Konkrétní výpis firewallu:
ipfw list
...
02100 setfib 1 ip from 192.168.1.128/25 to any via fxp0 // znacka
...
05000 nat 1 all from 192.168.1.0/25 to any via em0 // nat 1
05100 nat 2 all from 192.168.1.128/25 to any via em1 // nat 2
...

Vytvoření druhé routovací tabulky můžeme provést několika způsoby, snadno pomocí /etc/rc.local:
  #!/bin/sh
# mazani deafultni routy patrne neni nutne, ale jistota je jistota
setfib 1 route delete default
setfib 1 route add default 20.11.12.2

K testování slouží utilita setfib. Můžeme vypsat např. alternativní routovací tabulku pomocí

setfib 1 netstat -rn

Výchozí tabulka má číslo 0, takže lze vypsat pouze netstat -rn nebo i setfib 0 netstat -rn. Ale nejsme omezeni jen na výpis routovací tabulky, setfib jde použít téměř na cokoli. Můžete testovat třeba takto:

traceroute www.root.cz a potom setfib 1 www.root.cz.

Na větší testování je možné použít i:

setfib 5 sh (nebo bash)
// a tady pracuji s jinou rotovací tabulkou
exit
// než zde

Snadno lze udělat rovnoměrné zatížení WAN rozhraní. Stačí k tomu použít ipfw parametr prob (pravděpodobnost):
ipfw add prob 0.5 setfib 1 all from 192.168.1.0/24 to any keep state

Snadno takto lze vyrobit jednoduchý failover, třeba i jen shell skriptem, který bude modifikovat ipfw pravidlo setfib. Dnes ale máme i komfortnější nástroje a příště si ukážeme démona ifstated.

Ohodnoťte jako ve škole:
Průměrná známka 1,00
Tweetni to Odměnte autora  Jak to funguje?

12. ročník největší soutěže firemních webů je v plném proudu

 

Přihlaste se do soutěže WebTop100

Získejte hodnocení svého webu odborníky spolu s doporučením ke slepšení a zároveň možnost srovnání s konkurenčními weby.

Více informací o soutěži

       

Přehled názorů

Zajímavé řešení.
Filip Valder 22. 3. 2012 06:55
Nový
Zajimave
Michal Skrha 22. 3. 2012 07:43
Nový
└ 
Re: Zajimave
Sten 22. 3. 2012 10:34
Nový
 
└ 
Re: Zajimave
Sten 22. 3. 2012 10:36
Nový
bez natu?
Miroslav Novotný 22. 3. 2012 08:25
Nový
├ 
Re: bez natu?
Martin Kratochvíl 22. 3. 2012 09:44
Nový
├ 
Re: bez natu?
BobTheBuilder 22. 3. 2012 09:47
Nový
└ 
Re: bez natu?
Filip Valder 22. 3. 2012 09:53
Nový
Podekovani
Petr Macek 22. 3. 2012 08:43
Nový
Super
Miroslav Prýmek 22. 3. 2012 10:25
Nový
└ 
Re: Super
stud_fi 22. 3. 2012 10:36
Nový
linux
David 22. 3. 2012 11:17
Nový
└ 
Re: linux
mankind_boost 22. 3. 2012 15:32
Nový
 
├ 
Re: linux
radoozz 22. 3. 2012 16:42
Nový
 
└ 
Re: linux
l. 22. 3. 2012 16:46
Nový
 
 
└ 
Re: linux
Machos 23. 3. 2012 09:42
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem