Начнем с того, что мои познания в области сетевых технологий весьма ограничены, поэтому заранее прошу прощения, если использую неправильную терминологию.
Ситуация
Я пытаюсь создать прототип, который позволит клиентам взаимодействовать с локальным веб-сервером в другой сети. Веб-сервер размещен в той же сети, что и VPN-сервер. Пока что мне удается направить клиентский пакет (например, SYN) на виртуальный интерфейс (tun) и отправить весь пакет на VPN-сервер. На стороне сервера я получаю эти пакеты, меняю исходный и целевой IP-адреса и пересчитываю контрольные суммы внутри заголовков.
Повторим, поток выглядит следующим образом:
- Пользователь пытается получить доступ к веб-серверу с определенного IP-адреса.
- Пакет SYN отправляется на виртуальный интерфейс, поскольку он соответствует маршрутам в таблице маршрутизации.
- Приложение VPN-клиента отправляет пакет SYN на VPN-сервер через установленное соединение WebSocket (не имеет значения, какой тип соединения это).
- VPN-сервер получает пакет и изменяет IP-адрес источника/назначения, чтобы он указывал на фактический веб-сервер, размещенный в той же сети.
- Как мне отправить эти пакеты на веб-сервер и получить ответы от веб-сервера? Я хочу, чтобы клиент общался с веб-сервером через 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
, ваш сервер может сделать то же самое.