Virtual Net Kernel Module 1.0.0
Модуль ядра Linux на C, который создаёт виртуальный сетевой интерфейс, позволяет задавать IPv4 через `procfs/sysctl` и отвечает на `ping`.
Загрузка...
Поиск...
Не найдено
Virtual Net Kernel Module

Documentation

Virtual Net Kernel Module (test assignment)

Проект выполнен в рамках тестового задания для компании НДМ Системы.

Тестовое задание: модуль ядра Linux на C, который создаёт виртуальный сетевой интерфейс, позволяет задавать IPv4 через procfs/sysctl и отвечает на ping.

Что реализовано

  • Модуль создаёт виртуальный интерфейс vnet0.
  • Регистрирует параметр ip_addr в procfs/sysctl:
    • путь: /proc/sys/net/vnet/ip_addr
    • формат: строка IPv4 (10.0.0.1 и т.д.)
  • На входящий ICMP Echo Request (ping) для адреса интерфейса модуль формирует Echo Reply.
  • Для работы добавлены цели в Makefile: сборка, загрузка, тест, логи, статус.

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

  • virtual_net.c, virtual_net.h — исходный код модуля.
  • Makefile — сборка/загрузка/тестовые команды.
  • .vscode/* — настройки Cursor/VS Code (задачи и IntelliSense).

Требования

  • Linux с заголовками текущего ядра (linux-headers-$(uname -r) или аналог).
  • gcc, make, kmod.
  • iproute2 (ip), ping.
  • Права sudo для загрузки/выгрузки модуля и настройки интерфейса.

Установка зависимостей (Debian/RHEL-family) через Makefile:

make init

Детали реализации и архитектура

Модуль реализует жизненный цикл init/exit через макросы module_init/module_exit.

  1. **Инициализация (virtual_net_init)**:
    • Регистрирует таблицу sysctl в /proc/sys/net/vnet/ip_addr.
    • Выделяет и инициализирует сетевое устройство vnet0 с помощью alloc_etherdev.
    • Регистрирует устройство в сетевом стеке ядра (register_netdev).
    • Переводит интерфейс в состояние UP.
    • Назначает IP-адрес по умолчанию через modify_vif_ip_userspace.
  2. **Обработка пакетов (vnet_xmit)**:
    • Это основная функция-коллбэк, зарегистрированная в net_device_ops.
    • Принимает пакет (sk_buff) и обрабатывает его в зависимости от протокола:
      • ARP Request: Проверяет, что запрос адресован текущему IP, и отправляет ARP Reply.
      • ICMP Echo Request (ping): Проверяет адрес назначения. Если совпадает с IP vnet0, создает копию пакета, меняет IP и тип ICMP на ECHO_REPLY, пересчитывает контрольные суммы и возвращает пакет в стек ядра (netif_rx).
    • Использует spinlock (vnet_ip_lock) для потокобезопасного доступа к строке IP-адреса.
  3. **Управление IP через procfs (vnet_sysctl_handler)**:
    • Обработчик sysctl реагирует на запись в /proc/sys/net/vnet/ip_addr.
    • Валидирует новый IP-адрес.
    • Удаляет старый IP-адрес с интерфейса.
    • Назначает новый IP-адрес.
    • Назначение выполняется через userspace утилиту ip для надежности и соответствия стандартным практикам.

Инструкции по сборке и запуску

Процесс сборки и запуска полностью автоматизирован через Makefile.

# 1) Установка зависимостей (один раз)
make init
# 2) Сборка модуля
make all
# или выполнение полного сценария теста
make test
# 3) Загрузка модуля
make load
# 4) Проверка функциональности
ping -c 4 10.0.0.1

Ключевые цели Makefile:

Команда

Назначение

make all

Компилирует модуль (vnet.ko)

make test

Рекомендуется: make all + make load + базовая настройка интерфейса

make load

Загружает модуль в ядро (sudo insmod)

make unload

Выгружает модуль из ядра (sudo rmmod)

make status

Показывает статус модуля, интерфейса и IP-адреса

Примеры использования

Изменение IP-адреса через <tt>procfs</tt>

# Просмотр текущего IP
$ cat /proc/sys/net/vnet/ip_addr
10.0.0.1
# Изменение IP-адреса
$ echo '10.0.0.100' | sudo tee /proc/sys/net/vnet/ip_addr
10.0.0.100
# Проверка нового IP
$ cat /proc/sys/net/vnet/ip_addr
10.0.0.100
# Проверка ответа на ping (должен работать)
$ ping -c 2 10.0.0.100
PING 10.0.0.100 (10.0.0.100) 56(84) bytes of data.
64 bytes from 10.0.0.100: icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from 10.0.0.100: icmp_seq=2 ttl=64 time=0.088 ms
--- 10.0.0.100 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1023ms

Использование команд отладки

# Проверка статуса модуля и интерфейса
$ make status
═══════════════════════════════════════════════════════════════════
СТАТУС МОДУЛЯ VNET
═══════════════════════════════════════════════════════════════════
✅ Модуль: ЗАГРУЖЕН
📊 Информация о модуле:
vnet 16384 0
🌐 Интерфейс vnet0: СУЩЕСТВУЕТ
4: vnet0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000
link/ether 86:55:28:8d:8a:56 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.100/24 scope global vnet0
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
1120 14 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1120 14 0 0 0 0
🔧 Sysctl настройки:
IP адрес: 10.0.0.100
═══════════════════════════════════════════════════════════════════
# Просмотр логов ядра в реальном времени
$ make watch
📡 Мониторинг логов ядра (Ctrl+C для выхода)...
[ 530.700000] VNET: IP изменён: 10.0.0.1 -> 10.0.0.100
[ 530.700001] VNET: старый IP-адрес удалён: 10.0.0.1
[ 530.700002] VNET: выполнение команды: /sbin/ip addr add 10.0.0.100/24 dev vnet0 2>/dev/null
[ 530.700003] VNET: IP-адрес интерфейса обновлён до 10.0.0.100
[ 534.500000] VNET: модуль выгружает virtual net dev. IP: 10.0.0.100, MAC: 86:55:28:8d:8a:56
[ 534.500001] VNET: модуль освобождает sysctl header
[ 534.500002] VNET: модуль выгружен

Процесс отладки и тестирования

Для диагностики проблем используйте следующие команды:

# Проверка, что модуль загружен
lsmod | grep vnet
# Проверка состояния и IP интерфейса
make status
# Просмотр логов ядра
make logs
# или в реальном времени
make watch
# Быстрый сценарий для тестирования
make test

Типичные проблемы и решения:

  • **Ping не работает**: Убедитесь, что интерфейс поднят (ip link set vnet0 up) и ему назначен правильный IP-адрес.
  • **Module already loaded**: Выполните make unload перед повторной загрузкой.
  • **Permission denied**: Большинство команд требуют прав sudo.

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

В проекте используется Doxygen для генерации API-документации на основе комментариев в коде.

  1. Генерация документации:

    bash make docs @section autotoc_md11 или doxygen Doxyfile

    Документация будет сгенерирована в директории ./docs/html.

  2. Просмотр документации:

    bash make docs-serve @section autotoc_md12 Документация доступна по адресу: http://127.0.0.1:8000

Документация включает описание всех функций, структур и макросов, используемых в проекте, что значительно упрощает понимание кода.

Настройка Cursor / VS Code

В проекте уже подготовлены:

  • .vscode/tasks.json — задачи make all, make clean, make compile_commands.
  • .vscode/c_cpp_properties.json — конфигурация C/C++ для модуля ядра.
  • .vscode/settings.json — подключение compile_commands.json.

Для корректной индексации C/C++:

make compile_commands

Удаление

make unload
make clean

Автор: Dmitry Chernikov

Этот модуль распространяется под лицензией MIT. Полный текст лицензии доступен в файле LICENSE.