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