Volitelné položky v záhlaví IP datagramu patří k zajímavostem protokolu IP. Jelikož jejich používání znamená potenciální bezpečnostní riziko, mnozí provozovatelé sítí datagramy s těmito položkami zahazují. Volitelné položky rozšiřují IP záhlaví. IP záhlaví má omezenou délku na 60 B a z toho je 20 B povinných. Volitelné položky jsou proto omezeny maximálně na 40 B.
V dnešní době jsou definovány tyto volitelné položky:
Já jsem se v projektu zabýval prvními čtyřmi volitelnými položkami. Volitelné položky jsou v datagramu uvedeny hned za povinnými položkami záhlaví. Obecný formát volitelných položek je následující: první byte je kód volitelné položky, podle kterého se pozná, o jakou volbu se jedná. Za kódem následuje délka volitelné položky (1 B), dále pak data volitelné položky, která se liší podle použité volby.
Pro tuto volbu se použije kód 0x07. Pokud je v IP záhlaví uvedena tato volitelná položka, pak všechny směrovače na cestě k cíli vyplní do záhlaví IP adresu výstupního rozhraní, na které posílá směrovaný datagram. Struktura volitelného záhlaví je znázorněna v následující tabulce.
Kód=0x07 1B |
Délka 1B |
Ukazatel 1B |
1. IP adresa 4B |
2. IP adresa 4B |
3. IP adresa 4B |
... | 9. IP adresa 4B |
Jednotlivé buňky pro IP adresy se nazývají sloty. Pole Ukazatel ukazuje na první volný slot. Každý směrovač do slotu, na který ukazuje ukazatel, zapíše adresu svého výstupního rozhraní a zvětší ukazatel o 4 byty. Z maximální délky volitelných položek v IP záhlaví vyplývá, že v záhlaví může být nejvíce devět slotů pro IP adresy. Ukázku datagramu s touto volitelnou položkou najdete níže.
Tato volba je podobná předchozí. Místo IP adresy se do zahlaví zapíše časové razítko směrovače v době, kdy datagram směrovačem procházel. Čas se zaznamenává v milisekundách od poslední půlnoci. Strukturu záhlaví můžeme vidět v následující tabulce.
Kód=0x44 1B |
Délka 1B |
Ukazatel 1B |
OF 4b |
FL 4b |
1. Časové razítko |
2. Časové razítko |
... | Časové razítko |
Oproti minulé volbě přibyl v záhlaví jeden byte rozdělený na dvě 4-bitové položky:
Jak to vypadá v praxi se můžete podívat níže.
Tato volba umožňuje explicitně zadat jakou cestou (přes které směrovače) má být IP datagram směrován. IP datagram je pak dopravován přes uvedené směrovače. Narozdíl od striktního explicitního směrování zde nemusí být vyjmenovány všechny směrovače na cestě. Struktura záhlaví je téměř stejná jako u volby zaznamenávej směrovače. Jediný rozdíl je v kódu položky. Záhlaví ukazuje následující tabulka.
Kód=0x83 1B |
Délka 1B |
Ukazatel 1B |
1. IP adresa 4B |
2. IP adresa 4B |
3. IP adresa 4B |
... | 9. IP adresa 4B |
Při takovém směrování se mění i adresa příjemce IP datagramu. Tyto manipulace s IP adresami jsou docela komplikované. Manipulace s IP adresami v záhlaví IP datagramu jsou naznačeny na obrázku 1. Směrovače musí měnit nejenom ukazatel na aktuální slot, ale také mění adresu příjemce IP datagramu a přehazuje jednotlivé sloty. Ve fázi, kdy datagram vytváří nějaký program, je jako adresa příjemce v hlavičce IP datagramu uvedena IP adresa cíle. Dále je ale vždy jako adresa příjemce uvedena adresa následujícího směrovače v pořadí, jak je uvedena ve slotech. Na odesílatelově stroji se adresa příjemce vloží do posledního slotu (ten se uvolnil po tom, co se ostatní sloty posunuly doleva a první se vložil jako adresa příjemce do záhlaví IP datagramu. Pole ukazatel ukazuje vždy na slot s adresou dalšího routeru. Ten vždy vymění adresu příjemce s adresou, na kterou ukazuje ukazatel.
Potenciální bezpečnostní riziko - toto je výhodné pro hackery a jiné záškodníky, kterým to umožňuje odklonit tok dat podle jejich potřeby na router, kde provoz nebude sledován nebo na němž budou data modifikovány. Dalším možným zneužitím je přímé adresování počítačů v intranetu, ve kterém nejsou veřejné IP adresy a není je možné adresovat z internetu. Na obrázku 2 je ukázáno jak se toto dá zneužít. Z internetu například firewall blokuje ping do intranetu. Pokud se však útočníkovi povede umístit do intranetu PC s komutovaným spojem přímo do internetu, může např. pomocí explicitního směrování (ping -j Notebook 10.0.0.10) obejít firewall a přistupovat i k počítačům z internetu nedostupných.
Názorná ukázka takového směrování je níže.
Striktní explicitní směrování je velice podobné předchozímu s tím rozdílem, že je nutné zadat všechny směrovače na cestě. Kód volitelné položky v záhlaví IP datagramu je 0x89h. Pokud nejsou uvedeny všechny směrovače postupně za sebou, nebo jsou uvedeny nesprávně, IP datagram nedorazí do cíle a jako odpověď přijde zpět ICMP zpráva Destination Unreachable (kód Source Route Failed) od routeru, který nemůže dále datagram odeslat, protože stroj s IP adresou v záhlaví datagramu nemá přímo připojen. Datagram se striktním explicitním směrováním je ukázán níže.
Při transportu datagramů se směrovače v internetu nezajímají o to, co je jejich obsahem, pokud nejsou určeny přímo jemu. Někdy je třeba směrovači nějak sdělit, že data obsažená v datagramu by pro něj mohla být užitečná (například datagramy směrovacích protokolů - ve většině implementacích směrovacích protokolů se ovšem tato volba nepoužívá). V takovém případě se použije další volitelná položka. Upozornění pro směrovač (IP Router Alert Option) je volba s kódem 0x94h. Jeho struktura je znázorněna v další tabulce.
Kód=0x94 1B |
Délka=4 1B |
Data=0 2B |
Datagram s touto volitelnou položkou je níže.
Nyní popíšu, na jaké síti jsem IP volby testoval a které věci bylo třeba nastavit.
Funkčnost IP voleb jsem testoval na směrovačích CISCO a na směrovačích s operačním systémem Linux. Na routerech jsem nastavil IP adresy a spustil na nich směrovací protokol RIP verze 1.
Na obrázku 3 je testovací zapojení na směrovačích CISCO:
Jsou tady zapojeny 3 CISCO routery 2501 a dva počítače. IP datagramy s volitelnými položkami záhlaví byly generovány na PC1 a cílovým počítačem bylo PC2.
Konfigurace a směrovací tabulky jednotlivých routerů:
Testovací zapojení sítě na linuxových routerech je na obrázku 4. Jelikož jsem měl k dispozici pouze tři počítače, bylo testovací zapojení trochu odlišné od zapojení se směrovači CISCO. Funkčnost testu IP voleb tím ovšem nebyla omezena.
Jsou tady 3 PC s operačním systémem linux (Slackware, jádro 2.6.10). Všechny počítače byly konfigurované jako routery pomocí softwaru Zebra. IP datagramy s volitelnými položkami záhlaví byly generovány na notebooku (N) a cílovým počítačem byl PC stolni (S). Konfigurace a směrovací tabulky jednotlivých routerů:
Pro generování datagramů s volbami v IP záhlaví jsem většinou použil příkaz ping. Pouze pro striktní explicitní směrování na linuxu jsem nezjistil, jak s příkazem ping vygenerovat odpovídající datagram. Na internetu jsem pak po chvíli hledání narazil na program sing. Sing umožňuje zasílání ICMP požadavků s velkým množstvím voleb. Jinak je podobný programu ping. Domovská adresa projektu sing je na www.sourceforge.net/projects/sing.
Zakázání explicitního směrování na windows jako směrovače se provede změnou hodnoty v registru:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DisableIPSourceRouting
Na linuxu jako routeru i jako stanice bylo nutné povolení explicitního směrování. Pokud toto nebylo povoleno,
program sing neposlal žádný datagram a na nutnost povolení i upozornil. Pokud explicitní směrování nebylo povoleno
na cílové stanici, tak na takový datagram tato stanice nereagovala ani zasláním Destination Unreachable.
Povolení se provede:
# echo 1 > /proc/sys/net/ipv4/conf/all/accept_source_route
Na CISCO routerech je ve výchozím nastavení explicitní směrování povoleno.
Zakázání se provede:
RouterD(config)# no ip source-route
Pro klientské stanice s linuxem je nutné explicitní směrování povolit. Na stanicích s Windows to není nutné, ve výchozím nastavením funguje volné i striktní explicitní směrování.
Nyní předvedu jednotlivé výsledky z konkrétních pokusů se zapojením s CISCO routery. Výsledky na linuxových routerech jsou na této stránce. Dále se vždy zmíním, jak daný datagram vygenerovat a uvedu odkaz na datagram s IP volbou zachycený Etherealem.
Datagram s touto IP volbou můžeme vygenerovat buď pingem Microsoftu s parametrem -r pocet_alokovanych_slotu, kde pocet_alokovanych_slotu je počet slotů alokovaných v hlavičce datagramu. Na linuxu je pro ping parametr -R bez udání počtu alokovaných slotů. Linux pak vygeneruje datagram s maximálním počtem (8) slotů. Výsledek linuxového pingu je na dalším výpisu. Jsou v něm uvedeny jak adresy zdrojového PC tak vždy adresy odchozích rozhraní routerů.
Ping z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):
# ping -R 192.168.3.2 PING 192.168.3.2 (192.168.3.2) 56(124) bytes of data. 64 bytes from 192.168.3.2: icmp_seq=1 ttl=62 time=41.8 ms RR: 192.168.4.2 192.168.5.2 192.168.3.1 192.168.3.2 (*) 192.168.3.2 192.168.5.1 192.168.4.1 192.168.4.2 64 bytes from 192.168.3.2: icmp_seq=2 ttl=62 time=41.5 ms (same route)
* - tady končí cesta k cíli. Do odpovědi (echo reply) se kopírují nasbírané adresy.
Etherealem jsem odchytil tyto datagramy:
Volbu record timestamps vygenerujeme v IP záhlaví pomocí pingu Microsoftu ( parametr -s pocet_alokovanych_slotu, počet počet alokovaných slotů musí být nejvýše 4 a vygeneruje se tak datagram se čtyřmi sloty pro dvojice adresa-čas) nebo pomocí linuxového pingu. U linuxového pingu se použije parametr -T a za ním se uvede typ časového razítka. Tyto typy mohou být tři:
Ukázka datagramu s volbou zaznamenávej čas a adresy je na stránce se zapojením linuxových routerů.
Na další ukázce je použita volba -T tsonly, která vygenerovala v záhlaví osm 4-bitových slotů pouze pro čas.
Ping z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):
# ping -T tsonly 192.168.3.2 PING 192.168.3.2 (192.168.3.2) 56(124) bytes of data. 64 bytes from 192.168.3.2: icmp_seq=1 ttl=62 time=42.9 ms TS: 60105008 absolute 2631222 absolute not-standard -154 not-standard -7166602 0 3 not-standard 191 not-standard 7166645 64 bytes from 192.168.3.2: icmp_seq=2 ttl=62 time=42.1 ms
Etherealem jsem odchytil tyto datagramy:
Pro správnou funkčnost explicitního směrování (loose source routing) je třeba toto povolit. Jak to udělat bylo popsáno výše. Pro generování datagramu s volbou explicitní směrování můžeme použít ping od Microsoftu (volba -j smerovac1 smerovac2 ... smerovac9). V linuxu není třeba zadávat u pingu žádný parametr, stačí pouze uvést seznam routerů oddělených mezerami, přes které se má směrovat. Já jsem použil program sing. Pro explicitní směrování stačí uvést jako parametr seznam routerů oddělených zavináčem.
Pro demonstraci jsem vybral takovou cestu, aby se lišila od cesty vypočtené směrovacím protokolem RIP. RIP by použil nejkratší cestu pro směrování (D-C), ale já jsem požadoval směrování přes routery D-E-C. Ukázka volného explicitního směrování je na následujícím výpisu:
SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):
# sing 192.168.1.2@192.168.3.2 SINGing to 192.168.1.2 (192.168.1.2): 16 data bytes 16 bytes from 192.168.3.2: seq=0 ttl=61 TOS=0 time=39.201 ms 16 bytes from 192.168.3.2: seq=1 ttl=61 TOS=0 time=38.250 ms
Etherealem jsem odchytil tyto datagramy:
Striktní explicitní směrování (strict source route) se na MS Windows vygeneruje pingem s parametrem -k smerovac1 smerovac2 ... smerovac9. Na linuxu se mi nepodařilo zjistit, jak s linuxovým pingem vygenerovat datagram se striktním explicitním směrováním. Proto jsem opět použil program sing. Jako parametr se uvede seznam routerů oddělených symbolem procento, jak je vidět níže.
Nejprve jsem neuvedl všechny routery na cestě, takže se vrátil datagram s odpovědí Destination unreachable od routeru, který neměl jako svého souseda router, který byl uveden jako další v pořadí. Tím pádem se na cílový počítač datagram ani nedostal. Taková ukázka je na dalším výpisu:
SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):
# sing 192.168.1.2%192.168.3.2 SINGing to 192.168.1.2 (192.168.1.2): 16 data bytes Ouch!! 192.168.1.2 sings --- 192.168.1.2 sing statistics --- 4 packets transmitted, 0 packets received, 100% packet loss
Etherealem jsem odchytil tyto datagramy:
Při druhém pokusu jsem už uvedl seznam všech routerů na cestě a pak se mi vrátila i odpověď od cílové stanice.
SING z 192.168.4.2 (PC1) na 192.168.3.2 (PC2):
# sing 192.168.4.1%192.168.1.2%192.168.2.1%192.168.3.2 SINGing to 192.168.4.1 (192.168.4.1): 16 data bytes 16 bytes from 192.168.3.2: seq=0 ttl=61 TOS=0 time=42.967 ms 16 bytes from 192.168.3.2: seq=1 ttl=61 TOS=0 time=42.719 ms
Etherealem jsem odchytil tyto datagramy:
Volbu IP Router Alert Option jsem odchytil, když se router přihlašoval do multicastové skupiny pro příjem RIPv2 updatu ve zprávě Membership Report protokolu IGMP.
Source: 192.168.0.2 (192.168.0.2) Destination: 224.0.0.22 (224.0.0.22) Options: (4 bytes) Router Alert: Every router examines packet Internet Group Management Protocol
Celý datagram k nahlédnutí je tady.
Volitelné položky IP záhlaví je možné používat téměř na všech síťových prvcích v internetu. Internetoví poskytovatelé ovšem na většině takových prvků z bezpečnostních důvodů tyto datagramy zahazují. Nebezpečné může být nejspíše pouze explicitní směrování, proto by bylo dobré, aby ostatní IP volby fungovaly kdekoliv v internetu.