VPN Сервер

Первоисточники


всё началось с Beget VPN
V1 - L2TP с общим ключом IPSec
V2 - Очень хороший материал - но потом я нашёл лучше
V3 - А вот и он - Лучший материал

На память:
Нет у меня доверия к "лёгкой" установки из скрипта
OpenVPN из скрипта
Рассуждения на Хабр какой же VPN лучше
Яд - Как сломать DNS
Противоядие - как починить DNS
Респект Gentoo-шникам
настройка Брандмауэра для L2TP с IPSec
iOS .pem file - формат файла не поддерживается

Как узнать, зашифрован ли VPN-трафик:
Рассказ про Wireshark
Проверка IP-адреса и DNS


Содержание

  1. Установка StrongSwan и xl2tpd
  2. Создание центра сертификации
  3. Генерация сертификата для VPN-сервера
  4. Настройка StrongSwan и xl2tpd
  5. Настройка аутентификации VPN
  6. Настройка брандмауэра и IP-переадресации
  7. Тестирование VPN-подключения в Windows, macOS, Ubuntu, iOS и Android

Шаг 1 — Установка StrongSwan и xl2tpd

Мы также установим компонент инфраструктуры открытых ключей (PKI), чтобы мы могли создать центр сертификации (CA) для предоставления учетных данных для нашей инфраструктуры.

Начните с обновления локального кеша пакетов:

apt update

Затем установите программное обеспечение, набрав:

apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd-dev xl2tpd

Теперь, когда все установлено, давайте перейдем к созданию наших сертификатов.

Шаг 2 — Создание центра сертификации

Для начала давайте создадим несколько каталогов для хранения всех ресурсов, над которыми мы будем работать. Структура каталогов соответствует некоторым каталогам в /etc/ipsec.d, куда мы в конечном итоге переместим все созданные нами элементы:

mkdir -p ~/pki/{cacerts,certs,private}

Затем заблокируйте разрешения, чтобы другие пользователи не могли видеть наши личные файлы:

chmod 700 ~/pki

Выполните эти команды, чтобы сгенерировать ключ:

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

После этого мы можем перейти к созданию нашего корневого центра сертификации, используя только что сгенерированный ключ для подписи корневого сертификата:

pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \
    --type rsa --dn "CN=VPN Imeni Menya CA" --outform pem > ~/pki/cacerts/ca-cert.pem

Вы можете изменить значение VPN Imeni Menya CA на другое, если хотите.

Теперь, когда у нас есть корневой центр сертификации, мы можем создать сертификат, который будет использовать VPN-сервер.

Шаг 3 — Генерация сертификата для VPN-сервера

Теперь мы создадим сертификат и ключ для VPN-сервера. Этот сертификат позволит клиенту проверить подлинность сервера, используя только что созданный нами сертификат ЦС.

Сначала создайте закрытый ключ для VPN-сервера с помощью следующей команды:

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

Теперь создайте и подпишите сертификат VPN-сервера с помощью ключа центра сертификации, который вы создали на предыдущем шаге. Выполните следующую команду, но измените поля «Общее имя» (CN) и «Альтернативное имя субъекта» (SAN) на DNS-имя или IP-адрес вашего VPN-сервера:

pki --pub --in ~/pki/private/server-key.pem --type rsa \
    | pki --issue --lifetime 1825 \
        --cacert ~/pki/cacerts/ca-cert.pem \
        --cakey ~/pki/private/ca-key.pem \
        --dn "CN=server_domain_or_IP" --san server_domain_or_IP \
        --flag serverAuth --flag ikeIntermediate --outform pem \
    > ~/pki/certs/server-cert.pem

Примечание: Если вы используете IP-адрес вместо DNS-имени

Теперь, когда мы сгенерировали все файлы TLS/SSL, которые нужны StrongSwan, мы можем переместить файлы на место в каталог /etc/ipsec.d

cp -r ~/pki/* /etc/ipsec.d/

На этом шаге мы создали пару сертификатов, которая будет использоваться для защиты связи между клиентом и сервером. Мы также подписали сертификаты ключом ЦС, поэтому клиент сможет проверить подлинность VPN-сервера с помощью сертификата ЦС. Когда все эти сертификаты готовы, мы перейдем к настройке программного обеспечения.

Шаг 4 — Настройка StrongSwan и xl2tpd

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

mv /etc/ipsec.conf{,.original}

Создайте и откройте новый пустой файл конфигурации с помощью предпочитаемого вами текстового редактора.
Полный файл конфигурации должен выглядеть так:
/etc/ipsec.conf

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no


conn shared
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!


conn rw-base
    fragmentation=yes
    dpdaction=clear 


conn ikev2-vpn
    also=shared
    also=rw-base
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    forceencaps=yes
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@server_domain_or_IP
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.250.0.0/16
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity


conn l2tp-vpn
    also=shared
    also=rw-base  
    dpdtimeout=90s
    dpddelay=30s
    leftsubnet=%dynamic[/1701]
    rightsubnet=%dynamic
    mark=%unique
    leftauth=psk
    rightauth=psk
    type=transport
    auto=add

Делаем резервную копию файла:

mv /etc/xl2tpd/xl2tpd.conf{,.original}

Создаём файл конфигурации, который должен выглядеть так:
/etc/xl2tpd/xl2tpd.conf

[global]
port = 1701
auth file = /etc/ppp/chap-secrets
access control = no
ipsec saref = yes
force userspace = yes

[lns default]
exclusive = no
ip range = 10.251.0.2-10.251.0.100
hidden bit = no
local ip = 10.251.0.1
length bit = yes
require authentication = yes
name = l2tp-vpn
pppoptfile = /etc/ppp/options.xl2tpd
flow bit = yes

Создаём ещё один конфигурационный файл :
/etc/ppp/options.xl2tpd

asyncmap 0
auth
crtscts
lock
hide-password
modem
mtu 1460
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
multilink
mppe-stateful
ms-dns 8.8.8.8
ms-dns 8.8.4.4

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

Шаг 5 — Настройка аутентификации VPN

Для начала как обычно сохраним копию оригинала:

mv /etc/ipsec.secrets{,.original}

Создаём файл /etc/ipsec.secrets

%any %any : PSK mySharedKey
: RSA "server-key.pem"
your_username : EAP "your_password"

Здесь mySharedKey - это общий ключ, так как от него зависит безопасность VPN-сети рекомендую использовать в качестве ключа случайно сгенерированную строку из букв, цифр и спецсимволов. Для этого можно воспользоваться командой:

openssl rand -base64 18

Результатом ее выполнения станет случайная строка длинной в 24 символов (по тому что 18 здесь не десятичное число, а шестнадцатеричное)

root@vpn-server:/etc# openssl rand -base64 18
gyxTU+c1slW74TDhz0RV/YHI
root@vpn-server:/etc#

Для L2TP учетные записи пользователей хранятся в файлe /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client server_secret IP_addresses


your_username l2tp-vpn your_password *

Первым указываем логин, затем имя службы, оно должно совпадать с тем, которое мы указали в опции name в xl2tpd.conf, после него идет пароль и IP-адрес клиента, символ * обозначает что можно присвоить любой адрес из выбранного диапазона. Если же требуется выдать клиенту постоянный адрес, то его следует указать явно, и он не должен входить в динамический диапазон указанный в ip range, например:

your_username l2tp-vpn your_password 10.252.0.100

Теперь, когда мы закончили работу с параметрами VPN, перезапустим службы VPN, чтобы наша конфигурация применилась:

systemctl restart strongswan-starter
systemctl restart xl2tpd

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

Шаг 6 — Настройка брандмауэра и IP-переадресации

Начнём с добавления правила, разрешающего SSH-соединения через брандмауэр, чтобы наш текущий сеанс не закрылся при включении UFW:

ufw allow OpenSSH

Затем включите брандмауэр, набрав:

ufw enable

Затем добавьте правило, разрешающее трафик UDP на стандартные порты IPSec, 500 и 4500, а так же для L2TP необходимо открыть UDP порт 1701:

ufw allow 500,4500,1701/udp

Для web-сервера надо открыть TCP порт 80:

ufw allow 80/tcp

Далее мы откроем один из файлов конфигурации UFW, чтобы добавить несколько низкоуровневых политик для маршрутизации и пересылки пакетов IPSec. Однако прежде чем мы сможем это сделать, нам нужно найти, какой сетевой интерфейс на нашем сервере используется для доступа в Интернет. Найдите этот интерфейс, запросив устройство, связанное с маршрутом по умолчанию:

ip route show default

Ваш общедоступный интерфейс должен следовать за словом dev. Например, этот результат показывает интерфейс с именем eth0, который выделен в следующем примере:

root@vpn-server:/# ip route show default
default via your_server_ip dev eth0 onlink
root@vpn-server:/#

Если у вас есть общедоступный сетевой интерфейс, откройте /etc/ufw/before.rules файл в текстовом редакторе. Правила в этом файле добавляются в брандмауэр перед остальными обычными правилами ввода и вывода. Они используются для настройки преобразования сетевых адресов (NAT), чтобы сервер мог правильно маршрутизировать соединения с клиентами и Интернетом.

mcedit /etc/ufw/before.rules

В верхней части файла (перед *filter строкой) добавьте следующий блок конфигурации. Измените каждый экземпляр eth0 в приведенной выше конфигурации, чтобы он соответствовал имени интерфейса, которое вы нашли с помощью ip route. Строки *nat создают правила, чтобы брандмауэр мог правильно маршрутизировать и управлять трафиком между VPN-клиентами и Интернетом. Строка *mangle регулирует максимальный размер сегмента пакета, чтобы предотвратить возможные проблемы с некоторыми VPN-клиентами:

*nat
-A POSTROUTING -s 10.250.0.0/16 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.251.0.0/16 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.250.0.0/16 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.251.0.0/16 -o eth0 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.250.0.0/16 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
-A FORWARD --match policy --pol ipsec --dir in -s 10.251.0.0/16 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .

Далее, после строк определения *filter и цепочки, добавьте еще один блок конфигурации:

. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.250.0.0/16 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.251.0.0/16 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.250.0.0/16 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.251.0.0/16 -j ACCEPT

Перед перезапуском брандмауэра мы изменим некоторые параметры сетевого ядра, чтобы разрешить маршрутизацию с одного интерфейса на другой. Файл, управляющий этими настройками, называется /etc/ufw/sysctl.conf.

mcedit /etc/ufw/sysctl.conf

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

. . .
net/ipv4/ip_forward=1
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1

Чтобы у L2TP был доступ в Интернет:

ufw route allow in on ppp+ from 10.251.0.0/16 out on eth0

Интерфейс eth0 - это то самый, который мы искали здесь

Теперь мы можем включить все наши изменения, отключив и снова включив брандмауэр, поскольку UFW применяет эти настройки при каждом перезапуске:

ufw disable
ufw enable

Вам будет предложено подтвердить процесс. Введите Y, чтобы снова включить UFW с новыми настройками.

Шаг 7 — Тестирование VPN-подключения в Windows, macOS, Ubuntu, iOS и Android

Android
Сервер: keshimihi.beget.app
VPN Тип: IKEv2 EAP (Логин/Пароль)
Логин: user
Пароль: j4*hXs0r
Название профиля: Любое, удобное вам. Например, Beget VPN
IKEv2 Algorithms: aes256-sha256-modp1024
или
IKEv2 Algorithms: chacha20poly1305-sha512-curve25519-prfsha512


Windows
Поставщик услуг VPN: Windows (встроенные)
Имя подключения: Любое, удобное вам. Например, Beget VPN
Имя или адрес сервера: keshimihi.beget.app
Тип VPN: IKEv2
Тип данных для входа: Имя пользователя и пароль
Имя пользователя: user
Пароль: j4*hXs0r


Windows 7


Использовать основной шлюз в удаленной сети

Как экспортировать и импортировать VPN-соединения в Windows 10

Автозапуск VPN в Windows

Настройки VPN подключений пользователя хранятся в папке Pbk:

%AppData%\Microsoft\Network\Connections\Pbk

для всех пользователей компьютера:

C:\ProgramData\Microsoft\Network\Connections\Pbk