Создать VPN через TCP соединение
Мне нужно создать виртуальную IP-сеть через TCP-соединение. Хостинг-система - Linux, с драйвером ядра TUN/TAP, довольно легко получать и повторно вводить IP-пакеты виртуальной сети.
Сложной частью является передача полученных IP-пакетов другому хосту. По некоторым нетехническим причинам я могу передавать пакеты только по протоколу TCP, но не по протоколу UDP. Передавать IP-пакеты по UDP легко, но с TCP это становится сложно, вот причина:
Протокол UDP не поддерживает повторную передачу / переупорядочение, как и IP. Таким образом, если один пакет UDP отправляется для каждого полученного виртуального IP-пакета, стек протокола TCP/IP ядра по-прежнему будет видеть потерю / дублирование / переупорядочение виртуального IP-пакета (это необходимо для правильной работы TCP/IP, если эти "функции") отсутствуют, скорость TCP-соединения в виртуальной сети пострадает). Если IP-пакеты передаются по TCP, все необходимые "функции" будут отсутствовать, если только они не будут смоделированы каким-либо образом.
Похоже, мне нужно подделать какое-то дублирование / потерю / переупорядочение пакетов в TCP-соединении или исправить стек протокола TCP/IP ядра. Оба варианта не легки.
Есть ли другое, более простое решение моей проблемы? или я просто пошел в совершенно неверном направлении? Я весь во внимании.
==== ОБНОВЛЕНИЕ ====
Я думаю об использовании необработанного IP-сокета (который мог бы легко избавиться от всех вещей, связанных с повторной передачей / переупорядочением TCP в физической сети, при этом используя пакеты TCP), для передачи полученных IP-пакетов виртуальной сети. Но на принимающем хосте, как я могу только получить интересующие меня пакеты и вернуть все остальные IP-пакеты в стек TCP/IP ядра?
1 ответ
Прежде всего, вы не хотите создавать VPN через TCP, потому что в конечном итоге вы получите tcp-over-tcp. Основная проблема заключается в том, что таймеры вашего внутреннего TCP и внешнего TCP могут существенно различаться, что отрицательно влияет на надежность сеанса TCP. Вы можете найти более длинное объяснение здесь.
Протокол UDP не поддерживает повторную передачу / переупорядочение, как и IP. Таким образом, если один пакет UDP отправляется для каждого полученного виртуального IP-пакета, стек протокола TCP/IP ядра по-прежнему будет видеть потерю / дублирование / переупорядочение виртуального IP-пакета (это необходимо для правильной работы TCP/IP, если эти "функции") отсутствуют, скорость TCP-соединения в виртуальной сети пострадает). Если IP-пакеты передаются по TCP, все необходимые "функции" будут отсутствовать, если только они не будут смоделированы каким-либо образом.
Это не имеет смысла, если ваш внешний уровень использует TCP в качестве транспортного механизма, ничто не мешает вашему внутреннему уровню по-прежнему использовать полный стек ip/tcp, включая эти функции. Они могут плохо конфликтовать, как я уже сказал, но дело не в том, что эта функция полностью исчезает или нарушается.
Кажется, что вы действительно хотите использовать TCP только для того, чтобы иметь заголовки и игнорировать реальный протокол, это действительно позволило бы избежать проблем с tcp over tcp. Однако, опять же, это очень плохая идея. Обработка потоков для брандмауэров, NAT, DPI, бустеров tcp становится все более распространенной, если вы фальсифицируете TCP-пакеты, то можете усилить нагрузку на эти блоки, возможно, снова повредив ваше собственное соединение.
Поэтому вы должны спросить себя, почему вы не можете использовать UDP, и если нет альтернативного протокола (заголовка), как GRE или L2TP.