Первоисточники
всё началось с Beget VPN
V1 - L2TP с общим ключом IPSec
V2 - Очень хороший материал - но потом я нашёл лучше
V3 - А вот и он - Лучший материал
На память:
Нет у меня доверия к "лёгкой" установки из скрипта
OpenVPN из скрипта
Рассуждения на Хабр какой же VPN лучше
Яд - Как сломать DNS
Противоядие - как починить DNS
Респект Gentoo-шникам
настройка Брандмауэра для L2TP с IPSec
iOS .pem file - формат файла не поддерживается
Как узнать, зашифрован ли VPN-трафик:
Рассказ про Wireshark
Проверка IP-адреса и DNS
Содержание
Шаг 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 подключений пользователя хранятся в папке Pbk:
%AppData%\Microsoft\Network\Connections\Pbk
для всех пользователей компьютера:
C:\ProgramData\Microsoft\Network\Connections\Pbk
