Настройка VPN тунеля: используем VPN клиента в качестве основного шлюза

4920

May 03, 2018

Исходные данные:

  1. Есть два сервера
  2. Один из них не имеет прямого доступа

Задача:

  1. Нужно настроить между ними VPN
  2. Нужно дать клиентам возможность подключаться к доступному нам серверу
  3. Нужно заставить весь траффик ходить через недоступный сервер

Введение

Итак, мы имеем два сервера. Предположим, что один из них расположен в дата-центре ДЦ1, второй - в дата-центре ДЦ2. И в какой-то момент возникает необходимость пропускать весь траффик клиентов VPN, подключающихся к серверу ДЦ1 через сервер ДЦ2. Но настроить нужно с учетом того, что сервер ДЦ2 сам является VPN клиентом сервера ДЦ1. Почему? Потому что сервер ДЦ1 "вдруг" перестал видеть сервер ДЦ2, но не наоборот.

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

1. Используем SoftEther VPN

Реализовать проброс траффика через VPN-клиента мне удалось, используя SoftEther VPN, настроив сеть таким образом:

  1. VPN сервер устанавливается на сервере ДЦ1
  2. На сервере ДЦ2 устанавливается VPN Bridge и с помощью Cascade Connection подключается к серверу ДЦ1
  3. VPN Bridge на сервере ДЦ2 создается между виртуальным HUB-ом и TAP-устойством
  4. На обоих серверах ДЦ1 и ДЦ2 не включен Secure NAT и встроенный DHCP сервер
  5. На сервере ДЦ2 запускается dnsmasq служба, раздающая IP клиентам
  6. Настраивается проброс пакетов между новым TAP-устройством и физическим сетевым интерфейсом на сервере ДЦ2 (используя iptables)

И в этой конфигурации клиентам сервера ДЦ1 выдается шлюз по-умолчанию - IP TAP-устройства сервера ДЦ2, и весь траффик летит через сервер ДЦ2.

Опишу весь процесс настройки.

2. Установка SoftEther VPN

Я буду использовать GUI для настроек: SoftEther VPN Server Manager

Скачать последние версии SoftEther VPN можно на официальном сайте.

На сервере ДЦ2 нам нужен будет только Bridge. На странице загрузок можно выбрать только его для скачивания. Но этот вариант я не проверял. У меня на обоих серверах стоит полноценный VPN сервер. Поэтому порядок установки будет одинаковый для ДЦ1 и ДЦ2.

apt-get update
apt-get install build-essential
apt-get upgrade -y
wget http://www.softether-download.com/files/softether/v4.27-9666-beta-2018.04.21-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.27-9666-beta-2018.04.21-linux-x64-64bit.tar.gz
tar zxf softether-vpnserver-v4.27-9666-beta-2018.04.21-linux-x64-64bit.tar.gz
cd vpnserver
make

На этом шаге мы собрали наш VPN сервер. Осталось его переместить в отдельную директорию и запустить:

cd ..
mv vpnserver /opt
cd /opt/vpnserver/
chmod 600 *
chmod 700 vpncmd
chmod 700 vpnserver

Содержимое systemd-unit:

[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

3. Общие настройки VPN серверов ДЦ1 и ДЦ2

3.1. Сменим пароль администратора

Для этих целей воспользуемся консольной утилитой, входящий в состав дистрибутива SoftEther VPN: vpncmd

После запуска утилиты выбираем пункт Management of VPN Server or VPN Bridge

/opt/vpnserver# ./vpncmd
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.24 Build 9651   (English)
Compiled 2017/10/23 01:52:32 by yagi at pc33
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 1

Далее указываем локальный порт 5555, на котором по-умолчанию запущен VPN сервер

Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format 'host name:port number', you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination: localhost:5555

На следующий вопрос отвечаем пустым ответом, т.к. нам нужно войти в режим администрирования

If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name: 

Мы попадем в консоль сервера VPN

Connection has been established with VPN Server "localhost" (port 5555).

You have administrator privileges for the entire VPN Server.

VPN Server>

Меняем пароль администратора севера

VPN Server>ServerPasswordSet

Выход из консоли осуществляется командой quit.

4. Настройка серверов

4.1. Прописываем наши сервера в SoftEther VPN Server Manager

На скриншотах у меня используются IP от OpenVPN подключения. Необходимо указать те, по которым оба сервера ДЦ1 и ДЦ2 доступны.

4.2. Настройка сервера ДЦ1

Подключаемся к серверу

У меня отключен порт 443, который по-умолчанию включен, т.к. сервер используется еще в качестве Web-сервера.

4.2.1. Добавление пользователей

Поскольку предполагается авторизация по логину/паролю, то необходимо добавить список разрешенных пользователей.

Заходим в управление виртуального HUB-а - Manage Virtual Hub

Переходим в управление пользователями - Manage Users

И добавляем пользователей:

  1. Один пользователь для сервера ДЦ2, который выступает на самом деле клиентом
  2. И необходимое количество пользователей, которым разрешено подключаться к VPN

В настройках указываем тип авторизации - по паролю, и назначаем пароль

4.2.2. Отключаем Secure NAT

Возвращаемся к настройке виртуального HUB-а, и проверим состояние Secure NAT и Virtual DHCP

Все должно быть выключено

4.2.3. Использование нативных клиентов VPN

Для включения возможности подключения к VPN нативных клиентов операционных систем (Android, iOS, Windows, MacOS) нужно включить опцию L2TP в настройках

4.3. Настройка сервера ДЦ2

4.3.1. Создание HUB-а

Удалим дефолтный HUB с именем DEFAULT и создадим новый с именем BRIDGE

4.3.2. Настройка моста

Создаем новый мост от HAB-а до виртуального адаптера с именем soft. На самом деле, имя адаптера будет дополнено префиксом "tap_", он будет называться tap_soft

4.3.3. Настроим Cascade соединение до сервера ДЦ1

Указываем внешний IP сервера ДЦ1 и параметры авторизации

4.3.4. Настройка DHCP сервера

Проверьте, что Secure NAT выключен в настройках на сервере ДЦ2!

В качестве DHCP сервера будем использовать dnsmasq. Подключаемся к консоли сервера ДЦ2 и устанавливаем

apt-get install dnsmasq

В конфигурационный файл /etc/dnsmasq.conf добавляем строки

interface=tap_soft
dhcp-range=tap_soft,13.13.1.101,13.13.1.200,2h
dhcp-option=tap_soft,option:router,13.13.1.2
dhcp-option=tap_soft,option:dns-server,8.8.8.8,77.88.8.8

Перезапускаем демона

systemctl restart dnsmasq.service

4.3.5. Присвоение IP нашему виртуальному сетевому интерфейсу

Для этого служит команда

/sbin/ifconfig tap_soft 13.13.1.2

Ее нужно добавить в автозагрузку. В моей системе (Ubuntu 16.04 LTS) есть systemd-unit rc-local.service, который служит аналогом аналогичного демона sysinit. Содержимое файла-юнита

[Unit]
Description=/etc/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes

Поэтому в конец файла /etc/rc.local я добавил строку

/sbin/ifconfig tap_soft 13.13.1.2

4.3.6. Включение форвардинга траффика

Для автоматического запуска форвардинга созадем файл /etc/sysctl.d/ipv4_forwarding.conf со следующим содержимым:

net.ipv4.ip_forward = 1

Применяем настройки

sysctl --system

И включаем маскарадинг

iptables -t nat -A POSTROUTING -s 13.13.1.0/24 -j SNAT --to-source <IP адрес eth0>

Эту строку тоже следует добавить в файл /etc/rc.local, чтобы настройка включалась после перезагрузки.

5. В заключение

В результате таких настроек мы получаем DHCP клиент на удаленном (и недоступном) сервере, который связан с доступным нам сервером, который, в свою очередь, служит теперь только точкой подключения всех устройств-клиентов. Весь траффик идет через недоступный ранее сервер.