Налаштування openvpn

Нам треба з'єднати віддаленого співробітника до робочої мережі. Це робиться в тому числі за допомогою VPN, в нашому випадку, OpenVPN. Це безкоштовний, досить надійний і не дуже складний в налаштуванні сервер і клієнт VPN.

Структура нашої мережі така:

Налаштування openvpn

Початкова установка проста для будь-якої популярної операційної системи:

Мабуть, не скажу нічого про Mac OS, тому що не стикався особисто.

Установка OpenVPN в Linux

Я використовую CentOS, тому можу описати установку саме для цього Linux.

Як і всюди, скачати пакет і встановити не є гуд, тому що його буде важче оновлювати. А тому "Yum install openvpn" видасть фіг, треба нам підключити репозиторій.

Варіант 1 - спробувати поставити репозиторій з самого openvpn.net:

Швидше за все, це у вас не пройде :)

Варіант 2 - репозиторій RPMForge

Перевіримо, чого наставили:

Особливо не захоплюйтеся всякими репозиторіями :) Чим менше їх, тим краще.

Отже, щоб ви не робили, ви повинні успішно виконати команду:

# Yum install openvpn

Installed:
openvpn.i386 0: 2.3-3

Dependency Installed:
pkcs11-helper.i686 0: 1.08-1.el6.rf

Первинна настройка OpenVPN

Незалежно від того, на FreeBSD, Linux або Windows, загальні кроки по створенню необхідної інфраструктури для OpenVPN практично однакові.

Копіюємо файл конфігурації:

# Cp /usr/share/doc/openvpn-*/sample-config-files/server.conf / etc / openvpn /

Копіюємо пакет управління RSA ключами з поставки OpenVPN в / etc / openvpn / easy-rsa:

# Cp /usr/share/doc/openvpn-*/easy-rsa/2.0/ / etc / openvpn /
# Cd / etc / openvpn / easy-rsa
# Cp openssl-1.0.0.cnf openssl.cnf
# Mkdir keys

Редагуємо файл / etc / openvpn / rsa-keys / vars:

export KEY_COUNTRY = "RU"
export KEY_PROVINCE = "RU"
export KEY_CITY = "Moscow"
export KEY_ORG = "Company"
export KEY_EMAIL = "[email protected]"
export [email protected]
export KEY_CN = changeme
export KEY_NAME = changeme
export KEY_OU = Office
export PKCS11_MODULE_PATH = changeme
export PKCS11_PIN = 1234

Далі слід експортувати змінні KEY_ *, вони необхідні для роботи скриптів build- *, що генерують сертифікати. На цьому кроці можу відзначити, що у мене не відразу вийшло експортувати змінні з файлу / etc / openvpn / easy-rsa / keys. довелося робити скрипт з експортом системної змінної $ PATH, але, як мені здається, це чисто у мене така проблема була (в Windows-версії C: Program FilesOpenVPNeasy-rsavars.bat змінні експортувалися без проблем):

# Cd / etc / openvpn / easy-rsa
# ./vars

У Windows відкрийте командний рядок "cmd":

cd "C: Program FilesOpenVPNeasy-rsa
vars.bat

Зазначу про всяк випадок, що якщо ви не можете виконати будь-якої скрипт, найімовірніше у нього просто немає прав на запуск, наприклад, при запуску ./build-ca я спочатку отримав таке повідомлення:

Please edit the vars script to reflect your configuration,
then source it with "source ./vars".
Next, to start with a fresh PKI configuration and to delete any
previous certificates and keys, run "./clean-all".
Finally, you can run this tool (pkitool) to build certificates / keys.

Про що це? А просто-напросто змінні з файлу vars НЕ екпортіровалісь, тому що vars не виконав, тому що йому потрібні права на запуск, тобто "Chmod + x vars". Мені довелося дати права на запуск декількох файлів, в тому числі:
build-ca, clean-all, pkitool, vars, whichopensslcnf.

Видаляємо всі попередні файли ключів і сертіфкатов з директорії / etc / openvpn / easy-rsa / keys (ця директорія вказана у змінній KEY_DIR файлу vars):

# Chmod + x clean-all
# ./clean-all

Створюємо сертифікат справжності (Certificate Authority) сервера:

# Chmod + x build-ca
# Chmod + x pkitool
# ./build-ca

++++++
. ++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server's hostname) [changeme]: VPNServer
Name [changeme]: Name
Email Address [[email protected]]:

Ок, ми начебто все зробили.

Будьте уважні при заповненні даних сертифікатів, поле Common Name обов'язково до заповнення, причому для сервера воно повинно бути одне, а для клієнта інше. Наприклад в поле Common Name при генерації сертифіката X.509 для сервера можна написати "server", а для клієнта соотвественно "client".

Створюємо сертифікат X.509 для сервера.

# Chmod + x build-key-server
# ./build-key-server server
Generating a 1 024 bit RSA private key
.++++++
. ++++++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', The field will be left blank.
-----
Country Name (2 letter code) [RU]:
State or Province Name (full name) [RU]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Company]:
Organizational Unit Name (eg, section) [Office]:
Common Name (eg, your name or your server's hostname) [server]:
Name [changeme]: IAmServer
Email Address [[email protected]]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName: PRINTABLE: 'RU'
stateOrProvinceName: PRINTABLE: 'RU'
localityName: PRINTABLE: 'Moscow'
organizationName: PRINTABLE: 'Company'
organizationalUnitName: PRINTABLE: 'Office'
commonName: PRINTABLE: 'server'
name: PRINTABLE: 'IAmServer'
emailAddress: IA5STRING:'[email protected] '
Certificate is to be certified until Apr 7 12:15:29 2 022 GMT (3650 days)
Sign the certificate? [Y / n]: y

1 out of 1 certificate requests certified, commit? [Y / n] y
Write out database with 1 new entries
Data Base Updated

Для створення файлу параметрів Діффі-Хелмана, призначеного для забезпечення більш надійного захисту даних під час активного з'єднання клієнта з сервером, виконуємо:

# Chmod + x build-dh
# ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

Створюємо сертифікати для віддаленого клієнта:

# ./build-key-pass Client1
Generating a 1 024 bit RSA private key
. ++++++
. ++++++
writing new private key to 'Client1.key'
.


1 out of 1 certificate requests certified, commit? [Y / n] y
Write out database with 1 new entries
Data Base Updated

На останок генеруємо загальний для клієнта і сервера TLS-ключ, службовець додатковим захистом. TLS надає можливості аутентифікації і безпечної передачі даних через Інтернет з використанням криптографічних засобів. Часто відбувається лише аутентифікація сервера, в той час як клієнт залишається нерозпізнаних. Для взаємної аутентифікації кожна зі сторін повинна підтримувати інфраструктуру відкритого ключа (PKI), яка дозволяє захистити клієнт-серверні додатки від перехоплення повідомлень, редагування існуючих повідомлень і створення підроблених (джерело: wikipedia).

openvpn --genkey --secret ta.key

В результаті в папці / etc / openvpn / easy-rsa / keys ми маємо такі файли:

ca.crt - головний сертифікат справжності (Certificate Authority), цей файл потрібен і клієнту і серверу
dh1024.pem - ключ Діффі Хельмана, цей файл потрібен тільки серверу
server.crt - сертифікат X.509 сервера (стандарт X.509 ITU-T є фундаментальним стандартом, що лежить в основі всіх інших, які використовуються в Інфраструктурі Відкритих Ключів (ІВК). Основне його призначення - визначення формату електронного сертифіката та списків відкликаних сертифікатів), потрібен тільки серверу
server.key - ключ сервера, потрібен тільки сервера (СЕКРЕТНИЙ файл)
client1.crt - сертифікат X.509 клієнта, потрібен тільки клієнту
client1.key - ключ клієнта, потрібен тільки клієнтові (СЕКРЕТНИЙ файл)
ta.key - TLS-ключ, потрібен і клієнту і серверу

Сервера - одне, клієнту - інше

Тепер в папку / etc / openvpn / keys на майбутньому сервері OpenVPN скопіюємо файли ca.crt, dh1024.pem, server.crt, server.key і ta.key:

# Mkdir / etc / openvpn / keys
# Cp /etc/openvpn/easy-rsa/keys/ca.crt dh1024.pem server.crt server.key ta.key / etc / openvpn / keys

В папку майбутнього клієнта / etc / openvpn / client1 скопіюємо файли ca.crt, client1.crt, client1.key і ta.key:

# Mkdir / etc / openvpn / client1
# Cp /etc/openvpn/easy-rsa/keys/ca.crt client1.crt client1.key ta.key / etc / openvpn / client1

Тепер підкаталог "client1" можна скопіювати в папку конфігурації майбутнього віддаленого клієнта Windows.

В принципі, в папці / etc / openvpn / easy-rsa / keys / всі файли можна залишити, на всякий випадок :) Права на доступ до папки openvpn краще оновити до правильних:

# Chown -R root: wheel / etc / openvpn

Конфиг сервера OpenVPN

Розташування файлу конфігурації сервера: "/etc/openvpn/config/server.conf" (для Windows: "C: Program FilesOpenVPNconfigserver.ovpn").

Приклад файлу конфігурації сервера OpenVPN (підходить для Windows, Linux, FreeBSD з мінімальними змінами):

# На сайті розробників рекомендується використовувати udp в тому числі
# З міркувань безпеки
proto udp

ca "/etc/openvpn/keys/ca.crt"
cert "/etc/openvpn/keys/server.crt"
key "/etc/openvpn/keys/server.key" # Цей файл зберігати в секреті!

# Включаємо TLS аутіфікацію
tls-server
# Вказуємо tls-ключ, і вказуємо 0 для сервера, а 1 для клієнта
tls-auth "/etc/openvpn/keys/ta.key" 0
# Таймаут до реконекту
tls-timeout 120
auth MD5

# Задаємо МАРШРУТ який передаємо клієнту
# І маску підмережі для того щоб він "бачив"
# Мережу за OpenVPN сервером (мережа 192.168.10.0/24)
push "route 192.168.10.0 255.255.255.0"

route 192.168.10.0 255.255.255.0

# Утримувати з'єднання (корисно при роботі через nat, proxy і т.п.)
keepalive 10 120

# Включаємо шифрацию пакетів
cipher BF-CBC

# Включити стиск (якщо є проблеми при з'єднанні - вимкніть цю опцію на клієнті і сервері)
comp-lzo

# Максимум клієнтів
max-clients 5

; User nobody
; Group nobody

# Чи не перечитувати ключі після отримання
# SIGUSR1 або ping-restart
persist-key
# Тримати і перевідкривати TUNTAP
# Пристрій, після отримання
# SIGUSR1 або ping-restart
persist-tun

# Клієнти можуть "бачити" один одного
client-to-client

log "/etc/openvpn/log/openvpn.log"
log-append "/etc/openvpn/log/openvpn.log"

# Рівень деталізації звітів
verb 3

Примітки до конфігураційного файлу сервера OpenVPN

В даному конфіги будуть тільки дві відмінності у версіях сервера для Unix або для Windows.

1. Шляхи розташування файлів конфігурації, сертифікатів тощо. В конфіги для Windows повинні прописуватися так:

dh "C: Program FilesOpenvpnconfigdh1024.pem"

а в Linux / FreeBSD так:

; User nobody
; Group nobody

user nobody
group nobody

З конфіг для сервера, в принципі, все. Для початку роботи цілком достатньо того конфіга, який вказаний вище.

Автозапуск сервера OpenVPN в Linux / FreeBSD

#! / Bin / sh
dir = / etc / openvpn / config
modprobe tun
echo 1> / proc / sys / net / ipv4 / ip_forward
openvpn --cd $ dir --daemon --config /etc/openvpn/config/server.conf
# Речі, тут можна запускати кілька серверів OpenVPN одночасно:
# Openvpn --cd $ dir --daemon --config /etc/openvpn/config/server2.conf

або такий (наприклад, під FreeBSD):

openvpn_enable = "YES"
openvpn_if = "tun" #
openvpn_configfile = "/ etc / openvpn / config / server.conf"
openvpn_dir = "/ etc / openvpn" # --cd directory

Конфиг клієнта OpenVPN на Windows XP

Файли клієнта беремо з папки / etc / openvpn / client1 на сервері і копіюємо їх в папку "C: Program FilesOpenVPNconfig" на клієнті.

Розташування файлу конфігурації клієнта: "C: Program FilesOpenVPNconfigclient1.ovpn" (для Linux / FreeBSD розташування, вважаю, будь-де в домашній папці користувача, наприклад, "/home/vpn/client1.ovpn").

Приклад файлу конфігурації клієнта OpenVPN:

ca "C: Program FilesOpenVPNconfigca.crt"
cert "C: Program FilesOpenVPNconfigclient1.crt"
key "C: Program FilesOpenVPNconfigclient1.key"

tls-client
tls-auth "C: Program FilesOpenVPNconfigta.key" 1
auth MD5

# Це ще одна захист, на цей раз від "man in the middle" атаки
ns-cert-type server

Також треба налаштувати брандмауер для того, щоб зовнішні клієнти OpenVPN могли "бачити" мережу "за NAT". Я приведу частина конфіга iptables працює шлюзу CentOS / Squid (внутрішня мережа 192.168.10.0/24):

З цими конфіга клієнт VPN може працювати з комп'ютерами локальної мережі. Якщо у вас є свої міркування з приводу налаштувань iptables і маршрутизації - буду дуже вдячний. Та й читачі також. Адже якщо ви читаєте цю статтю, ви напевно знаєте, що на цю тему вже давно точаться суперечки.

Відгук клієнтського сертифіката

Щоб відкликати сертифікат будь-якого клієнта (наприклад, при втраті планшета з налаштованим OpenVPN), тобто зробити так, щоб клієнт більше не зміг підключитися до сервера, використовуючи свій сертифікат, треба зробити кілька простих дій.

# Cd /etc/openvpn/easy-rsa/2.0/
#. /etc/openvpn/easy-rsa/2.0/vars
# ./revoke-full client25


error 23 at 0 depth lookup: certificate revoked

Після успішного виконання останньої команди (ви повинні побачити останній рядок) в директорії /etc/openvpn/easy-rsa/2.0/keys буде створений файл файл crl.pem (CRL - certificate revocation list - список відкликаних сертифікатів). Скопіюйте його в директорію, де у вас знаходяться інші файли, що мають відношення до працюючого сервера OpenVPN. За ідеєю, це директорія / etc / openvpn. Про всяк випадок, перевірте наявність в цій директорії старого файлу crl.pem (є хороша практика - спочатку зробити резервну копію). Врахуйте, що в команді маються на увазі відносні шляхи, а не абсолютні:

# Cp keys / crl.pem / etc / openvpn /

А тепер зазначимо нашого сервера перевіряти список відкликаних сертифікатів кожен раз при підключенні нового клієнта. Для цього треба додати в конфіг сервера (можливо, /etc/openvpn/server.conf) одну сходинку:

Перезавантажити сервер OpenVPN:

# Service openvpn restart

Тепер навіть якщо ви не видалили з сервера ключі користувача client25, він не зможе підключитися.

Схожі статті

Copyright © 2024