Назад | Перейти на главную страницу

tun / tap работает на входящем или исходящем пакете?

Когда мы создаем виртуальный интерфейс tun, мы используем read и write для чтения и записи пакетов из / в сетевой стек. У меня вопрос, когда мы используем .read, мы действительно читаем исходящие пакеты (пакеты, которые создаются компьютерными приложениями для отправки в другую сеть) или входящие пакеты (пакеты, которые поступают на машину)?

Интерфейс tun / tap - это способ передачи пакетов между вашим приложением и сетевым стеком ядра.

Создайте интерфейс крана:

ip tuntap add dev tun101 mode tun
ip link set up dev tun101
ip a add 192.0.2.1/24 dev tun101

Пингуем какой-нибудь адрес из подсети, назначенной интерфейсу tun101.

ping 192.0.2.2

Что случилось?

  • Команда ping создает сокет, создает пакет эхо-запроса icmp и записывает его в сокет.
  • Ядро получает пакеты эхо-запроса icmp от ping через сокет, определяет маршрут для этих пакетов и передает пакет в драйвер tuntap.
  • Для сетевого стека эти пакеты исходят из локальной сети и исходят наружу.
  • Драйвер tuntap получает пакеты эхо-запроса icmp и отправляет их в ваше приложение.
  • Ваше приложение вызывает read функция и получает пакет эхо-запроса icmp в соответствующий буфер памяти.
  • Ваше приложение создает пакеты эхо-ответа icmp для полученных запросов.
  • Ваше приложение напишите эти ответы с write функция.
  • Драйвер tuntap получает пакеты от вашего приложения и передает их дальше в сетевой стек.
  • Для сетевого стека ядра эти пакеты поступают извне.
  • Стек ядра определяет эти пакеты как адресованные самому хосту и отправляет их в сокет, созданный с помощью команды ping.
  • Пинг считывает данные из сокета, вычисляет задержку и отображает полученный ответ.

Операция чтения в вашем приложении означает чтение пакетов, которые были отправлены в соответствующий tun интерфейс сетевым стеком ядра. Операция записи означает отправку пакетов из вашего приложения в сетевой стек ядра.