Настройка сервера 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