Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
NetworkSandboxEngine — Детерминированная сетевая песочница для тестирования правил nftables. Использует эфемерные сетевые пространства имён Linux (netns) и Scapy для безопасной проверки логики межсетевого экрана. | Kitploit
Инструменты/GitHubGitHub/onyks-os/networksandboxengine
Оборонительные ИнструментыСниффинг и анализ пакетовСкриптинг и автоматизацияАудит конфигурацииСетевая безопасностьDevSecOps
GitHubonyks-os/networksandboxengine

NetworkSandboxEngine

Детерминированная сетевая песочница для тестирования правил nftables. Использует эфемерные сетевые пространства имён Linux (netns) и Scapy для безопасной проверки логики межсетевого экрана.

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
РепозиторийСайт
2522 ч 42 мин назадЕщё не проверено
Поделиться

Network Sandbox Engine (NSE)

Linux-движок для детерминированного тестирования межсетевого экрана nftables внутри изолированных сетевых пространств имён.

Linux Python CI Status Documentation PyPI

License

Зачем NSE? • Возможности • Требования • Установка • Быстрый старт • Как это работает • Структура проекта


Network Sandbox Engine Interface


Зачем NSE?

Тестирование наборов правил межсетевого экрана на работающей системе Linux сопряжено со значительными рисками: некорректные правила могут разорвать SSH-сессии управления, допустить утечку трафика в открытом виде во время тестирования или оставить осиротевшие таблицы межсетевого экрана активными на хосте.

Network Sandbox Engine (NSE) предоставляет безопасный воспроизводимый стенд для тестирования. Он создаёт эфемерные сетевые пространства имён Linux, соединяет пары виртуальных ethernet-интерфейсов, компилирует наборы правил nftables и внедряет синтетические пакеты уровня 2 и уровня 3 с помощью Scapy. Вся оценка происходит внутри пространства имён песочницы: состояние межсетевого экрана хоста никогда не изменяется.

Ключевые архитектурные свойства:

  • Нулевое изменение хоста: Наборы правил загружаются исключительно в эфемерные пространства имён песочницы (nse_<uuid>) и полностью удаляются при демонтаже.
  • Самопроверяющийся оракул: Каждый запуск внедряет канареечный пакет перед тестовыми пакетами и снова после них, и сообщает результат только если трассировка ядра для обоих была зафиксирована. См. Контракт оракула.
  • Двойной стек и топологии: Нативная поддержка трафика IPv4 и IPv6, а также многонэймспейсные топологии Gateway для проверки наборов правил маршрутизатора, NAT и пересылки.
  • Малая, проверяемая поверхность: Один пакет, без веб-сервера, без JavaScript. nse/ — это ~1150 операторов при 98% покрытии тестами.

Требуются права root

NSE создаёт сетевые пространства имён, загружает наборы правил nftables и читает события трассировки ядра, поэтому работает от имени root. Он не открывает сокет, порт или RPC-эндпоинт какого-либо рода — это библиотека и CLI, которые вы вызываете, и он обладает привилегиями только на время выполнения.

Версия 2.1.0 удалила веб-интерфейс на FastAPI/Svelte, который поставлялся в более ранних релизах. Этот интерфейс работал внутри процесса от имени root начиная с версии 2.0.0, что представляло собой большую поверхность атаки для инструмента тестирования; код остаётся в истории git под тегом v2.0.0, если он вам нужен.


Контракт оракула

Тест межсетевого экрана — это отрицательное утверждение — «этот пакет не прошёл» — а отрицательное утверждение ничего не стоит, если не известно, что инструмент работает. Монитор трассировки, который так и не подключился к ядру, и межсетевой экран, который заблокировал всё, дают побайтово идентичный вывод.

Поэтому NSE отказывается сообщать вердикт, который он не может показать, что измерил:

ГарантияМеханизм
Монитор был подключён до первого тестового пакетаКанарейка готовности внедряется и повторно внедряется до тех пор, пока не будет зафиксирована её трассировка ядра. Нет наблюдения — нет запуска.
Монитор был всё ещё подключён после последнегоКанарейка живости запускается после внедрения. Если она пропущена, поток вердиктов объявляется усечённым.
Парсер понял то, что сказало ядроСтроки трассировки, не совпавшие ни с одним шаблоном, подсчитываются, и любое значение больше нуля является ошибкой, а не отладочным логом.
Монитор не умер тихоЦикл чтения записывает почему он завершился — чистая остановка, неожиданный EOF, тайм-аут или сбой — и только чистая остановка приемлема.
Отсутствующий вердикт — это не прохождениеCLI-раннер завершается с ошибкой, когда число наблюдаемых вердиктов отличается от ожидаемого, в любую сторону.

Канареечные пакеты исключаются из результатов по trace id, поэтому они никогда не появляются в вашем потоке вердиктов.

Набор тестов доказывает, что это выполняется, а не утверждает это: make test-blind заставляет парсер не понимать ничего, и сборка завершается с ошибкой, если раннер не выходит с ненулевым кодом. Эта задача запускается в CI при каждом push.


Возможности

  • Внутрипроцессный движок: Прямой Python API (run_test_pipeline), возвращающий структурированные модели Pydantic (TestRequest, TraceEvent).
  • Внедрение пакетов Scapy: Формирование произвольных пакетов TCP (с настраиваемыми флагами SYN, ACK, FIN, RST), UDP, ICMP и ICMPv6.
  • Изолированные топологии:
    • Simple: Единое пространство имён песочницы (nse_<id>), подключённое напрямую к хосту.
    • Gateway: Цепочка маршрутизатора (nse_router_<id>) и сервера (nse_server_<id>) для тестирования пересылки и NAT.
  • Автоматическая очистка: Стартовые проверки обнаруживают и удаляют оставшиеся пространства имён и пары veth от предыдущих прерванных запусков. Демонтаж включает повторные попытки с экспоненциальной задержкой.
  • CLI-раннер YAML-тестов: Выполнение декларативных наборов тестов YAML для автоматизированных конвейеров CI/CD (nse-runner). Завершается с ненулевым кодом при неверном вердикте и при вердикте, который не удалось наблюдать.
  • Строгие стандарты качества: Полная статическая проверка типов (mypy --strict), контроль архитектурных границ (import-linter), форматирование ruff и храповик покрытия (make test-cov, порог 98%).

Требования

  • ОС Linux (ядро 5.4 или новее с поддержкой сетевых пространств имён и nftables)
  • Python 3.10+
  • nftables (nft)
  • iproute2 (ip)
  • Привилегии root (требуются для ip netns и операций трассировки ядра)

В системах Debian или Ubuntu:

root@kitploit:~
sudo apt update && sudo apt install -y nftables iproute2 conntrack

Установка

1. Пакет PyPI (рекомендуется)

Установите основной движок с поддержкой CLI:

root@kitploit:~
pip install "network-sandbox-engine[cli]"

2. Ручная установка из исходников

Для локальной разработки:

root@kitploit:~
git clone https://github.com/onyks-os/NetworkSandboxEngine.git
cd NetworkSandboxEngine
make setup

Быстрый старт

1. Библиотека Python без интерфейса

root@kitploit:~
import asyncio
from nse.core.netns_controller import NetnsController
from nse.core.pipeline import run_test_pipeline
from nse.models.test_request import TestRequest, PacketSpec

rules = """
table ip filter {
    chain input {
        type filter hook input priority 0; policy drop;
        tcp dport 80 accept
    }
}
"""

request = TestRequest(
    rules=rules,
    packets=[
        PacketSpec(protocol="tcp", src_ip="10.0.0.1", dst_ip="10.0.0.2", dst_port=80),
        PacketSpec(protocol="tcp", src_ip="10.0.0.1", dst_ip="10.0.0.2", dst_port=22),
    ],
)


async def main():
    controller = NetnsController()
    events = await run_test_pipeline(request=request, controller=controller)
    for evt in events:
        if evt.verdict:
            print(f"[{evt.chain}] Verdict: {evt.verdict}")


asyncio.run(main())

2. Раннер наборов тестов YAML (CLI)

Создайте файл теста firewall_test.yaml:

root@kitploit:~
tests:
  - name: "Allow HTTP Port 80, Drop SSH Port 22"
    topology: simple
    rules: |
      table ip filter {
        chain input {
          type filter hook input priority 0; policy drop;
          tcp dport 80 accept
        }
      }
    packets:
      - protocol: tcp
        src_ip: 10.0.0.1
        dst_ip: 10.0.0.2
        dst_port: 80
        expected_verdict: ACCEPT
      - protocol: tcp
        src_ip: 10.0.0.1
        dst_ip: 10.0.0.2
        dst_port: 22
        expected_verdict: DROP

expected_verdict задаётся для каждого пакета. Неизвестные ключи отклоняются, а не принимаются по умолчанию, поэтому опечатка приводит к провалу набора тестов, а не тихо превращается в ожидание, которое вы никогда не писали.

Запустите набор тестов с привилегиями root:

root@kitploit:~
sudo nse-runner --file firewall_test.yaml

Коды выхода: 0 — все пакеты совпали; 1 — вердикт был неверным или движок не смог его наблюдать. Ошибки оракула сообщаются отдельно от сбоев межсетевого экрана, потому что они означают, что сломалось измерение, а не набор правил.

3. В контейнере

root@kitploit:~
podman build -t nse .
podman run --rm --cap-add=NET_ADMIN --cap-add=NET_RAW \
    -v "$PWD/firewall_test.yaml:/suite.yaml:ro" nse --file /suite.yaml

Полезно для фиксации версии nftables, против которой тестируются ваши правила.


Как это работает

NSE оркестрирует сетевые подсистемы ядра Linux и интерфейсы трассировки через структурированный многоэтапный конвейер выполнения:

root@kitploit:~
graph TD
    subgraph Step1["1. Test Specification"]
        Req["<b>TestRequest</b><br/>ruleset + packets + topology"]
    end

    subgraph Step2["2. Ephemeral Netns Sandbox"]
        direction TB
        Netns["<b>Netns Setup</b><br/>nse_&lt;id&gt; & veth links"]
        RuleEng["<b>Rule Engine</b><br/>validate & load nftables"]
        Inject["<b>Scapy Injector</b><br/>L2/L3 packet injection"]
        NFT["<b>Kernel nftables</b><br/>meta nftrace set 1"]

        Netns --> RuleEng
        RuleEng --> Inject
        Inject --> NFT
    end

    subgraph Step3["3. Trace Evaluation & Oracle"]
        direction TB
        Harvester["<b>Trace Harvester</b><br/>nft monitor trace stream"]
        Oracle["<b>Deterministic Oracle</b><br/>TraceEvents & verdicts"]

        Harvester --> Oracle
    end

    Step1 --> Step2
    Step2 --> Step3
  1. Проверка набора правил: RuleEngine.validate() выполняет пробный запуск набора правил с помощью nft --check -f.
  2. Подготовка песочницы: NetnsController создаёт изолированное сетевое пространство имён и настраивает интерфейсы виртуального ethernet (veth).
  3. Инициализация трассировки: Наборы правил загружаются в пространство имён с включённой трассировкой ядра (meta nftrace set 1).
  4. Внедрение пакетов: ScapyInjector внедряет синтетические кадры через veth-соединение.
  5. Сбор вердиктов: TraceHarvester захватывает события nft monitor trace и возвращает структурированные объекты TraceEvent.
  6. Демонтаж: Пространство имён и все связанные интерфейсы veth автоматически удаляются.

Полные технические спецификации см. в Руководстве по технической архитектуре.


Структура проекта

root@kitploit:~
NetworkSandboxEngine/
├── nse/                        # Core PyPI package (network-sandbox-engine)
│   ├── core/                   # Kernel primitives, pipeline, and naming rules
│   ├── models/                 # Pydantic models (TestRequest, PacketSpec, TraceEvent)
│   └── cli/                    # Headless YAML runner entrypoint
├── docs/                       # Architecture specs and MkDocs web documentation
├── tests/                      # Unit, golden file, and privileged e2e tests
│   └── fixtures/nft_trace/     # Golden `nft monitor trace` corpus
├── pyproject.toml              # Build backend configuration
└── Makefile                    # Local automation and CI workflow

Выпуск релизов

Один тег. git push origin vX.Y.Z собирает, подписывает с помощью Sigstore, публикует GitHub Release, загружает в TestPyPI, устанавливает из TestPyPI и выполняет дымовой тест, и только затем загружает в PyPI. Отрепетируйте с помощью make release-dry.

См. docs/RELEASING.md.

Документация

Полная интерактивная веб-документация доступна по адресу:
https://onyks-os.github.io/nse/

Соберите документацию локально:

root@kitploit:~
make docs

Запустите документацию с горячей перезагрузкой на http://127.0.0.1:8000:

root@kitploit:~
make docs-serve

Тестирование и локальный CI

Запустите статический линтинг и модульные тесты:

root@kitploit:~
make verify

Запустите полную локальную проверку CI (включает линтинг, модульные тесты, сборку фронтенда, сборку документации, дымовой тест PyPI и привилегированные интеграционные тесты):

root@kitploit:~
make ci-local

Лицензия

Этот проект лицензирован под MIT License.

Скачать инструмент