Я хочу создать конфигурацию 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-адрес.
Для этого добавьте следующие строки в файл конфигурации 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 должно быть настроено следующим образом:
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
).
Для каждого клиента вы должны выполнить такую команду:
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-адресов из разных мест.