Тестирование стека 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.
Вопросы:
- Можно ли подключить два устройства TAP/TUN друг к другу, как это?
- Нужен ли здесь "мост"? Как еще они разговаривают друг с другом?
- И наконец: есть ли лучший способ сделать это?
Спасибо заранее.
PS: я собираюсь запустить их всех на одной машине. "Коробка" здесь больше похожа на процесс, набор или процессы.
1 ответ
Я не уверен, что это разумный дизайн. Это зависит от того, чего вы пытаетесь достичь.
Вы, конечно, можете отправлять трафик на устройство TUN в верхнем блоке... но тогда у вас должен быть какой-то процесс, который запускается на этом блоке для сбора трафика, поступающего через устройство TUN. Этот процесс может быть вашим действительным настраиваемым стеком TCP/IP или туннелем пакетов в нижний ящик. Я предполагаю, что вы хотите, чтобы это был туннель, поскольку вы хотите запустить свой собственный стек TCP/IP на другом компьютере (нижний блок). В этом случае вам даже может быть выгодно, чтобы рассматриваемое туннельное программное обеспечение на верхней панели было чем-то уже существующим, например OpenVPN.
Тем не менее, я предполагаю, что ваши потребности, скорее всего, будут удовлетворены за счет запуска стандартного стека TCP/IP без туннелей на верхнем блоке, а нижний блок действует как маршрутизатор, который маршрутизирует пакеты между реальным интерфейсом Ethernet (где пакеты приходят из верхнего ящика) и устройства TUN. А в конце пользовательского пространства устройства TUN находится ваш собственный стек TCP/IP.
Ни в том, ни в другом случае вам не потребуется использовать какие-либо необработанные сокеты или вообще какие-либо сокеты. В любом случае, ваши пользовательские стеки TCP/IP получают кадры из устройства TUN (возможно, туннелированные от tophost, возможно, непосредственно на bottomhost) и вставляют исходные кадры обратно в то же устройство TUN.