ВПН сервер без сторонних программ

Итак, ребятушки. С учетом последних событий, впн нужен практически каждому, а вот свой впн, который выйдет дешевле, чем покупной - звучит намного более круче.
Инструкция была обкатана и проверена сотни раз и гарантированно сработает без каких-либо ошибок, если вы будете ей следовать.
Гайд актуален до момента прописания правил файерволла на стороне хостера.
У каждого он свой - поэтому будьте внимательны.
Инструкция здесь будет на примере машины с AWS и будет использовать AWS Lightsail
Итак поехали.
Поднимать VPN-сервер мы будем на основе операционной системы Linux Debian. Никаких убунту, центоса и так далее. Вот потому что я так хочу.
Почему IPsec IKEv2 а не другой протокол? А потому что для яблочной продукции он нативен и сделать конфиг под яблоко - изи-бризи.
Инструкцию как подключиться к тачке я писать не буду. Если вы не умеете этого делать - закройте вкладку и идите туда, куда пошел русский военный корабль.

Все манипуляции будем осуществлять из-под пользователя root. Поехали:
Bash:
sudo su
Обновим индекс пакетов в репозиториях, возможно, есть обновления:
Bash:
apt-get update
А затем установим эти обновления:
Bash:
apt-get upgrade

Установим strongSwan
Bash:
apt-get install strongswan
И набор стандартных плагинов:
Bash:
apt-get install libstrongswan-standard-plugins

К детальной настройке strongSwan мы вернемся чуть позже, а пока создадим сертификаты доступа, чтобы наши устройства смогли подключиться к VPN серверу.
Создаем сертификаты доступа
Мы будем использовать самозаверенные сертификаты, поскольку VPN-сервером планируем пользоваться только мы. Для того чтобы создать сертификаты, нам потребуется пакет strongswan-pki. Установим его:
Bash:
apt-get install strongswan-pki

Теперь нам нужно создать корневой сертификат, он же “CA” (Certificate Authority), который выпустит нам все остальные сертификаты. Создадим его в файле ca.pem.
В следующих двух блоках вместо YOUR_SERVER_IP подставляйте внешний IP-адрес машины в AWS Lightsail. Команды вводятся одна за другой:
Bash:
cd /etc/ipsec.d
ipsec pki --gen --type rsa --size 4096 --outform pem > private/ca.pem
ipsec pki --self --ca --lifetime 3650 --in private/ca.pem \
--type rsa --digest sha256 \
--dn "CN=YOUR_SERVER_IP" \
--outform pem > cacerts/ca.pem
Далее создадим сертификат для самого VPN-сервера в файле debian.pem:
Bash:
ipsec pki --gen --type rsa --size 4096 --outform pem > private/debian.pem
ipsec pki --pub --in private/debian.pem --type rsa |
ipsec pki --issue --lifetime 3650 --digest sha256 \
--cacert cacerts/ca.pem --cakey private/ca.pem \
--dn "CN=YOUR_SERVER_IP" \
--san YOUR_SERVER_IP \
--flag serverAuth --outform pem > certs/debian.pem
И сертификат для самих устройств в файле me.pem. В следующем блоке ничего (в том числе в “CN=me”) менять не нужно:
Код:
ipsec pki --gen --type rsa --size 4096 --outform pem > private/me.pem
ipsec pki --pub --in private/me.pem --type rsa |
ipsec pki --issue --lifetime 3650 --digest sha256 \
--cacert cacerts/ca.pem --cakey private/ca.pem \
--dn "CN=me" --san me \
--flag clientAuth \
--outform pem > certs/me.pem
Для надежности удалим файл ca.pem, он нам больше не потребуется:
Bash:
rm /etc/ipsec.d/private/ca.pem
Создание сертификатов завершено.

Настроим strongSwan

Очистим дефолтный конфиг strongSwan командой:
Bash:
> /etc/ipsec.conf
И создадим свой в текстовом редакторе nano:
Bash:
nano /etc/ipsec.conf
Вставьте в него данный текст, заменив YOUR_SERVER_IP на внешний IP-адрес машины в AWS Lightsail. Больше в конфиге ничего менять не нужно.
Bash:
config setup
        uniqueids=never
        charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2,  mgr 2"

conn %default
        keyexchange=ikev2
        ike=aes128gcm16-sha2_256-prfsha256-ecp256!
        esp=aes128gcm16-sha2_256-ecp256!
        fragmentation=yes
        rekey=no
        compress=yes
        dpdaction=clear
        left=%any
        leftauth=pubkey
        leftsourceip=YOUR_SERVER_IP
        leftid=YOUR_SERVER_IP
        leftcert=debian.pem
        leftsendcert=always
        leftsubnet=0.0.0.0/0
        right=%any
        rightauth=pubkey
        rightsourceip=10.10.10.0/24
        rightdns=8.8.8.8,8.8.4.4

conn ikev2-pubkey
        auto=add
Внимание! strongSwan требователен к отступам в конфиге, поэтому убедитесь, что параметры каждого раздела конфига отбиты через Tab, как это показано на примере, или хотя бы через пробел, иначе strongSwan не запустится.
Сохраним файл с помощью Ctrl+X и пойдем дальше.
Добавим в файл ipsec.secrets, который является хранилищем ссылок на сертификаты и ключи аутентификации, указатель на наш сертификат сервера:
Bash:
nano /etc/ipsec.secrets
Вставим в этот файл последней строкой указатель на наш сертификат сервера (да, прям вот так, начиная с двоеточия):
Код:
: RSA debian.pem
На этом настройка Strongswan завершена, можно рестартнуть службу:
Bash:
ipsec restart
Если все хорошо, то сервер запустится:
Код:
...
Starting strongSwan 5.7.2 IPsec [starter]...

Настроим сетевые параметры ядра
Теперь нам необходимо внести некоторые изменения в файл /etc/sysctl.conf:
Bash:
nano /etc/sysctl.conf

Через Ctrl+W найдем в файле следующие переменные и внесем в них изменения:
Swift:
#Раскомментируем (уберем решетку перед параметром) данный параметр, чтобы включить переадресацию пакетов
net.ipv4.ip_forward=1

#Раскомментируем данный параметр, чтобы предотвратить MITM-атаки
net.ipv4.conf.all.accept_redirects = 0

#Раскомментируем данный параметр, чтобы запретить отправку ICMP-редиректов
net.ipv4.conf.all.send_redirects = 0

#В любом месте файла на новой строке добавьте этот параметр, запретив поиск PMTU
net.ipv4.ip_no_pmtu_disc = 1

Сохраним файл через Ctrl+X и подгрузим новые значения:
Bash:
sysctl -p

Настроим iptables
iptables — это утилита, которая управляет встроенным в Linux файрволом netfilter. Для того, чтобы сохранить правила iptables в файле и подгружать их при каждом запуске системы, установим пакет iptables-persistent:
Bash:
apt-get install iptables-persistent
После установки нас спросят, сохранить ли текущие правила IPv4 и IPv6. Ответим «Нет», так как у нас новая система, и нечего сохранять.
Перейдем к формированию правил iptables. На всякий пожарный, очистим все цепочки:
Bash:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -Z
Разрешим соединения по SSH на 22 порту, чтобы не потерять доступ к машине:
Bash:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Разрешим соединения на loopback-интерфейсе:
Bash:
iptables -A INPUT -i lo -j ACCEPT
Теперь разрешим входящие соединения на UDP-портах 500 и 4500:
Bash:
iptables -A INPUT -p udp --dport  500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
Разрешим переадресацию ESP-трафика:
Bash:
iptables -A FORWARD --match policy --pol ipsec --dir in  --proto esp -s 10.10.10.0/24 -j ACCEPT
iptables -A FORWARD --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
Настроим маскирование трафика, так как наш VPN-сервер, по сути, выступает как шлюз между Интернетом и VPN-клиентами:
Bash:
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --pol ipsec --dir out -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE
Настроим максимальный размер сегмента пакетов:
Bash:
iptables -t mangle -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
Запретим все прочие соединения к серверу:
Bash:
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
Сохраним правила, чтобы они загружались после каждой перезагрузки:
Bash:
netfilter-persistent save
netfilter-persistent reload
Настройка iptables завершена.
Перезагрузим машину:
Bash:
reboot
И посмотрим работают ли правила iptables:
Bash:
sudo su
iptables -S

Должно выглядеть так:
Swift:
...
root@XX.X
X.XX.XX:/home/admin# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -s 10.10.10.0/24 -m policy --dir in --pol ipsec --proto esp -j ACCEPT
-A FORWARD -d 10.10.10.0/24 -m policy --dir out --pol ipsec --proto esp -j ACCEPT
-A FORWARD -j DROP

Работает ли strongSwan:
Bash:
ipsec statusall

Выглядит примерно так:
Bash:
...
root@XX.XX.XX.XX:/home/admin# ipsec statusall
Status of IKE charon daemon (strongSwan 5.7.2, Linux 4.19.0-14-amd64, x86_64):
  uptime: 71 seconds, since Apr 25 18:20:16 2022
...
Да, всё работает.
Дальше гайд упирается в выбор машины. у кого не авс - тот настраивает под себя, или пишет ТП с просьбой помочь.
Я пишу для авс:
Разрешаем соединения в файрволе Lightsail
AWS Lightsail использует также и свой файрвол для защиты виртуальных машин. Если в нем не разрешить соединения на UDP-портах 500 и 4500, к VPN-серверу нельзя будет подключиться. Выберем наш инстанс в Lightsail, перейдем в «Networking», добавим эти порты и по пути удалим ненужный нам 80-й порт.

Создаем .mobileconfig для iPhone, iPad и Mac
Мы будем использовать один и тот же VPN-профайл .mobileconfig для всех наших устройств.
Конфиг, который мы сделаем, устроен таким образом, чтобы инициировать соединение “On Demand”. Это означает, что при попытке любой службы или приложения выйти в Интернет, VPN-соединение будет всегда устанавливаться принудительно и автоматически. Таким образом, удастся избежать ситуации, когда вы забыли установить VPN-соединение, например, после перезагрузки девайса, а трафик в итоге пошел через провайдера, что нам совсем не нужно.
Скачаем скрипт, который сгенерирует для нас данный конфиг:
Bash:
wget https://gist.githubusercontent.com/borisovonline/955b7c583c049464c878bbe43329a521/raw/b2d9dba73da633fcfcca6a03d877517c5b2d9485/mobileconfig.sh
Для того, чтобы скрипт отработал, нам потребуется пакет zsh, установим его:
Bash:
apt-get install zsh
Отредактируем название сервера по вкусу, а также пропишем внешний IP-адрес машины Lightsail:
Bash:
nano mobileconfig.sh
Bash:
SERVER="AWS Frankfurt"
FQDN="YOUR_LIGHTSAIL_IP"
Запустим скрипт и на выходе получим готовый файл iphone.mobileconfig:
Bash:
chmod u+x mobileconfig.sh
./mobileconfig.sh > iphone.mobileconfig

Заберите этот файл с сервера, подключившись по SFTP. Или любым другим способом.

Отправьте скачанный файл iphone.mobileconfig на все ваши устройства. Подтвердите на устройствах установку конфигурации.
В macOS профайл устанавливается из System Preferences > Profiles. В iOS он появится в Settings > Profile Downloaded

Если соединения VPN успешно установились, но нет интернета
Скорее всего, ваш хостер переименовал обычно принятый дефолтным сетевой интерфейс eth0 во что-то другое по своему усмотрению (это нормально). И созданные нами правила роутинга iptables просто не могут отработать, поскольку обращаются к интерфейсу, которого нет.
Выполните команду ip addr или ifconfig, чтобы отобразить ваши сетевые интерфейсы.
И если вместо eth0 вы увидите что-то типа ens3, enp0s5 и т.п, как на скриншоте выше, то просто замените через
Код:
nano /etc/iptables/rules.v4
название eth0 в строках:
Код:
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -m policy --dir out --pol ipsec -j ACCEPT

-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

-A FORWARD -s 10.10.10.0/24 -o eth0 -p tcp -m policy --dir in --pol ipsec -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
на ваше название интерфейса. Перезагрузите сервер. Интернет заработает.
 
Добавлю - feil2ban, ssh-ключи коннекта, смена портов - это все другое, и к поднятию впн нихрена не относится. Это вопрос к безопасности машины.
 
ну сложно ведь)
 
  • Мне нравится
Реакции: kick
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Пад виндавс где? :pandaredlol:
А так спс)
 
  • Ха-ха-ха
Реакции: kick
Пад виндавс где? :pandaredlol:
А так спс)
пункт «Изменить виртуальные частные сети (VPN)», а затем нажмите «Добавить VPN-соединение». В открывшемся окне введите все необходимые данные для VPN-соединения.
(с) Ваш КО :loltt0:
 
  • Вау
Реакции: kick
Назад
Сверху Снизу