# Implementace ICMP tunelu v jádře Linuxu: enkapsulace TCP/UDP v echo požadavcích
ICMP tunel na úrovni jádra Linux umožňuje enkapsulovat TCP/UDP provoz uvnitř ICMP paketů typu Echo Request a obcházet standardní síťové filtry. Tento přístup je užitečný pro výzkum síťového zásobníku, testování zachytávání paketů a pochopení fungování Netfilteru. Článek rozebírá architekturu modulu jádra, který realizuje translační provoz prostřednictvím háčků NF_INET_POST_ROUTING a NF_INET_LOCAL_IN s využitím taskletů pro asynchronní odesílání.
Architektura ICMP tunelu v jádře Linuxu
Modul se skládá ze tří klíčových komponent: dvou Netfilter háčků a taskletu pro odesílání paketů. Háčk NF_INET_POST_ROUTING zachytává odchozí TCP/UDP pakety před jejich odesláním do sítě, převádí je na ICMP echo požadavky a předává řízení taskletu. Druhý háčk – NF_INET_LOCAL_IN – zachytává příchozí ICMP pakety, extrahuje původní provoz a směruje ho na loopback rozhraní pro doručení aplikacím. Tasklet zajišťuje odložené odesílání paketů prostřednictvím dev_queue_xmit a minimalizuje blokování v kontextu přerušení.
Registrace háčků probíhá s prioritou NF_IP_PRI_FIRST, aby se zajistila prvotní zpracování. To je klíčové, protože jakýkoli zásah jiných modulů před naším může narušit integritu enkapsulace nebo deenkapsulace. Pro správu paměti se používá sk_buff – základní struktura síťového zásobníku Linuxu, která vyžaduje pečlivé rezervování hlaviček a správné uvolnění prostřednictvím kfree_skb v případě chyb.
Podrobný rozbor output_hook a create_packet_output
Funkce output_hook se volá u každého odchozího paketu. Deleguje vytvoření ICMP obálky funkci create_packet_output, která:
- Zkontroluje, zda je protokol TCP nebo UDP – pokud ne, vrátí NULL a paket pokračuje v routování bez změn.
- Získá MAC adresu příjemce prostřednictvím
__ipv4_neigh_lookup, což je nutné pro vytvoření Ethernet hlavičky. - Linearizuje
sk_buffvolánímskb_linearize, protože další operace kopírování dat vyžadují souvislý buffer. - Určí typ transportního protokolu (0 pro UDP, 1 pro TCP), délku hlavičky a velikost užitečného obsahu.
- Alokuje nový
sk_buffs ohledem na rezervované místo pro hlavičky (LL_RESERVED_SPACE) a koncové údaje (needed_tailroom). - Postupně vytváří hlavičky: Ethernet, IPv4, ICMP, kopíruje transportní hlavičku a data do ICMP těla.
- Vypočítá kontrolní součty pro IP a ICMP pomocí
ip_fast_csumaip_compute_csum. - Vrátí hotový paket k odeslání.
Klíčový moment spočívá v použití pole icmp->un.echo.id pro přenos služebních informací o typu původního protokolu a identifikátoru toku. To umožňuje přijímající straně správně rekonstruovat původní paket bez dalších metadat mimo ICMP strukturu.
Zpracování příchozích paketů a loopback směrování
Na přijímající straně háčk input_hook analyzuje každý příchozí ICMP paket. Pokud odpovídá formátu tunelu (Echo Request s známým vzorem v poli ID), modul:
- Extrahuje transportní hlavičku a data z ICMP těla.
- Vytvoří nový
sk_buff, který simuluje příchozí TCP/UDP paket. - Nastaví cílové zařízení na loopback rozhraní (
dev_set_name(skb, "lo")). - Změní MAC adresy na localhost a zavolá
netif_rx_ni()pro injekci paketu do síťového zásobníku.
To donutí jádro zpracovat paket tak, jako by přišel zvenčí, ale přes rozhraní lo. Aplikace obdrží data bez změn, aniž by věděly o enkapsulaci. Důležité je, že zde není použito NF_STOLEN – paket není „ukradnut“, ale nahrazen, proto se po úspěšné injekci vrací NF_ACCEPT.
Kritické technické detaily a omezení
Implementace se potýká s řadou technických omezení:
- Fragmentace: ICMP pakety mohou být na trase fragmentovány, ale současná implementace fragmenty nezpracovává – předpokládá se MTU dostatečné pro úplnou enkapsulaci.
- Bezpečnost: Absence šifrování nebo autentizace činí tunel zranitelným vůči padělání a MITM útokům.
- Výkon: Každý paket vyžaduje alokaci nového
sk_buff, kopírování dat a výpočet kontrolních součtů – to vytváří zátěž na CPU. - IPv4-only: Modul nepodporuje IPv6, protože využívá
ip_hdra__ipv4_neigh_lookup. - Závislost na MAC: Vyžaduje ARP záznam pro cílovou IP, jinak je paket zahoden.
Navzdory omezením je projekt vynikající pro výuku: pokrývá práci s Netfilterem, správu paměti jádra, tvorbu síťových hlaviček a interakci mezi vrstvami OSI v reálném čase.
Co je důležité
- ICMP tunel enkapsuluje TCP/UDP do Echo požadavků, což umožňuje obcházet některé síťové filtry.
- Využívají se Netfilter háčky s maximální prioritou pro zachycení provozu před/po routování.
- Tasklety zajišťují asynchronní odesílání bez blokování kontextu přerušení.
- Na přijímací straně se pakety injekčují do loopback pro průhledné doručení aplikacím.
- Implementace je výuková – není určena pro produkci kvůli absenci bezpečnosti a zpracování fragmentů.
— Editorial Team
Zatím žádné komentáře.