Итак, ребятушки. С учетом последних событий, впн нужен практически каждому, а вот свой впн, который выйдет дешевле, чем покупной - звучит намного более круче.
Инструкция была обкатана и проверена сотни раз и гарантированно сработает без каких-либо ошибок, если вы будете ей следовать.
Гайд актуален до момента прописания правил файерволла на стороне хостера.
У каждого он свой - поэтому будьте внимательны.
Инструкция здесь будет на примере машины с AWS и будет использовать AWS Lightsail
Итак поехали.
Поднимать VPN-сервер мы будем на основе операционной системы Linux Debian. Никаких убунту, центоса и так далее. Вот потому что я так хочу.
Почему IPsec IKEv2 а не другой протокол? А потому что для яблочной продукции он нативен и сделать конфиг под яблоко - изи-бризи.
Инструкцию как подключиться к тачке я писать не буду. Если вы не умеете этого делать - закройте вкладку и идите туда, куда пошел русский военный корабль.
Все манипуляции будем осуществлять из-под пользователя root. Поехали:
Обновим индекс пакетов в репозиториях, возможно, есть обновления:
А затем установим эти обновления:
Установим strongSwan
И набор стандартных плагинов:
К детальной настройке strongSwan мы вернемся чуть позже, а пока создадим сертификаты доступа, чтобы наши устройства смогли подключиться к VPN серверу.
Создаем сертификаты доступа
Мы будем использовать самозаверенные сертификаты, поскольку VPN-сервером планируем пользоваться только мы. Для того чтобы создать сертификаты, нам потребуется пакет strongswan-pki. Установим его:
Теперь нам нужно создать корневой сертификат, он же “CA” (Certificate Authority), который выпустит нам все остальные сертификаты. Создадим его в файле ca.pem.
В следующих двух блоках вместо YOUR_SERVER_IP подставляйте внешний IP-адрес машины в AWS Lightsail. Команды вводятся одна за другой:
Далее создадим сертификат для самого VPN-сервера в файле debian.pem:
И сертификат для самих устройств в файле me.pem. В следующем блоке ничего (в том числе в “CN=me”) менять не нужно:
Для надежности удалим файл ca.pem, он нам больше не потребуется:
Создание сертификатов завершено.
Настроим strongSwan
Очистим дефолтный конфиг strongSwan командой:
И создадим свой в текстовом редакторе nano:
Вставьте в него данный текст, заменив YOUR_SERVER_IP на внешний IP-адрес машины в AWS Lightsail. Больше в конфиге ничего менять не нужно.
Внимание! strongSwan требователен к отступам в конфиге, поэтому убедитесь, что параметры каждого раздела конфига отбиты через Tab, как это показано на примере, или хотя бы через пробел, иначе strongSwan не запустится.
Сохраним файл с помощью Ctrl+X и пойдем дальше.
Добавим в файл ipsec.secrets, который является хранилищем ссылок на сертификаты и ключи аутентификации, указатель на наш сертификат сервера:
Вставим в этот файл последней строкой указатель на наш сертификат сервера (да, прям вот так, начиная с двоеточия):
На этом настройка Strongswan завершена, можно рестартнуть службу:
Если все хорошо, то сервер запустится:
Настроим сетевые параметры ядра
Теперь нам необходимо внести некоторые изменения в файл /etc/sysctl.conf:
Через Ctrl+W найдем в файле следующие переменные и внесем в них изменения:
Сохраним файл через Ctrl+X и подгрузим новые значения:
Настроим iptables
iptables — это утилита, которая управляет встроенным в Linux файрволом netfilter. Для того, чтобы сохранить правила iptables в файле и подгружать их при каждом запуске системы, установим пакет iptables-persistent:
После установки нас спросят, сохранить ли текущие правила IPv4 и IPv6. Ответим «Нет», так как у нас новая система, и нечего сохранять.
Перейдем к формированию правил iptables. На всякий пожарный, очистим все цепочки:
Разрешим соединения по SSH на 22 порту, чтобы не потерять доступ к машине:
Разрешим соединения на loopback-интерфейсе:
Теперь разрешим входящие соединения на UDP-портах 500 и 4500:
Разрешим переадресацию ESP-трафика:
Настроим маскирование трафика, так как наш VPN-сервер, по сути, выступает как шлюз между Интернетом и VPN-клиентами:
Настроим максимальный размер сегмента пакетов:
Запретим все прочие соединения к серверу:
Сохраним правила, чтобы они загружались после каждой перезагрузки:
Настройка iptables завершена.
Перезагрузим машину:
И посмотрим работают ли правила iptables:
Должно выглядеть так:
Работает ли strongSwan:
Выглядит примерно так:
Да, всё работает.
Дальше гайд упирается в выбор машины. у кого не авс - тот настраивает под себя, или пишет ТП с просьбой помочь.
Я пишу для авс:
Разрешаем соединения в файрволе Lightsail
AWS Lightsail использует также и свой файрвол для защиты виртуальных машин. Если в нем не разрешить соединения на UDP-портах 500 и 4500, к VPN-серверу нельзя будет подключиться. Выберем наш инстанс в Lightsail, перейдем в «Networking», добавим эти порты и по пути удалим ненужный нам 80-й порт.
Создаем .mobileconfig для iPhone, iPad и Mac
Мы будем использовать один и тот же VPN-профайл .mobileconfig для всех наших устройств.
Конфиг, который мы сделаем, устроен таким образом, чтобы инициировать соединение “On Demand”. Это означает, что при попытке любой службы или приложения выйти в Интернет, VPN-соединение будет всегда устанавливаться принудительно и автоматически. Таким образом, удастся избежать ситуации, когда вы забыли установить VPN-соединение, например, после перезагрузки девайса, а трафик в итоге пошел через провайдера, что нам совсем не нужно.
Скачаем скрипт, который сгенерирует для нас данный конфиг:
Для того, чтобы скрипт отработал, нам потребуется пакет zsh, установим его:
Отредактируем название сервера по вкусу, а также пропишем внешний IP-адрес машины Lightsail:
Запустим скрипт и на выходе получим готовый файл iphone.mobileconfig:
Заберите этот файл с сервера, подключившись по SFTP. Или любым другим способом.
Отправьте скачанный файл iphone.mobileconfig на все ваши устройства. Подтвердите на устройствах установку конфигурации.
В macOS профайл устанавливается из System Preferences > Profiles. В iOS он появится в Settings > Profile Downloaded
Если соединения VPN успешно установились, но нет интернета
Скорее всего, ваш хостер переименовал обычно принятый дефолтным сетевой интерфейс eth0 во что-то другое по своему усмотрению (это нормально). И созданные нами правила роутинга iptables просто не могут отработать, поскольку обращаются к интерфейсу, которого нет.
Выполните команду ip addr или ifconfig, чтобы отобразить ваши сетевые интерфейсы.
И если вместо eth0 вы увидите что-то типа ens3, enp0s5 и т.п, как на скриншоте выше, то просто замените через
название eth0 в строках:
на ваше название интерфейса. Перезагрузите сервер. Интернет заработает.
Инструкция была обкатана и проверена сотни раз и гарантированно сработает без каких-либо ошибок, если вы будете ей следовать.
Гайд актуален до момента прописания правил файерволла на стороне хостера.
У каждого он свой - поэтому будьте внимательны.
Инструкция здесь будет на примере машины с 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
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
Код:
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
Bash:
rm /etc/ipsec.d/private/ca.pem
Настроим strongSwan
Очистим дефолтный конфиг strongSwan командой:
Bash:
> /etc/ipsec.conf
Bash:
nano /etc/ipsec.conf
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
Сохраним файл с помощью Ctrl+X и пойдем дальше.
Добавим в файл ipsec.secrets, который является хранилищем ссылок на сертификаты и ключи аутентификации, указатель на наш сертификат сервера:
Bash:
nano /etc/ipsec.secrets
Код:
: RSA debian.pem
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
Перейдем к формированию правил iptables. На всякий пожарный, очистим все цепочки:
Bash:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -Z
Bash:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Bash:
iptables -A INPUT -i lo -j ACCEPT
Bash:
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
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
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
Перезагрузим машину:
Bash:
reboot
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
Bash:
apt-get install zsh
Bash:
nano mobileconfig.sh
Bash:
SERVER="AWS Frankfurt"
FQDN="YOUR_LIGHTSAIL_IP"
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
Код:
-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