Zpět na domů

ICMP tunel v jádře Linux: enkapsulace TCP/UDP

Článek podrobně rozebírá implementaci ICMP tunelu v jádře Linux, enkapsulujícího TCP/UDP provoz v ICMP echo požadavcích. Jsou zváženy hooky Netfilter, práce se sk_buff, tasklety a injekce paketů do loopback.

Ponoření do jádra: jak se TCP/UDP skrývá v ICMP-échu
Advertisement 728x90

# 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.

Google AdInline article slot

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_buff voláním skb_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_buff s 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_csum a ip_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:

Google AdInline article slot
  • 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_hdr a __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.

Google AdInline article slot

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

Advertisement 728x90

Číst dál