Připomínám dva předchozí díly, a sice první díl, který představil nástroj ip
a základy práce s ním, zatímco druhý díl zmínil protokol ARP, základní nastavení směrování a doplnil vše, co nezbytně potřebujete k ručnímu vytvoření připojení k internetu (výchozí bránu, nastavení resolveru a přidání alespoň jedné IP adresy síťovému rozhraní).
Směrovací pravidla
Nástroj ip
(a potažmo linuxové jádro) toho umí mnohem více. Řekněme, že máte k dispozici dvě brány a chcete nějakou komunikaci směrovat přes jednu a jinou komunikaci přes druhou bránu. Něco takového je také možné, a to pomocí směrovacích pravidel (ip rule
).
V minulém díle jste viděli příklady směrování. To, co jsem vám zamlčel, je skutečnost, že směrovacích tabulek může být více. Nemusíte tedy mít všechna směrovací pravidla pohromadě, ale můžete je rozdělit. Pomocí ip rule
pak můžete definovat, kdy se použije jaká tabulka.
Příkladem může být následující situace. Máte směrovač, který má čtyři síťová rozhraní, přičemž dvě vedou do dvou místních sítí (192.168.0.0/24 a 192.168.1.0/24) a druhá dvě vedou ke dvěma poskytovatelům připojení. Vy chcete pakety z jedné sítě směrovat přes jednoho ISP a pakety z druhé sítě přes druhého ISP. Pro představu doplňuji malý ASCII „obrázek“:
síť 192.168.0.0/24 \ / brána 10.0.0.1 --- ISP1 router síť 192.168.1.0/24 / \ brána 10.0.2.1 --- ISP2
Specifikace IP adres na routeru by vypadala takto:
ip addr add 10.0.0.254/24 dev eth0 ip addr add 10.0.2.254/24 dev eth1 ip addr add 192.168.0.254/24 dev eth2 ip addr add 192.168.1.254/24 dev eth3
Následuje specifikace výchozích bran do dvou oddělených tabulek, tabulky 101 a tabulky 102:
ip route add default via 10.0.0.1 dev eth0 table 101 ip route add default via 10.0.2.1 dev eth1 table 102
Na závěr je potřeba specifikovat pravidla, která budou posílat pakety do jednotlivých tabulek na základě příslušnosti k určité síti:
ip rule add from 192.168.0.0/24 table 101 ip rule add from 192.168.1.0/24 table 102
Přirozeně může nastat mnoho jiných situací. Kupříkladu, místo druhého ISP můžete mít VPN (to by se konfigurovalo velmi podobně), nebo místo dvou sítí budete chtít přes jedno připojení směrovat komunikaci, která směřuje na konkrétní počítač, např.:
ip rule add to 1.2.3.4 table 101
Ve spolupráci s příkladem výše by tento řádek směroval spojení s počítačem 1.2.3.4
přes tabulku 101, tedy ISP1.
Pokud chcete zobrazit obsah konkrétní směrovací tabulky, můžete použít ip route
v následující syntaxi:
ip route show table 101 ip route show table 102
Mohu vám jen doporučit podívat se na kompletní syntax ip rule
do manuálových stránek, nebo si alespoň rychle zobrazit nápovědu:
ip rule help
Zjistíte, že můžete směrovat pakety i podle značek firewallu, dle TOS apod. Zjistíte také, že určité pakety můžete odmítat, a to jak na úrovni směrovacích tabulek (ip route
), tak na úrovni směrovacích pravidel (ip route
).
Maškaráda
V příkladu se dvěma ISP výše by nastal jeden „drobný“ problém – žádný z počítačů ve vnitřních sítích by se nedostal na internet. Důvodem je použití privátních rozsahů. Počítače ve vnitřní síti totiž nejsou díky nim přímo adresovatelné. V této situaci by bylo třeba zařídit, aby router prováděl SNAT, tedy překlad zdrojové adresy (opakem je DNAT, což je překlad cílové adresy). Konkrétně vám ukážu jeho variantu zvanou maškarádu. Ta spočívá v tom, že jádro nastaví zdrojovou adresu automaticky podle toho, jakou adresu počítač na daném rozhraní má. To má tu výhodu, že pro vytvoření tohoto pravidla nemusíte předem znát IP adresu, kterou bude mít router k dispozici (např. v situaci, kdy ISP přiděluje adresu routeru z DHCP serveru).
Maškaráda (stejně jako SNAT a DNAT) se dají nastavit přes Netfilter, tedy pomocí nástroje iptables
:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Snad nemusím dodávat, že všechno výše uvedené bude fungovat, pouze pokud bude v jádře povoleno předávání paketů (pokud nevíte, jak na to, mrkněte na poslední dva díly, kde je to popsáno). Pokud povoleno nebude, router nebude fungovat jako router a nebude pakety předávat.
Protokol IPv6 a nástroj ip
Víceméně všechny operace s nástrojem ip
, které jste zde viděli, můžete provádět i v rámci IPv6 protokolu. Nástroj ip
IPv6 adresy pozná a přizpůsobí se. Někdy se však hodí vědět, jak nástroji ip
explicitně říci, že má brát v úvahu konkrétní protokol, buď IPv4 nebo IPv6. K tomuto účelu slouží přepínače -4
a -6
:
ip -6 addr # IPv6 adresy všech rozhraní ip -6 route # IPv6 směrovací tabulka ip -4 addr # IPv4 adresy všech rozhraní ip -4 route # IPv4 směrovací tabulka
IPv6 přes IPv4
V datacentrech byste se neměli setkat s tím, že IPv6 připojení není k dispozici, i když raději onen podmiňovací způsob zdůrazňuji, jelikož do nedávna to ještě stále někde problém byl. Většinou se ale s absencí IPv6 konektivity setkáte spíše v domácích podmínkách než v datacentrech. Ideální je samozřejmě tlačit na ISP, aby vám poskytl nativní IPv6 konektivitu, to v každém případě. Ale do té doby, než se tak stane, můžete využít tunelování IPv6 protokolu přes IPv4 protokol.
K tomu samozřejmě potřebujete někoho, kdo IPv6 konektivitu poskytuje a kdo vám poskytne druhý konec tunelu, vaše IPv6 pakety vybalí z IPv4 paketů a pošle je přes IPv6 síť tam, kam mají odejít. Těchto subjektů je k dispozici celá řada, ideální je samozřejmě vybírat ten subjekt, který je vám fyzicky co nejblíže. Odkážu vás v této souvislosti na seznam na Wikipedii.
Pokud naleznete schopného „brokera“, dá vám k dispozici nejenom potřebné údaje k nastavení sítě, ale i sadu příkazů podle operačního systému a vy můžete použít oblíbenou metodu copy & paste do terminálu či do editoru. Konfigurace pomocí nástroje ip
může vypadat nějak takto:
ip tunnel add sestkovy-tunel mode sit remote 1.2.3.4 local 4.3.2.1 ttl 255 ip link set sestkovy-tunel up ip addr add 2001:db8::/32 dev sestkovy-tunel ip route add ::/0 dev sestkovy-tunel
První příkaz vytvoří tunel s názvem sestkovy-tunel
v módu sit
(což je IPv6-přes-IPv4 tunel). Zde je třeba zmínit dvě IP adresy, a sice adresu remote
, tedy adresu koncového bodu tunelu (to je IP adresa vašeho brokera), a adresu local
, tedy místní adresu vašeho počítače (tam tunel začíná). Druhý příkaz pak tunel „nahodí“, třetí tunel přidá vámi poskytnutý IPv6 rozsah a následuje nastavení cesty (routy).
Zpřístupnění IPv6 konektivity místní síti
Pokud chcete celé své domácí síti zpřístupnit IPv6 konektivitu, mělo by vám stačit nastavit router avdertisement démona, který bude ohlašovat potřebné údaje počítačům v síti, aby mohli provést autokonfiguraci.
Takovým démonem je například radvd
, jehož název může některé mírně zmást. Ne, ono DVD v názvu nemá s dévédéčky nic společného. Je to jen zkrácenina od router advertisement daemon.
Ale zpět k radvd
. Konfiguruje se v souboru /etc/radvd.conf
a příklad konfigurace může vypadat nějak takto:
interface eth1 { AdvSendAdvert on; prefix 2001:db8::/32 { AdvOnLink on; }; };
Je to skutečně velmi jednoduchý příklad, nejprve se specifikuje síťové rozhraní, na kterém se mají oznámení posílat, v tomto případě eth1
. Následuje blok s nastavením pro dané rozhraní. První volba v něm zapíná posílání samotných oznámení (tudíž musí být „on“), následuje specifikace prefixu pro danou síť a daný prefix je pak třeba také „povolit“ volbou AdvOnLink
. Následně démona nastartujte:
/etc/init.d/radvd start
Pokud se vše povedlo, měly by počítače v místní síti automaticky získat IPv6 adresu i routy.
Více informací o nastavení radvd
naleznete v manuálových stránkách:
man radvd.conf
Uložení nastavení pro přežití restartu
Pokud budete provádět nastavení sítě pomocí nástroje ip
, asi je vám jasné, že tato nastavení nepřečkají restart, jelikož se nikam neukládají. Totéž platí pro nastavení iptables
. Aby vaše nastavení přečkalo restart, je třeba ho někam uložit.
Jedním z míst pro ukládání různých procedur a nastavení, jež se mají vykonat po spuštění počítače, je skript /etc/rc.local
, který bude spuštěn na konci bootování. Pro nastavení sítě to ale není nejvhodnější umístění, jelikož konec bootování obvykle nastává dávno po aktivaci sítě a síťových rozhraní. Ideální by tedy bylo navázat nastavení sítě na „nahození“ příslušného síťového rozhraní. Toho je možné docílit pomocí direktivy up
v konfiguračním souboru /etc/network/interfaces
:
iface eth0 inet static address 1.2.3.4 netmask 255.255.255.0 gateway 4.3.2.1 up ip addr add 1.2.3.5/24 dev eth0 up ip addr add 1.2.3.6/24 dev eth0 up ip route add 5.6.7.8 via 8.7.6.5 up iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Můžete své nastavení vložit do skriptu a na něj se potom odkázat, nebo všechno napsat do /etc/network/interfaces
. Toto řešení je lepší, ale není úplně čisté – ideální by bylo přidat direktivy down
, které toto nastavení odčiní, aby se při shození a opětovném nahození rozhraní zbytečně nemnožily záznamy v tabulkách.
Závěr
Nástroj ip
a nastavení sítě by se dalo probírat ještě dlouho, nicméně tímto dílem bych toto téma, alespoň prozatím, ukončil.