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
.