Как настроить VPN на сервере
Настройка VPN поможет избежать перехвата трафика при работе через публичные точки Wi-Fi в кафе, метро, парках и других общественных местах.
Для работы с VPN потребуется:
- настроить собственный сервер на операционной системе Debian. Сервер можно создать, например, тут
- настроить ваш телефон\ноутбук\компьютер для подключения к серверу
В этой статье мы расскажем только про самый сложный первый пункт.
Мы предполагаем, что у вас есть доступ root на VDS сервер. Зайдите через SSH на сервер от имени пользователя root. Можно подключиться через SSH по нашей статье.
Для начала обновите индекс пакетов и установите OpenVPN
sudo apt update
sudo apt install openvpn easy-rsa
Создайте каталог, в котором будет храниться корневой сертификат
make-cadir ~/openvpn-ca
Перейдите в этот каталог
cd ~/openvpn-ca
Откройте файл vars
mcedit vars
В конце файла добавьте строки, изменив данные на свои:
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Sverdlovsk"
export KEY_CITY="Ekaterinburg"
export KEY_ORG="NetAngels"
export KEY_EMAIL="noc@netangels.ru"
export KEY_OU="Community"
И добавьте строку, не меняя ее:
export KEY_NAME="server"
Нажмите F2 на клавиатуре для сохранения.
Далее:
./easyrsa init-pki
После этого выполните. Потребуется ввести пароль от корневого (CA) сертификата
./easyrsa build-ca
Создайте запрос на сертификат:
./easyrsa gen-req server nopass
И одобрите запрос. Введите "yes", чтобы одобрить запрос
./easyrsa sign-req server server
Вывод будет примерно таким:
# ./easyrsa sign-req server server
Note: using Easy-RSA configuration from: ./vars
Using SSL: openssl OpenSSL 1.1.1c 28 May 2019
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 1080 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from /root/openvpn-ca/pki/safessl-easyrsa.cnf
Enter pass phrase for /root/openvpn-ca/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Jan 5 07:38:16 2023 GMT (1080 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /root/openvpn-ca/pki/issued/server.crt
Для работы с протоколом Протокол Диффи — Хеллмана запустите генератор ключа и подождите:
openssl dhparam -out dh2048.pem 2048
Создайте подпись HMAC, которая укрепит степень защиты:
openvpn --genkey --secret pki/ta.key
Сейчас нужно создать ключ и сертификат для клиента:
./easyrsa build-client-full client1 nopass
Все сертификаты и ключи теперь созданы. Осталось настроить openvpn сервер.
Скопируем ключи в каталог конфигурации openvpn.
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/server.crt /etc/openvpn/server/
cp pki/private/server.key /etc/openvpn/server/
cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client1.crt /etc/openvpn/client/
cp pki/private/client1.key /etc/openvpn/client/
cp dh2048.pem /etc/openvpn/server/
cp keys/ta.key /etc/openvpn/server/
Откройте конфигурацию openvpn
mcedit /etc/openvpn/server.conf
Добавьте туда строки:
# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun
tls-auth server/ta.key 0
# OpenVPN Server Certificate - CA, server key and certificate
ca server/ca.crt
cert server/server.crt
key server/server.key
#DH and CRL key
dh server/dh2048.pem
# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.8"
push "dhcp-option DNS 77.88.8.1"
#Enable multiple clients to connect with the same certificate key
duplicate-cn
# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
# Other Configuration
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
# OpenVPN Log
log-append /var/log/openvpn.log
verb 3
Отредактируйте файл /etc/sysctl.conf
mcedit /etc/sysctl.conf
Найдите строку
#net.ipv4.ip_forward=1
Раскомментируйте ее удалив сивол "#" в начале. Сохраните изменения нажав F2.
Примените изменения:
sysctl -p
Попробуйте запустить openvpn сервер:
systemctl start openvpn@server
Если вывод команды
systemctl status openvpn@server
Примерно такой, то настройка vpn сервера прошла успешно:
# service openvpn@server status
● openvpn@server.service - OpenVPN connection to server
Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2020-01-21 10:16:09 UTC; 21min ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 18756 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1167)
Memory: 1.3M
CGroup: /system.slice/system-openvpn.slice/openvpn@server.service
└─18756 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --config /etc/openvpn
Jan 21 10:16:09 docker-host systemd[1]: Starting OpenVPN connection to server...
Jan 21 10:16:09 docker-host systemd[1]: Started OpenVPN connection to server.
Проверьте создан ли сетевой интерфейс:
ip addr show tun0
Если вывод примерно такой, то все создалось корректно:
43: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.5.0.1 peer 10.5.0.2/32 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::4334:784c:f179:fef5/64 scope link stable-privacy
valid_lft forever preferred_lft forever
Включите автозагрузку openvpn при старте сервера:
systemctl enable openvpn@server
Добавьте правило в iptables, чтобы перенаправлять трафик.
iptables -t nat -A POSTROUTING -s 10.5.0.0/24 -o eth0 -j MASQUERADE
Теперь чтобы сохранить правила установите пакет iptables-persistent. Выберите "yes" как минимум для IPv4 правил.
apt install iptables-persistent
Перейдите в /etc/openvpn/client/
cd /etc/openvpn/client
Создайте конфигурацию для VPN клиента (телефона\ноутбука\компьютера):
mcedit base.conf
Измените "xxx.xxx.xxx.xxx" на IP адрес вашего сервера
client
dev tun
proto udp
tls-auth ta.key 1
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
Теперь в /etc/openvpn/client/ должны быть 4 файла
ca.crt
client1.crt
client1.key
base.ovpn
Создайте файл mkconfig.sh
mcedit mkconfig.sh
Заполните его строками:
#!/bin/bash
KEYS=/etc/openvpn/client/
OUTPUT=/etc/openvpn/client/
CONFIG=/etc/openvpn/client/base.conf
cat ${CONFIG} \
<(echo -e '<ca>') \
${KEYS}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEYS}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEYS}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEYS}/ta.key \
<(echo -e '</tls-auth>') \
<(echo -e '\nkey-direction 1') \
> ${OUTPUT}/${1}.ovpn
Добавьте бит исполнения:
chmod +x mkconfig.sh
Выполните этот файл:
./mkconfig.sh client1
По итогу получится файл /etc/openvpn/client/client1.ovpn.
Осталось перенести файл client1.ovpn на ваш компьютер при помощи SFTP или FTP. И далее настроить клиент на телефоне\ноутбуке\компьютере.
Пример настройки для Android (пролистайте до заголовка "OpenVPN ").
Рекомендуем также настроить сетевой экран (firewall) на сервере.