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

Petr Macek 22. 3. 2012

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

widgety

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.

Našli jste v článku chybu?
Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

120na80.cz: Začněte s posilováním imunity

Začněte s posilováním imunity

Podnikatel.cz: Tyto pojmy k #EET byste měli znát

Tyto pojmy k #EET byste měli znát

DigiZone.cz: Na jaká videa se vlastně díváme

Na jaká videa se vlastně díváme

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Vitalia.cz: Tohle jsou nejlepší česká piva podle odborníků

Tohle jsou nejlepší česká piva podle odborníků

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Podnikatel.cz: Vánoce v září? Kaufland si legraci nedělá

Vánoce v září? Kaufland si legraci nedělá

Lupa.cz: Blíží se konec Wi-Fi sítí bez hesla?

Blíží se konec Wi-Fi sítí bez hesla?

DigiZone.cz: Technisat připravuje trojici DAB

Technisat připravuje trojici DAB

Vitalia.cz: Test dětských svačinek: Tyhle ne!

Test dětských svačinek: Tyhle ne!

Vitalia.cz: Pryč se zastaralým stravováním ve školách

Pryč se zastaralým stravováním ve školách

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Podnikatel.cz: Instalatér, malíř a elektrikář. "Vymřou"?

Instalatér, malíř a elektrikář. "Vymřou"?

Podnikatel.cz: Znáte už 5 novinek k #EET

Znáte už 5 novinek k #EET