Как маршрутизируются пакеты в user-space vpn сервере

Как в user-space vpn сервере происходит маршрутизация пакетов между клиентами. Грубо говоря к серверу подключилось 2 клиента, являющиеся роутерами, оба клиента перенаправили на сервер ping 10.0.0.1 из 192.168.1.100, на сервер прилетел ответ, как понять какому клиенту перенаправить данный ответ.


Ответы (2 шт):

Автор решения: eri

Например Опенвпн смотрит в внутреннюю таблицу iroute, если там ничего не находит - выкидывает пакет в tun где он маршрутизируется в кернелспейсе.

→ Ссылка
Автор решения: Pak Uula

Есть два семейства технологий VPN. Они совершенно различны, их объединяют только три буквы в названии.

VPN-IPsec

Строго говоря, именно этот куст технологий стоит называть ВиПиЭном. В рамках этой технологии каждый клиент получает на VPN-концентраторе персональный сетевой адрес из внутренней сети. Именно по этому адресу VPN концентратор определяет, кому пересылать пакеты.

Пример

Внешний адрес концентратора 123.123.123.1, внутренний 10.10.1.2/24, для клиентов выделен диапазон 10.10.1.128 - 10.10.1.254, гейтвей во внешний мир 10.10.1.1.

Подключается клиент "Алиса". Концентратор смотрит в свою табличку клиентов и находит первый незанятый IP адрес. Скажем, 10.10.1.129. Сообщает его Алисе. У "Алисы" будет создан виртуальный интерфейс с адресом 10.10.1.129. Весь трафик, который Алиса будет отправлять через этот интерфейс, будет упаковываться в тоннель (IP over UDP, IP over TCP или IP over IP, конкретная технология не важна), перепаковываться на концентраторе в IP пакеты с исходящим адресом 10.10.1.129 и отсылаться во внутреннюю сеть. Если этот трафик направляется во внешнюю сеть, то концентратор будет отсылать его гейтвею в соответствии с правилами маршрутизации. Абсолютно все узлы, с которыми взаимодействует Алиса, будут уверены, что её адрес 10.10.1.129, и будут отсылать пакеты именно на этот адрес. Даже если они приходят извне сети - гейтвей будет адресовать эти пакеты VPN концентратору, так как во внутренней сети именно концентратор будет отвечать на APR запросы "какому Ethernet адресу соответствует IP адрес 10.10.1.129?". Получив IP пакет с адресом назначения 10.10.1.129 концентратор, посмотрев в свою табличку клиентов, перешлёт этот пакет по тоннелю Алисе, где она получит его через виртуальный интерфейс.

Если в это время к VPN подключится Боб, то концентратор выдаст ему следующий свободный адрес, например 10.10.1.130. Весь трафик Боба будет помечен этим адресом и не будет смешиваться с трафиком Алисы.

Даже если Боб и Алиса сами являются роутерами, концентратору VPN это не важно. Алиса и Боб на своей стороне разбираются, как они перепаковывают трафик своих клиентов. Например, они могут использовать NAT, и TCP/UDP трафик клиентов будут различать по номерам портов, а ping-и по полю Identifier заголовка ICMP Echo. Концентратор распознаёт их исходящий трафик по тоннелю, а входящий трафик по адресу в IP заголовке.

VPN-NAT

Яркий представитель - OpenVPN. В этой технологии никаких адресов никто не выделяет. Сервер выступает обыкновенным NAT-гейтвеем, который умеет перепаковывать TCP и UDP трафик клиентов, разводя их по различным сокетам. Основное отличие от простых NAT гейтвеев - клиенты подключаются по зашифрованному каналу.

Помимо TCP и UDP такие сервера могут поддерживать и другие протоколы, но только если об этом позаботились разработчики. Например, ping. Либо клиент умеет передавать по каналу служебное сообщение "пользовать хочет пингануть адрес 8.8.8.8" либо сервер разбирает IP пакеты, полученные от клиента по тоннелю и отбрасывает все пакеты, не несущие TCP/UDP/ICMP.

В заголовке Echo есть поле Identifier. Сервер запоминает, кому из клиентов какое значение этого поля назначил и пересылает ответы в соответствии с этим полем.

Преимущество этого "ВиПиЭна" - сервер может поддрживать любое количество клиентов.

Недостатки:

  1. Нельзя так просто прокинуть порты. Сервер должен поддерживать специальный протокол, по которому клиент сообщает серверу о желании принимать входящий трафик на какой-то адрес. Соответственно, на сервере должна быть настроена политика, какому клиенту какие порты открыть можно.

  2. Можно использовать только TCP и UDP. Для 99.99% пользователей этого достаточно, а всякие гики, которым подавай SRTP и прочие извращения, пусть ищут обходные пути.

→ Ссылка