Как настроить VPN на сервере

24 января 2020
1645
Debian

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

Мы используем файлы cookie для предоставления наших услуг, а также для аналитики и маркетинга. Продолжая просматривать наш веб-сайт, вы соглашаетесь на использование нами файлов cookie.
ОК