Тестирование стека TCP/IP в пространстве пользователя с помощью TUN / TAP

Можно ли протестировать стек TCP с использованием интерфейсов TUN / TAP? Я думаю о таком механизме:

  +--------------------------------+
  |   TCP Client / Server          |
  |  socket(AF_INET, SOCK_STREAM)  |
  | e.g. HTTP Server / Client      |
  +----------+---------------------+
             |
             |  +---------------------+
             |  |  TUN Device         |
             |  | ( kernel does TCP ) |
             |  +---------------------+
             |                       
  +------------+----------------------+
  | Linux Kernel + Forwarding Magic   |
  +-----------------------------------+
            |
            | +---------------------+
            | |TAP Device           |
            | |Raw ethernet frames  |
            | +---------------------+
            |
 +----------+----------------------+
 |  Raw  Socket API                |
 | socket(AF_PACKET, SOCK_RAW)     |
 | User mode TCP Stack over raw API|
 | a HTTP client/server over it    |
 +---------------------------------+

Верхний блок - это, скажем, стандартный немодифицированный HTTP-сервер, прослушивающий IP-адрес, который был направлен на устройство TUN. Нижний блок представляет собой пользовательский стек TCP/IP, который работает с необработанными кадрами Ethernet.

Вопросы:

  1. Можно ли подключить два устройства TAP/TUN друг к другу, как это?
  2. Нужен ли здесь "мост"? Как еще они разговаривают друг с другом?
  3. И наконец: есть ли лучший способ сделать это?

Спасибо заранее.

PS: я собираюсь запустить их всех на одной машине. "Коробка" здесь больше похожа на процесс, набор или процессы.

1 ответ

Я не уверен, что это разумный дизайн. Это зависит от того, чего вы пытаетесь достичь.

Вы, конечно, можете отправлять трафик на устройство TUN в верхнем блоке... но тогда у вас должен быть какой-то процесс, который запускается на этом блоке для сбора трафика, поступающего через устройство TUN. Этот процесс может быть вашим действительным настраиваемым стеком TCP/IP или туннелем пакетов в нижний ящик. Я предполагаю, что вы хотите, чтобы это был туннель, поскольку вы хотите запустить свой собственный стек TCP/IP на другом компьютере (нижний блок). В этом случае вам даже может быть выгодно, чтобы рассматриваемое туннельное программное обеспечение на верхней панели было чем-то уже существующим, например OpenVPN.

Тем не менее, я предполагаю, что ваши потребности, скорее всего, будут удовлетворены за счет запуска стандартного стека TCP/IP без туннелей на верхнем блоке, а нижний блок действует как маршрутизатор, который маршрутизирует пакеты между реальным интерфейсом Ethernet (где пакеты приходят из верхнего ящика) и устройства TUN. А в конце пользовательского пространства устройства TUN находится ваш собственный стек TCP/IP.

Ни в том, ни в другом случае вам не потребуется использовать какие-либо необработанные сокеты или вообще какие-либо сокеты. В любом случае, ваши пользовательские стеки TCP/IP получают кадры из устройства TUN (возможно, туннелированные от tophost, возможно, непосредственно на bottomhost) и вставляют исходные кадры обратно в то же устройство TUN.

Другие вопросы по тегам