Установка openvpn

Рассмотрим установку сервера OpenVpn
Статей по этому поводу достаточно много, но хе хватает упорядоченности по сертификатам
В идеале самое простое решение – это поставить OpenVpn Access Server с графическим режимом с официального сайта

Установка OpenVpn Access Server

Идем на сайт
https://openvpn.net/download-open-vpn/

Выбираем дистрибутив, в моём случае Debian 10 и следуя мануалу устанавливаем

apt update
apt -y install ca-certificates wget net-tools gnupg
wget -qO - https://as-repository.openvpn.net/as-repo-public.gpg | apt-key add -
echo "deb http://as-repository.openvpn.net/as/debian buster main">/etc/apt/sources.list.d/openvpn-as-repo.list
apt update
apt -y install openvpn-as

Но этот сервер платный и нам доступно только 2 лицензии
Activation Manager
Without activation, your Access Server will allow a total of 2 VPN connections.
2 VPN connections allowed (currently in demo mode)

Ручная установка

Нас же интересует ручная установка без графического интерфейса, а именно самое как оказалось запутанное это генерация сертификатов
Также немного рассмотрим конфигурацию, логирование и маршрутизацию

Сертификаты

Рассмотрим все сертификаты которые использует OpenVpn

dh2048.pemФайл Диффи-Хелмана для защиты трафика от расшифровки
ca.crtСертификат удостоверяющего центра CA
server.crtСертификат сервера OpenVPN
server.keyПриватный ключ сервера OpenVPN, секретный
crl.pemСписок отзыва сертификатов CRL
ta.keyКлюч HMAC для дополнительной защиты от DoS-атак и флуда

Все эти ключи удобно держать в одной папку чтобы не путаться
Можно это делать жесткими ссылками, можно просто копировать
Для начала поставим сервер openvpn, создадим ссылку на механизм генерации сертификатов easy-rsa чтобы было удобнее с ним работать, а так же папку keys в которой будем держать все ключи
Все действия производятся под учетной записью root, так же можно установить sudo и выполнять действия с повышением роли

apt update
apt install openvpn
cd /etc/openvpn/
mkdir keys
ln -s /usr/share/easy-rsa/

Для работы механизма передачи между физическими интерфейсами и интерфейсами openvpn, необходимо включить форвард
Это можно сделать отредактировав файл /etc/sysctl.conf

nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Перезагружаемся и проверяем

sysctl -p
sysctl net.ipv4.ip_forward

Или включить на лету. В случае включения на лету будет работать до перезагрузки. Поэтому самый быстрый вариант прописать в файл конфигурации и включить тут же на лету

sysctl -w net.ipv4.ip_forward=1

Генерация сертификатов

Мы уже создали папку для генерации сертификатов. Теперь необходимо сгенерировать каждый сертификат и переместить его в эту папку, далее уже в конфигурации сервера openvpn будем указывать расположение сертификатов в этой папке. Можно генерировать поштучно, можно написать скрипт и выполнить его. На все вопросы отвечаем утвердительно. Информацию в полях сертификата я не заполнял
Скрипт генерирует сертификаты и копирует их в папку keys

nano gen_certs
#!/bin/bash
cd /etc/openvpn/keys/
openssl dhparam -out dh2048.pem 2048
openvpn --genkey --secret ta.key
cd /etc/openvpn/easy-rsa/
/etc/openvpn/easy-rsa/easyrsa init-pki
/etc/openvpn/easy-rsa/easyrsa build-ca nopass
/etc/openvpn/easy-rsa/easyrsa gen-req server nopass
/etc/openvpn/easy-rsa/easyrsa sign-req server server
/etc/openvpn/easy-rsa/easyrsa gen-crl
#
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/keys/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/keys/
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/keys/
chmod +x gen_certs

Главное не пропустить строчку где надо будет написать yes иначе сертификат не будет создан

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: 

Aborting without confirmation.

Если вдруг пропустили этот момент, то можно запустить скрипт по новой, так как директива easyrsa init-pki затирает старую конфигурацию

WARNING!!!

You are about to remove the EASYRSA_PKI at: /etc/openvpn/easy-rsa/pki
and initialize a fresh PKI here.

Type the word 'yes' to continue, or any other input to abort.
  Confirm removal: yes

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki
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 /etc/openvpn/easy-rsa/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok

В папке keys должны появиться сертификаты

/etc/openvpn/keys/
├── ca.crt
├── crl.pem
├── dh2048.pem
├── server.crt
├── server.key
└── ta.key

Конфигурация сервера

Теперь необходимо создать файл конфигурации сервера. Изначально он отсутствует в папке /etc/openvpn/
Шаблон конфигурации лежит /usr/share/doc/openvpn/examples/sample-config-files/
Скопируем конфигурацию и очистим от неиспользуемых строк

cd /etc/openvpn/
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip server.conf.gz
cp server.conf server.conf.bak
cat server.conf.bak | grep -v "^#\|^$\|^;" > server.conf

В итоге получим чистую конфигурацию без лишних строк. Посмотреть параметры которые могут быть использованы можно посмотреть в файле резерва /etc/openvpn/server.conf.bak
Сама базовая конфигурация

nano server.conf
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1

Теперь нам необходимо добавить

  • пути до сертификатов
  • если адрес внутренней сети не пересекается с рабочей, то его можно не менять 10.8.0.0 255.255.255.0
  • маршрут до рабочей сети 192.168.10.0 255.255.255.0
  • адрес DNS сервера для разрешения имён 192.168.10.10
  • максимальное количество клиентов 50
  • пути до файлов логов, чтобы отслеживать ошибки и мониторинг активных пользователей

Так же чтобы не генерировать для каждого пользователя сертификат я сделал авторизацию через логин и пароль учетной записи linux. Этот метод считается небезопасным. Фактически в моей конфигурации не используется файл сертификата server.key. Если вам необходима авторизация по сертификатам, то раздел “Плагин авторизации pam” использовать не надо

port 1194
proto udp

dev tun

# Сертификаты
# ==============================================
ca         /etc/openvpn/keys/ca.crt
crl-verify /etc/openvpn/keys/crl.pem
dh         /etc/openvpn/keys/dh2048.pem
cert       /etc/openvpn/keys/server.crt
key        /etc/openvpn/keys/server.key
tls-auth   /etc/openvpn/keys/ta.key 0

# Плагин авторизации pam
# ==============================================
plugin openvpn-plugin-auth-pam.so service-type
client-cert-not-required
username-as-common-name

# Сеть сервера
# ===========================
server 10.8.0.0 255.255.255.0
max-clients 50

# Разрешить несколько подключений
# ===============================
duplicate-cn

# Маршрут до сети и адрес DNS сервера
# ===================================
push "dhcp-option DNS 192.168.10.10"
push "route 192.168.10.0 255.255.255.0"

comp-lzo
keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun

status                  /var/log/openvpn/openvpn-status.log
log                     /var/log/openvpn/openvpn.log
log-append              /var/log/openvpn/openvpn.log
ifconfig-pool-persist   /var/log/openvpn/ipp.txt

mssfix
topology subnet

verb 3
explicit-exit-notify 1

/var/log/openvpn/openvpn-status.log – список подключившихся пользователей
/var/log/openvpn/openvpn.log – лог ошибок

Запуск сервера OpenVpn

Как оказалось по-умолчанию служба сервера openvpn не включена в автозагрузку.
Это сделано так как устанавливается клиент и сервер одновременно, и можно сделать выбор что запускать в зависимости от настройки.
Включаем службу сервера и запускаем. Если все сделали правильно то у нас появляется виртуальный интерфейс tun0. Если нет то читаем вывод ошибок journalctl -xe

systemctl enable openvpn-server@
systemctl start openvpn@server.service
systemctl status openvpn@server.service
ip a
.................
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1/24 brd 10.8.0.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::1f6c:9a09:47fd:a9c2/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
.................

Подключение клиента

Подключение и вариации клиентов я рассматривал в статье настройки OpenVpn на Mikrotik https://imbicile.pp.ru/nastrojka-openvpn-mikrotik/
Суть примерно та же. Необходимо создать файл конфигурации ovpn, указать адрес\имя сервера, а так же добавить содержимое файлов сертификатов. Так как я настраивал без сертификатов пользователя, то отличие только в отсутствии директив:

<cert></cert> - server.crt  Сертификат сервера OpenVPN
<key></key> - server.key  Приватный ключ сервера OpenVPN, секретный

Создадим пользователей на сервере

useradd -s /sbin/nologin -M vpn_user_1
useradd -s /sbin/nologin -M vpn_user_2
useradd -s /sbin/nologin -M vpn_user_3

Зададим им пароли

passwd vpn_user_1
passwd vpn_user_2
passwd vpn_user_3

Адрес сервера для примера 10.10.77.161
Содержимое сертификатов

<ca></ca> - ca.crt Сертификат удостоверяющего центра CA
<tls-auth></tls-auth> - ta.key Ключ HMAC для дополнительной защиты от DoS-атак и флуда

Файл конфигурации клиента home.ovpn

dev tun
proto udp
remote 10.10.77.161 1194
client
resolv-retry infinite

auth-user-pass

remote-cert-tls server
persist-key
persist-tun

key-direction 1

cipher AES-256-CBC

comp-lzo
verb 3
status-version 3
################################################################
<ca>
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUM1AdXV5ZjOcwlTtY1NTxGqfGQk4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjAwNDMwMDgwNDU0WhcNMzAw
NDI4MDgwNDU0WjAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAKoKueKlwE3VfY6X6Z6fh0V8dzOiaY1ZDPjQ/5w4
dbHwdoYc5/xJqaPajcS+N9dfOV+SbLEvxZmNFiyWkxnirBvDRRDvJDbfITfw0FRE
ZXwJtuejJEA9CCn2983xrFIUoC10JV/L3OOoHaWLqFtImQzSlTeLmytjKH5FODdo
FDeQwTx+TcrDblbsXRUSq57g74X2icBiGQJ0M3VUMFDX2c7LaYWx/BWylJmNXXZu
pV1RX9ZMWzGLPzhZ+eMaXjMiJobb0bv50mV7XeeL53YCO/ulyj3+HqENn7YeVMGP
XpE8lIH/9VYx2lBPqxAEtUjvhqEsnz9tznv3yCynRmxiFM0CAwEAAaOBkDCBjTAd
BgNVHQ4EFgQURLbZ51oVfFiiXSaju5FxPUubnq0wUQYDVR0jBEowSIAURLbZ51oV
fFiiXSaju5FxPUubnq2hGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBghQzUB1d
XlmM5zCVO1jU1PEap8ZCTjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
hkiG9w0BAQsFAAOCAQEAi5QyvDrjr8rsQZyIXlbJ/nb0Uj5+9B5grf3vQ54eCAue
7niGmuKge8aYDh+DzHNj9X7/t8UIogXpj8aJz62Ce+6VALPODPVe0uv/q972iuo6
zKZVewfxSocxySK0/DPlciUbdTgHvzbarVgOVA6t5I8aH1YSjOK4D3+VkrY5+lRw
ywCI7vkYCXivhRsPUJG5z59dXpTeHWjhDdq4qI2kDn/LymhZuCSdiKdAURHMG5D3
ohP465EhhCsb/4S/DLXZYdJQI7fS2GR74dzxSQGjiSDITMk9HJuNUVUtuCRnrwrD
KC8qWJYEbbVElmoAuHU4ML/qGlAf3Gt4F6pDalEQQg==
-----END CERTIFICATE-----
</ca>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
c990d483c42f6e1cc4ac0564be2e7c1c
1f33bd4c8f7064e03a1201d35c714483
eab9411e3124029986c50370c72ce2ec
dbd2e3144eb536f0bc2ed98bf7c6fe9d
f9ace544c7e779d332059bbdbe9723e2
c80d3d4543eb30230f73092ab65c42b5
96df45e23e1c34f10222070549632e63
4d12ea3d09e2624562bf9bedb56d5f0d
7cba9762ef8144cc3d6db69d157d45f7
1849cd77eda251255f0183209298953c
397ddb2e99a81d5dd5636baf13e63827
2ec32fee7f0607974010fddb9d13f697
827385325067f37b163139a3e085f1b6
7485ed961e569f4dd7d0b1d300943883
bbff93163a35c6645cab71ac2513e936
e4007811ffda0a183e2e8a8cda0bb3c0
-----END OpenVPN Static key V1-----
</tls-auth>

Проверяю подключение с ПК Linux так как под рукой только он, и можно увидеть вывод подключения. Подключается под учетной записью root

openvpn --config home.ovpn
Thu Apr 30 11:59:08 2020 OpenVPN 2.4.9 [git:makepkg/9b0dafca6c50b8bb+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 20 2020
Thu Apr 30 11:59:08 2020 library versions: OpenSSL 1.1.1g  21 Apr 2020, LZO 2.10
Enter Auth Username: vpn_user_1
Enter Auth Password: **************          
Thu Apr 30 11:59:25 2020 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Apr 30 11:59:25 2020 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Apr 30 11:59:25 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]10.10.77.161:1194
Thu Apr 30 11:59:25 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]
Thu Apr 30 11:59:25 2020 UDP link local (bound): [AF_INET][undef]:1194
Thu Apr 30 11:59:25 2020 UDP link remote: [AF_INET]10.10.77.161:1194
Thu Apr 30 11:59:25 2020 TLS: Initial packet from [AF_INET]10.10.77.161:1194, sid=3d125b63 9743ac39
Thu Apr 30 11:59:25 2020 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Thu Apr 30 11:59:25 2020 VERIFY OK: depth=1, CN=Easy-RSA CA
Thu Apr 30 11:59:25 2020 VERIFY KU OK
Thu Apr 30 11:59:25 2020 Validating certificate extended key usage
Thu Apr 30 11:59:25 2020 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
Thu Apr 30 11:59:25 2020 VERIFY EKU OK
Thu Apr 30 11:59:25 2020 VERIFY OK: depth=0, CN=server
Thu Apr 30 11:59:25 2020 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 2048 bit RSA
Thu Apr 30 11:59:25 2020 [server] Peer Connection Initiated with [AF_INET]10.10.77.161:1194
Thu Apr 30 11:59:27 2020 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Thu Apr 30 11:59:27 2020 PUSH: Received control message: 'PUSH_REPLY,dhcp-option DNS 192.168.10.10,route 192.168.10.0 255.255.255.0,route-gateway 10.8.0.1,topology subnet,ping 10,ping-restart 120,ifconfig 10.8.0.2 255.255.255.0,peer-id 0,cipher AES-256-GCM'
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: timers and/or timeouts modified
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: --ifconfig/up options modified
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: route options modified
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: route-related options modified
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: peer-id set
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: adjusting link_mtu to 1625
Thu Apr 30 11:59:27 2020 OPTIONS IMPORT: data channel crypto options modified
Thu Apr 30 11:59:27 2020 Data Channel: using negotiated cipher 'AES-256-GCM'
Thu Apr 30 11:59:27 2020 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Thu Apr 30 11:59:27 2020 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Thu Apr 30 11:59:27 2020 ROUTE_GATEWAY 10.10.77.1/255.255.255.0 IFACE=wlp4s0 HWADDR=00:13:e8:32:e8:e7
Thu Apr 30 11:59:27 2020 TUN/TAP device tun0 opened
Thu Apr 30 11:59:27 2020 TUN/TAP TX queue length set to 100
Thu Apr 30 11:59:27 2020 /usr/bin/ip link set dev tun0 up mtu 1500
Thu Apr 30 11:59:27 2020 /usr/bin/ip addr add dev tun0 10.8.0.2/24 broadcast 10.8.0.255
Thu Apr 30 11:59:27 2020 /usr/bin/ip route add 192.168.10.0/24 via 10.8.0.1
Thu Apr 30 11:59:27 2020 Initialization Sequence Completed
ip a
.................
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
        inet 10.8.0.2/24 brd 10.8.0.255 scope global tun0
               valid_lft forever preferred_lft forever
                   inet6 fe80::873b:1afc:306b:6cf9/64 scope link stable-privacy 
                          valid_lft forever preferred_lft forever
.................
ip r
.................
192.168.10.0/24 via 10.8.0.1 dev tun0
.................

Маршрутизация

А именно openvpn не видит сеть за сервером
Это возникает в том случае, если сервер openvpn не является шлюзом для машин к которым необходимо подключится. Поэтому нам необходимо все что пришло из сети OpenVPN tun0 в локальную сеть eth0 транслировать используя маскарадинг. Проверить можно сразу

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Добавить чтобы правило применялось после перезагрузки можно в интерфейсах

nano /etc/network/interfaces
post-up iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Послесловие

Надеюсь написал достаточно понятно. Статей по настройке и установки OpenVpn достаточно много, и лучше еще посмотреть дополнительный материал для разъяснения. В данный момент установка приведённая в примере работает уже на протяжении 2х месяцев. Были ошибки с постоянным переподключением клиентов. Как оказалось клиенты были установлены у пользователей в нескольких местах, на телефоне и на ПК. Поэтому в конфигурацию сервера добавлена директива duplicate-cn
Так же есть возможность подключения WEB мониторинга подключенных клиентов, но его установка мне пока не потребовалась, поэтому сказать про неё ничего не могу. Если доберусь, то опубликую
https://github.com/furlongm/openvpn-monitor

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *