Настройка сервера IKEv2 VPN с StrongSwan в Ubuntu 20.04

Материал из Шпаргалка знаний
Перейти к навигации Перейти к поиску

Ручная пошаговая настройка сервера описана в статье: https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-20-04-ru

Мы же все действия произведем с помощью скрипта.

Видео по установки и настройки скрипта: https://www.youtube.com/watch?v=93oJ5fF1mE0

Хостинг европейских серверов из России:

https://timeweb.cloud/?i=104329

https://bit.ly/3urB78d

Не российский хостинг (Эстония) с очень большой географией серверов и возможностью пополнения с российской карты. При оплате за год еще 3 месяца дают бесплатно:

https://bit.ly/3rOqvPE

Подготовка сервера.

sudo apt update && sudo apt upgrade -y

Подключаем SSH доступ для пользователя root на Debian

Для начала, необходимо создать пароль пользователю root следующей командой:

passwd root

Теперь открываем настройки SSH-сервера:

sudo nano /etc/ssh/sshd_config

И отредактируйте в нем следующую строку:

PermitRootLogin yes

После этого перезагрузите SSH сервис:

sudo systemctl restart ssh || sudo systemctl restart sshd

Скрипт находится по данной ссылке: https://github.com/AdelKudryashev/Strongswan-installation-script

Установка.

Перед запуском скрипта узнайте свой сетевой интерфейс, используя команду

ip route show default

После применения команды вы увидите вывод вида

Output
default via your_server_ip dev eth0  proto static

После dev будет нужный интерфейc, в данном случае это eth0. Вставьте в скрипте ваш интерфейс, используйте поиск для этого. Замените в скрипте все eth0 на ваш сетевой интерфейс.

sudo wget https://github.com/AdelKudryashev/Strongswan-installation-script/blob/master/startswan.sh

Далее заходим в скрипт и меняем в нем все записи eth0 на наш интерфейс.

sudo nano ~/startswan.sh

Для запуска скрипта используйте команду

yes | sudo sh startswan.sh

Если скрипт не скачался, то вот тело скрипта:

#You must change the eth0 interface to your own in this script in /etc/ufw/before.rules in three places
#Вы должны изменить интерфейс eth0 на свой в этом скрипте в /etc/ufw/before.rules в трех местах
#!/bin/bash
apt update
myip=$(wget -qO - eth0.me)
apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins -y
mkdir -p ~/pki/cacerts
mkdir -p ~/pki/certs
mkdir -p ~/pki/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 root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

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

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=$myip" --san @$myip --san $myip \
        --flag serverAuth --flag ikeIntermediate --outform pem \
    >  ~/pki/certs/server-cert.pem

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

mv /etc/ipsec.conf{,.original} #Создаем резервную копию файла настроек

cat << EOF > /etc/ipsec.conf
config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=$myip
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024,aes256-sha256-modp2048!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
EOF

cat << EOF > /etc/ipsec.secrets
: RSA "server-key.pem"
# your_username : EAP "your_password" - use this format for create new user
# sudo systemctl restart strongswan-starter - for the changes to take effect, after adding a new user, close the file and restart the server with this command
EOF


ufw allow OpenSSH
ufw enable
ufw allow 500,4500/udp

cat << EOF > /etc/ufw/before.rules
*nat
#change eth0 interface to yours
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE                             
COMMIT

*mangle
#change eth0 interface to yours
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#

# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT

# quickly process packets for which we already have a connection
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP

# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

# allow dhcp client to work
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT

#
# ufw-not-local
#
-A ufw-before-input -j ufw-not-local

# if LOCAL, RETURN
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN

# if MULTICAST, RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN

# if BROADCAST, RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN

# all other non-local packets are dropped
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP

# allow MULTICAST mDNS for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT

# allow MULTICAST UPnP for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT

# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
EOF

cat << EOF >> /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
EOF

Использование.

Вам нужно будет добавить логин и пароль пользователя. Отредактируйте файл

sudo nano /etc/ipsec.secrets

Внутри файла есть шаблон как добавлять нового пользователя.

Пример:

User1 : EAP "Qwerty"

* где User1 - это логин, а Qwerty - это пароль.

Для каждого пользователя или устройства свой логин и пароль!


После сохранения файла перезагрузите Strongswan используя команду

sudo systemctl restart strongswan-starter

Получение сертификата.

Получить сертификат можно с помощью команды:

sudo cat /etc/ipsec.d/cacerts/ca-cert.pem

Сохраните текст, заключенный между

-----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----

на локальный компьютер включая эти две строки в файл с расширением .pem

sert.pem

Все! Сервер поднят!


Подключение к VPN IKEv2/IPsec из Windows (видео инструкция): https://www.youtube.com/watch?v=RiZqopVcd2k