Как VPN-серверы обрабатывают пакеты, полученные от VPN-клиента?

Как VPN-серверы обрабатывают пакеты, полученные от VPN-клиента?

Начнем с того, что мои познания в области сетевых технологий весьма ограничены, поэтому заранее прошу прощения, если использую неправильную терминологию.

Ситуация

Я пытаюсь создать прототип, который позволит клиентам взаимодействовать с локальным веб-сервером в другой сети. Веб-сервер размещен в той же сети, что и VPN-сервер. Пока что мне удается направить клиентский пакет (например, SYN) на виртуальный интерфейс (tun) и отправить весь пакет на VPN-сервер. На стороне сервера я получаю эти пакеты, меняю исходный и целевой IP-адреса и пересчитываю контрольные суммы внутри заголовков.

Повторим, поток выглядит следующим образом:

  1. Пользователь пытается получить доступ к веб-серверу с определенного IP-адреса.
  2. Пакет SYN отправляется на виртуальный интерфейс, поскольку он соответствует маршрутам в таблице маршрутизации.
  3. Приложение VPN-клиента отправляет пакет SYN на VPN-сервер через установленное соединение WebSocket (не имеет значения, какой тип соединения это).
  4. VPN-сервер получает пакет и изменяет IP-адрес источника/назначения, чтобы он указывал на фактический веб-сервер, размещенный в той же сети.
  5. Как мне отправить эти пакеты на веб-сервер и получить ответы от веб-сервера? Я хочу, чтобы клиент общался с веб-сервером через VPN-сервер / установленное соединение веб-сокета. Какие у меня есть варианты?

Вопрос

Как я могу отправить эти пакеты на веб-сервер и получить пакеты обратно с веб-сервера для отправки обратно клиенту? Мне «внедрить» пакеты в правильный интерфейс и убедиться, что мое приложение отправляет ответы обратно клиенту? Я хочу, чтобы клиент общался с веб-сервером через VPN-сервер / установленное соединение веб-сокета. Какие у меня есть варианты и, в общем, как это делают современные VPN-серверы?

Что я пробовал

Что я пытался сделать на стороне сервера, так это создать виртуальный интерфейс (tun) и записать пакеты, полученные от клиента, в интерфейс. Однако эти пакеты не отправляются на веб-сервер. Клиент и сервер работают на macOS с использованием Network Extensions, если это имеет какое-либо значение. Веб-сервер работает на 192.168.1.95, и я изменил исходный IP пакета на 100.64.0.77перед записью в tunинтерфейс.

Routing tables

Internet:
Destination        Gateway            Flags        Netif Expire
default            192.168.1.254      UGSc           en0       
default            link#10            UCSI         utun2       
100.64.0.77        100.64.0.77        UH           utun2       
127                127.0.0.1          UCS            lo0       
127.0.0.1          127.0.0.1          UH             lo0       
169.254            link#7             UCS            en0      !
192.168.1          link#7             UCS            en0      !
192.168.1          link#10            UCSI         utun2       
192.168.1.92/32    link#7             UCS            en0      !
192.168.1.99       8c:a9:82:2e:d6:2e  UHLWI          en0    986
192.168.1.254/32   link#7             UCS            en0      !
192.168.1.254      70:f1:96:86:e6:a0  UHLWIir        en0   1196
224.0.0/4          link#7             UmCS           en0      !
224.0.0/4          link#10            UmCSI        utun2       
224.0.0.251        1:0:5e:0:0:fb      UHmLWI         en0       
255.255.255.255/32 link#7             UCS            en0      !
255.255.255.255/32 link#10            UCSI         utun2   

`

решение1

VPN-сервер получает пакет и изменяет IP-адрес источника/назначения, чтобы он указывал на фактический веб-сервер, размещенный в той же сети.

Это никогда не понадобится, поскольку клиент уже указал нужный ему IP-адрес назначения. (VPNинкапсулировать(исходный пакет внутри другого IP-пакета, не изменяя исходный заголовок IP, поэтому серверу нужно только снова декапсулировать его и переслать исходный пакет точно так же, как он был.)

NAT можно сделать (и иногда это делается), но чаще всего это работа брандмауэра ОС и решение системного администратора – это не должно делаться программным обеспечением VPN самостоятельно. И в целом, коммуникации внутри внутренней сети не должнынуждатьсяNAT; его использование часто является признаком того, что элементарная маршрутизация вашей сети настроена неправильно.

Как мне отправить эти пакеты на веб-сервер и получить ответы от веб-сервера? Я хочу, чтобы клиент общался с веб-сервером через VPN-сервер / установленное соединение веб-сокета. Какие у меня есть варианты?

Обычно VPN-сервер будет иметь виртуальный интерфейс, точно такой же, как VPN-клиент, и будет использовать точно такие же механизмы для создания и получения пакетов. (Некоторые будут создавать выделенные виртуальные интерфейсы для каждого клиента, другие будут иметь один интерфейс для всех клиентов.) Если ваш клиент использует интерфейс tun, ваш сервер может сделать то же самое.

Связанный контент