Назад | Перейти на главную страницу

Конфигурация OpenVPN «IP-Passthrough»

Я хочу создать конфигурацию VPN, которая позволяет клиенту сервера OpenVPN использовать общедоступный IP-адрес сервера, как если бы это был его собственный IP-адрес, подключенный к IP.

Вот схема сети прямо сейчас:

                                     +---------------------------------------------------+
                                     |  Server machine (Linux)                           |
                                     |                                                   |
                                     |                                                   |
                                     |                                                   |
                    Data center----->O<--eth0-----------+                                |
                                     |  |79.102.91.184  |                                |
                                     |  |67.248.62.166  |                                |
                                     |  |94.187.137.76  |                                |
                                     |  |189.180.86.216 |                                |
                                     |  |219.167.189.118|                                |
                                     |  +---------------+                                |
                                     |                                                   |
                                     +---------------------------------------------------+

          +------------------------------------------+       +---------------------------+
          |  Router with NAT                         |       |  Client machine (Linux)   |
          |                  NAT                     |       |                           |
          |               +--------+                 |       |                           |
DSL to    |               |        |                 |  LAN  |                           |
Internet->O<---eth0-------+-+    +-+---------eth1-+->O<----->O<---eth0----------------+  |
          |  |24.174.216.166|    |192.168.2.1/24  |  |       |  |192.168.2.10/24      |  |
          |  |              |    |                |  |       |  |Router 192.168.2.1   |  |
          |  |              |    |                |  |       |  |                     |  |
          |  +--------------+    +----------------+  |       |  +---------------------+  |
          |                                          |       |                           |
          +------------------------------------------+       +---------------------------+

Я хочу настроить сервер OpenVPN на сервере. Затем клиент должен иметь возможность подключиться к этой VPN через Интернет, например, подключившись к 79.102.91.184 (первый IP-адрес сервера.)

На клиентском компьютере должен быть создан адаптер tap или tun, которому назначен и правильно маршрутизирован один из других публично маршрутизируемых IP-адресов сервера. Например, теперь клиент может общаться с Интернетом, используя IP-адрес. 67.248.62.166 (и сервер больше не может быть доступен под этим IP).

Как я могу настроить OpenVPN таким образом, чтобы сделать возможным такой сценарий маршрутизации?

Хотя это может не ответить на ваш вопрос, я думаю, что это лучшее, что вы можете найти. Он работает так, как вы ожидаете, но с одной стороны: у клиента не будет «внешнего» IP-адреса, поскольку он должен находиться на сервере.

Также обратите внимание, что VPN должны работать не так.

В любом случае, вот что вам нужно сделать. Я предполагаю, что у вашего VPN-сервера есть несколько IP-адресов, один из которых зарезервирован для самой VPN. Остальные должны быть сопоставлены с клиентами, поэтому подключенный клиент будет рассматриваться как этот внешний IP-адрес.

  1. Убедитесь, что у всех клиентов есть статически назначенный адрес.
  2. Трафик SNAT с этого IP-адреса выглядит как исходящий из «внешнего» интерфейса.
  3. Трафик DNAT, указывающий на внешний интерфейс к туннелю VPN

Убедитесь, что у всех клиентов есть статический адрес

Для этого добавьте следующие строки в файл конфигурации openvpn на стороне сервера:

client-config-dir clientConfig
ccd-exclusive

Создать clientConfig каталог в /etc/openvpn/ каталог. Это будет содержать файлы конфигурации для каждого клиента. В ccd-exclusive опция приведет к отказу клиентов, если у них нет соответствующей конфигурации клиента в каталоге, указанном client-config-dir. Поскольку ваша настройка зависит от точного сопоставления внешних IP-адресов и IP-адресов VPN, у каждого клиента должна быть собственная конфигурация.

iВ каталоге конфигурации клиента создайте файл, названный как общее имя клиента, то есть поле CN сертификата или имя пользователя, в зависимости от используемого вами метода аутентификации. Файл должен содержать простую отправку IP-адреса, например:

ifconfig-push 192.168.0.5 192.168.0.6

Обратите внимание, что каждый клиент должен иметь свою собственную сеть / 30, из которой назначены два IP-адреса, и сети не должны перекрываться.

Добавить redirect-gateway в файл конфигурации на стороне клиента, чтобы заменить шлюз по умолчанию, например:

redirect-gateway def1

После этого у клиента должен быть один и тот же IP-адрес независимо от того, когда он подключается, и его шлюз по умолчанию будет перезаписан после подключения.

Настройка SNAT

Для каждого клиента правило SNAT должно быть настроено следующим образом:

iptables -t nat -I POSTROUTING -o <device> \
    -s <client_ip> -j SNAT --to <out_ip>

где:

  • <device> это исходящее устройство (в вашем случае eth0)
  • <client_ip> это IP-адрес, который вы установили для клиента на предыдущем шаге (в приведенном выше примере 192.168.0.5)
  • <out_ip> это IP-адрес, который видят серверы, к которым подключаются клиенты (например, 67.248.62.166 один такой IP в вашем примере)

Кроме того, не забудьте установить для IP-переадресации значение true (echo 1 >/proc/sys/net/ipv4/ip_forward).

Настройка DNAT

Для каждого клиента вы должны выполнить такую ​​команду:

iptables -t nat -A PREROUTING \
    -i <device> -d <out_ip> -j DNAT --to <client_ip>

В <device>, <out_ip> и <client_ip> параметры такие же, как указано выше.

В iptables Команды, описанные выше, могут быть выполнены, если соединение неактивно (фактически, сервер openvpn не должен работать).

Что упущено

Таким образом, соединение работает в обоих направлениях: из Интернета доступен внешний IP-адрес, и каждый трафик (как TCP, так и UDP) будет вслепую переадресован клиенту. Если клиент инициирует соединение, оно будет считаться исходящим с указанного IP-адреса VPN-сервера.

Это почти то, что вы хотели.

Одно не сработает: клиент не сможет захватить внешний интерфейс. Фактически, клиент даже не узнает внешний IP-адрес. То есть вы не сможете привязать (например) 189.180.86.216. Однако вы сможете использовать 0.0.0.0, и таким образом клиент будет доступен через «внешний» IP-адрес.

Также обратите внимание, что вам необходимо назначить IP-адрес для VPN-сервера. По очевидным причинам этот адрес нельзя использовать для пересылки каждого трафика любому из клиентов.

Точное поведение, которого вы хотели бы достичь, кажется невозможным. С VPN в TUNнель В этом режиме вы всегда будете получать внутренний IP-адрес VPN и будете находиться за NAT по отношению к Интернету. Хотя кажется, что весь ваш трафик исходит от IP-адреса на другой стороне, он по-прежнему используется другими пользователями VPN и не предоставляет клиентский компьютер напрямую в Интернет с этим IP-адресом.

OpenVPN мосты (TAP mode) ведет себя более близко к желаемому состоянию. Вы должны узнать разницу между мосты и маршрутизация, но в основном он имитирует уровень связи устройство, предоставив вам IP-адрес с другой стороны. Вы также должны узнать об OpenVPN Ethernet-мост так как здесь бесполезно копировать все руководство, но вот соответствующая цитата (конфигурация после установки brigde-utils & редактирование / запуск bridge-start скрипт) для дальнейшего обсуждения:

Закомментируйте строки, в которых говорится dev tun и начинается с server и замените его на:

dev tap0 
server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254

Теперь настройте брандмауэр Linux, чтобы разрешить пакетам беспрепятственно проходить через вновь созданный tap0 и br0 интерфейсы:

iptables -A INPUT -i tap0 -j ACCEPT 
iptables -A INPUT -i br0 -j ACCEPT
iptables -A FORWARD -i br0 -j ACCEPT

Хотя это необычно и может быть не очень хорошей идеей, должна быть возможность соединить общедоступный сетевой интерфейс так же, как и частный. 192.168.8.0/24 подсеть была соединена мостом, давая клиентам IP-адреса между 192.168.8.128 и 192.168.8.254.

Тем не менее, у него все еще есть предпосылки, которые в настоящее время не выполняются. Вам потребуется подсеть общедоступного IP-адреса для подключения (т.е.используется для вашего Пул адресов VPN-клиентов) вместо этих независимых IP-адресов из разных мест.