Об этом проекте

pktc — это CLI-инструмент и компилятор на основе укладки деревьев, позволяющий описать структуру пакета, ожидаемую в сети, и автоматически вывести соответствующую конфигурацию туннельных устройств ядра Linux. В отличие от netplan, systemd-networkd и NetworkManager, где сначала указывается тип устройства, а затем заполняются параметры, pktc действует наоборот: вы описываете стек инкапсуляции в виде дерева, а инструмент определяет, какое ядерное примитивное устройство его реализует. Основная идея — выбор инструкций путём укладки деревьев. Стек инкапсуляции уплощается до хребта — линейного списка уровней протоколов, который затем покрывается тайлами в форме устройств. Техника зеркально отражает то, как back-end компиляторов выбирает машинные инструкции, за исключением того, что тайлы — это туннельные устройства Linux, а выдаваемый код — команды iproute2. Поддерживаемые тайлы включают IPIP (ipv4 · ipv4), GRE (ipv4 · gre · ipv4), GRE tap (ipv4 · gre · ethernet) и VXLAN (ipv4 · udp · vxlan · ethernet). Вложенные туннели композируются естественно, как несколько тайлов, без специального кода. Ключевые команды: - pktc lower — выводит команды ip link / ip addr для создания устройства - pktc mirror — выводит симметричную конфигурацию для удалённого конца - pktc expect — выводит, как должен выглядеть трафик подложки для проверки - pktc parse — выводит инкапсуляционный хребет из файла описания Особенностью является тестовый режим замыкания контура: make netns создаёт два сетевых namespace на veth-паре, настраивает оба конца из одного описания, пропускает трафик и захватывает подложку. Золотой тест доказывает, что выдача команд верна; ядерный тест доказывает, что устройство создано; захват доказывает, что устройство несёт именно то, что утверждало дерево. Установка: go install github.com/vinodhalaharvi/pktc/cmd/pktc@latest либо сборка из исходников с помощью make check, make demo и make netns. Проект находится на ранней стадии, имеет четыре тайла и один backend. Geneve, VLAN, XFRM и WireGuard намеренно опущены, поскольку их модули ядра отсутствовали в период разработки.