Вступление
VPN (англ. Virtual Private Network «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например Интернет). Но это все слова из старой доброй Википедии. Для чего на самом деле нужен VPN вы и сами знаете, иначе не залетали-бы в эту тему!
- Безопасное шифрованное соединение с сетью;
- контроль своего трафика;
- ну и конечно анонимное соединение позволяющее скрыть ваш IP.
- цена (некоторые компании представляют заоблачные цены, за ресурсы, которые того не стоят);
- работоспособность (от своей мнительной жадности коммерческие сервисы режут скорость передачи данных, чтобы уместить на одном сервере безумное количество клиентов);
- трафик (некоторые жмоты умудряются ограничивать вам объём трафика, ибо нечего качать на торрентах порнушку, а юзайте VPN только чтоб работать в Putty);
- анонимность – это самое главное. Сбор логов, биллинговых данных, местоположений. Да есть проверенные VPN-сервисы, но хотите их использовать – возвращайтесь к первому пункту.
Прям большое количество статей по этому поводу в Интернетах. Но здесь и сейчас я магнитом перенесу в ваш мозг высшие знания, и самый лучший а главное проверенный мануал! Поехали…
Предварительные требования
Как Вам уже стало понятно, тут есть много подводных камней и подготовок. И судя из заголовка статьи мы будем юзать Протокол IKEv2. Почему он? Да потому что это, по нашему скромному мнению, прям самый безопасный VPN. Internet Key Exchange v2 позволяет создавать прямые туннели IPSec между сервером и клиентом. Ну а собственно IPSec шифрует трафик в виртуальных частных сетях IKEv2. И конечно у вас сейчас возник вопрос – «А как же с поддержкой на разных платформах?», спокойно, не очкуем, любая ОС потянет этого коня!
И так, что нам нужно. А нужно нам – VPS – c установленной Ubuntu 18.04.
Что? Какая VPS? Да самая простая, но дайте ей хотя бы 1024 Mb ОЗУ, а то мало ли.
Что, что? Где ее взять? Ну и вопросы у Вас… Ответ: на любом хостинге (цена вопроса от 2-3 долларов). И ради Бога не пользуйтесь этим говносервисом Digitalocean.
И так у нас все готово, есть сервер, есть операционная система на нем, пора приступить к настройке...
Шаг 1 — Устанавливаем и настраиваем StrongSwan
StrongSwan - это многоплатформенная реализация IPsec. Весьма удобненько не так ли? Кроме того мы установим компонент инфраструктуры открытых ключей, чтобы создать центр сертификации, который будет предоставлять учетные данные для нашей инфраструктуры.
Bash:
sudo apt update
sudo apt install strongswan strongswan-pki
Шаг 2 — Создадим центр сертификации
Что бы все достойно функционировало и было на высоком безопасном уровне, мы должны мы настраиваем наш сервер таким способом, что для идентификации на клиентских системах будет требоваться наличие сертификата. Ранее установленные пакеты StrongSwan содержат в себе утилиту для генерации центра сертификации, а также самих сертификатов. Для этого мы создадим несколько рабочих каталогов и естественно поделимся с ними определенными правами:
Bash:
mkdir -p ~/pki/{cacerts,certs,private}
chmod 700 ~/pki
Bash:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
Bash:
ipsec 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
Шаг 3 — Генерируем сертификат для сервера VPN
Создадим сертификат и ключ для сервера VPN. Этот сертификат позволит клиентам проверять подлинность сервера, используя только что сгенерированный нами сертификат центра сертификации (далее СА).
Создаем закрытый ключ сервера VPN:
Bash:
ipsec pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
Bash:
ipsec pki --pub --in ~/pki/private/server-key.pem --type rsa \
| ipsec pki --issue --lifetime 1825 \
--cacert ~/pki/cacerts/ca-cert.pem \
--cakey ~/pki/private/ca-key.pem \
--dn "CN=server_domain_or_IP" --san "server_domain_or_IP" \
--flag serverAuth --flag ikeIntermediate --outform pem \
> ~/pki/certs/server-cert.pem
Bash:
sudo cp -r ~/pki/* /etc/ipsec.d/
Шаг 4 — Наконец настраиваем StrongSwan
Прежде чем начинать, создадим резервную копию файла для справки:
Bash:
sudo mv /etc/ipsec.conf{,.original}
Bash:
sudo nano /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
Код:
. . .
conn ikev2-vpn
. . .
dpdaction=clear
dpddelay=300s
rekey=no
Код:
. . .
conn ikev2-vpn
. . .
left=%any
leftid=@server_domain_or_IP
leftcert=server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
Примечание.
При настройке идентификатора сервера (leftid) символ
@ нужно указывать только в случае, если ваш сервер VPN
будет идентифицироваться по доменному имени:
[email protected]
Если сервер будет идентифицироваться по IP-адресу, просто укажите IP-адрес:
leftid=192.168.12.111
Теперь мы можем настроить параметры IPSec на стороне клиента (справа) как диапазоны частных IP-адресов и серверы DNS, которые нужно будет использовать:
Код:
. . .
conn ikev2-vpn
. . .
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.10.10.0/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
Код:
. . .
conn ikev2-vpn
. . .
eap_identity=%identity
Код:
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=@server_domain_or_IP
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
Шаг 5 — Настраиваем аутентификацию VPN
Теперь наш сервер VPN настроен на принятие подключений клиентов, но мы еще не настроили учетные данные. Нам нужно задать пару настроек в специальном файле конфигурации с именем ipsec.secrets:
- Нам нужно указать StrongSwan, где можно найти закрытый ключ для нашего сертификата сервера, чтобы сервер мог пройти аутентификацию на стороне клиента.
- Также нам потребуется список пользователей, которым будет разрешено подключаться к VPN.
Bash:
sudo nano /etc/ipsec.secrets
Код:
: RSA "server-key.pem"
your_username : EAP "your_password"
Bash:
sudo systemctl restart strongswan
Шаг 6 — Настройка брандмауэра и переадресации IP ядра
После настройки конфигурации StrongSwan нам нужно настроить брандмауэр, чтобы он разрешал трафик VPN и перенаправлял его. Если вы выполнили указания предварительных обучающих модулей, у вас должен быть включен базовый брандмауэр UFW. Если вы еще не настроили UFW, вы можете базовую конфигурацию и включить ее с помощью следующей команды:
Bash:
sudo ufw allow OpenSSH
sudo ufw enable
Bash:
sudo ufw allow 500,4500/udp
Bash:
ip route | grep default
Код:
Output
default via 203.0.113.7 dev eth0 proto static
Код:
*nat
-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
-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
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .
После строки *filter и строк определения цепочки нужно добавить еще один блок конфигурации:
Код:
. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
-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
Bash:
sudo nano /etc/ufw/sysctl.conf
Код:
. . .
# Enable forwarding
# Uncomment the following line
net/ipv4/ip_forward=1
. . .
# Do not accept ICMP redirects (prevent MITM attacks)
# Ensure the following line is set
net/ipv4/conf/all/accept_redirects=0
# Do not send ICMP redirects (we are not a router)
# Add the following lines
net/ipv4/conf/all/send_redirects=0
net/ipv4/ip_no_pmtu_disc=1
Bash:
sudo ufw disable
sudo ufw enable
Вот, собственно, и все! Для подключения – вам нужен, сервер, логин и пароль а также применить сгенерированный сертификат. На просторах Интернетов – вы найдете мануалы по подключению любой операционной системы!
Спасибо за внимание!