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

22. 3. 2012
Doba čtení: 3 minuty

Sdílet

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.

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

bitcoin_skoleni

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.

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.