В данной статье мы рассмотрим установку и настройку OpenVPN сервера на базе Linux CentOS 7, и покажем, как с помощью настроенного OpenVPN-сервера объединить в одну сеть два удаленных компьютера (или офиса), находящихся за NAT. Аутентфикацию VPN клиентов мы будем выполнять по сертификатам.
OpenVPN – одна из реализаций технологии VPN с открытым исходным кодом на базе SSL/TLS (основан на библиотеке OpenSSL). С помощью OpenVPN можно объединять в единую сеть как удаленные офисы, так и отдельные локальные ПК, которые находятся за NAT.
Установка OpenVPN и Easy-RSA
Первым шагом нужно подключить репозиторий EPEL и обновить систему:
yum install epel-release -y
yum update -y
Когда система обновится, нужно с помощью менеджера пакетов yum установить OpenVPN и Easy-RSA (он нам понадобится для реализации инфраструктуры PKI ключей на сервере VPN).
yum install openvpn easy-rsa -y
Настройка Easy-RSA и выпуск сертификатов
Скопируем все скрипты easy-rsa в каталог /etc/openvpn/:
cp -r /usr/share/easy-rsa /etc/openvpn/
Перейдем в каталог /etc/openvpn/easy-rsa/3/ и создадим там файл vars:
cd /etc/openvpn/easy-rsa/3/
nano vars
Добавляем содержимое файла (вы можете его исправить под себя):
set_var EASYRSA "$PWD" set_var EASYRSA_PKI "$EASYRSA/pki" set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "RU" set_var EASYRSA_REQ_PROVINCE "MSK" set_var EASYRSA_REQ_CITY "MSK" set_var EASYRSA_REQ_ORG "IT-Company" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "IT department" set_var EASYRSA_KEY_SIZE 4096 set_var EASYRSA_ALGO rsa set_var EASYRSA_CA_EXPIRE 7500 set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_NS_SUPPORT "no" set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY" set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types" set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf" set_var EASYRSA_DIGEST "sha512"
Данные в файле можно взять произвольные, это не помешает настройке и дальнейшей работе сервера.
Файл должен быть исполняемым, поэтому выполним:
chmod +x vars
Создаем ключи и сертификаты для OpenVPN-сервера
Прежде чем создавать ключ, нам нужно выполнить инициализацию каталога PKI и создать ключ CA.
cd /etc/openvpn/easy-rsa/3/
# ./easyrsa init-pki
Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /etc/openvpn/easy-rsa/3/pki
Создаем ключ CA:
./easyrsa build-ca
После запуска команды, нам нужно будет указать пароль, чтобы сертификаты и ключ сгенерировались. Пароль потребуется в дальнейшем для подписания сертификатов.
Создадим ключ сервера (название сервера server.vpn.ru):
опция nopass — отключение пароля для server.vpn.ru
# ./easyrsa gen-req server.vpn.ru nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key ..............................++ ..............++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/server.vpn.ru.key.R4IYCbD1zP' ----- 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. ----- Common Name (eg: your user, host, or server name) [server.vpn.ru]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/server.vpn.ru.req key: /etc/openvpn/easy-rsa/3/pki/private/server.vpn.ru.key
В процессе выпуска сертификата, в графе Common Name нужно нажать Enter,.
Подпишем ключ server.vpn.ru используя наш CA-сертификат:
./easyrsa sign-req server server.vpn.ru
При подписании сертификата потребуется пароль, который мы задавали при выпуске сертификата CA:
Как указано на скриншоте, в процессе нужно будет ввести yes и пароль от CA.
Чтобы убедиться, что сертификаты сгенерировались без ошибок, выполните команду:
# openssl verify -CAfile pki/ca.crt pki/issued/server.vpn.ru.crt
pki/issued/server.vpn.ru.crt: OK
Все сертификата OpenVPN сервера созданы.
- Корневой сертификат расположен: ‘pki/ca.crt’
- Закрытый ключ сервера расположен: ‘pki/private/server.vpn.ru.key’
- Сертификат сервера расположен: ‘pki/issued/server.vpn.ru.crt’
Для генерации ключа клиента, нужно выполнить команду:
./easyrsa gen-req имяклиента nopass
Сгенерируем ключ клиента admin1:
# ./easyrsa gen-req admin1 nopass
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Generating a 4096 bit RSA private key ..........++ ........................++ writing new private key to '/etc/openvpn/easy-rsa/3/pki/private/admin1.key.R5OY6reT2e' ----- 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. ----- Common Name (eg: your user, host, or server name) [admin1]: Keypair and certificate request completed. Your files are: req: /etc/openvpn/easy-rsa/3/pki/reqs/admin1.req key: /etc/openvpn/easy-rsa/3/pki/private/admin1.key
Как и с ключом сервера, нужно его подписать, используя CA-сертификат:
./easyrsa sign-req client admin1
Сертификат для пользователя создан.
Дополнительно нужно сгенерировать ключ Диффи-Хеллмана, который будет использоваться при обмене ключей:
./easyrsa gen-dh
Он генерируется продолжительное время:
После чего генерируем TLS сертификат:
openvpn --genkey --secret ta.key
Если мы в дальнейшем планируем отзывать клиентские сертификаты, нам необходимо сгенерировать CRL ключ:
# ./easyrsa gen-crl
Note: using Easy-RSA configuration from: ./vars Using SSL: openssl OpenSSL 1.0.2k-fips 26 Jan 2017 Using configuration from /etc/openvpn/easy-rsa/3/pki/safessl-easyrsa.cnf Enter pass phrase for /etc/openvpn/easy-rsa/3/pki/private/ca.key: An updated CRL has been created. CRL file: /etc/openvpn/easy-rsa/3/pki/crl.pem
Чтобы отозвать сертификат надо выполнить команду:
./easyrsa revoke admin1
— где admin1 это имя сертификата
Необходимые для работы сертификаты созданы, скопируем их в рабочие директории:
Сертификаты сервера:
cp pki/ca.crt /etc/openvpn/server/
cp pki/issued/server.vpn.ru.crt /etc/openvpn/server/
cp pki/private/server.vpn.ru.key /etc/openvpn/server/
cp pki/private/dh.pem /etc/openvpn/server/
cp pki/private/ta.key /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/
Сертификаты клиента:
cp pki/issued/admin1.crt /etc/openvpn/client/
cp pki/private/admin1.key /etc/openvpn/client/
Настройка OpenVPN сервера: конфигурационный файл, фаервол
Перейдем к настройкам конфигурационного файла OpenVPN. Сначала создадим файл конфигурации OpenVPN server.conf:
cd /etc/openvpn/ && nano server.conf
Меняем содержимое файла на следующее:
# Указываем порт, протокол и устройство port 1194 proto udp dev tun # Указываем пути к сертификатам сервера ca /etc/openvpn/server/ca.crt cert /etc/openvpn/server/server.vpn.ru.crt key /etc/openvpn/server/server.vpn.ru.key #Пути до CRL и DH ключей dh /etc/openvpn/server/dh.pem crl-verify /etc/openvpn/server/crl.pem # Указываем настройки IP сети, адреса из которой будет будут получать VPN клиенты server 15.10.2.0 255.255.255.0 push "redirect-gateway def1" # Указываем назначаемые DNS сервера push "dhcp-option DNS 77.88.8.8" push "dhcp-option DNS 8.8.4.4" # Разрешить подключаться разным клиентам, с одинаковым ключем duplicate-cn # TLS защита tls-auth /etc/openvpn/server/ta.key 0 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 # Другая конфигурация keepalive 20 60 persist-key persist-tun comp-lzo yes daemon user nobody group nobody # Путь до лог файла log-append /var/log/openvpn.log verb 3
После чего сохраняем файл. Я указал стандартный UDP порта 1194 для VPN сервера, но для работы OpenVPN вы можете указать любой свободный порт на сервере.
Осталось настроить правила файервола, чтобы разрешить подключение и маршрутизацию между сегментами.
Если вы используете Firewalld, сначала нужно активировать модуль ядра forwarding:
# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1
Добавим службу openvpn в firewalld, и интерфейс tun0 в доверенную зону
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
Активируем ‘MASQUERADE’ для доверенной зоны firewalld:
firewall-cmd --permanent --zone=trusted --add-masquerade
Активируем NAT:
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 15.10.2.0/24 -o IPсервера -j MASQUERADE
firewall-cmd –reload
iptables -t nat -A POSTROUTING -s 15.10.2.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -p tcp –dport 1194 -j ACCEPT
service iptables save
Запустим OpenVPN и добавим его в автозагрузку Linux:
systemctl start openvpn@server
systemctl enable openvpn@server
Проверим слушается ли порт 1194 сервисом:
# lsof -i:1194
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME openvpn 11887 nobody 5u IPv4 45892 0t0 UDP *:openvpn
Проверим настройки IP сетевого интерефейса:
# ip a
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 15.10.2.1 peer 15.10.2.2/32 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::db7c:7fed:6d4f:70d2/64 scope link flags 800 valid_lft forever preferred_lft forever
Как видим, на устройстве tun0 добавлена указанная при конфигурации сеть.
Это минимальные настройки, которые нужно сделать для работы OpenVPN.
Объединяем несколько офисов (компьютеров) с помощью OpenVPN
Рассмотрим, как подключиться к OpenVPN серверу с двух удаленных компьютеров, которые подключены к интернету через NAT, и организовать общую сеть между ними. Для подключения с Windows компьютера к серверу OpenVPN я использую официальный клиент от разработчиков. Скачать его можно на официальном сайте, заострять на этом внимание не будем, а перейдем сразу к настройке.
После того как вы установили клиент, нужно перейти к файлу конфигурации, который нужно создать по пути:
C:\Program Files\OpenVPN\config\
Я создал файл client и добавил в него следующее содержимое:
client dev tun proto udp remote 182.122.41.12 1194 resolv-retry infinite nobind block-outside-dns persist-key persist-tun mute-replay-warnings remote-cert-tls server tls-client auth SHA512 tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1 remote-cert-eku "TLS Web Server Authentication" ca "C:\\Program Files\\OpenVPN\\config\\ca.crt" cert "C:\\Program Files\\OpenVPN\\config\\admin1.crt" key "C:\\Program Files\\OpenVPN\\config\\admin1.key" cipher AES-256-CBC comp-lzo verb 3
Для настройки нам потребуются созданные нами ранее сертификаты клиента, безопасности и сервера. Их нужно скачать с сервера и поместить в удобную вам директорию, после чего в конфигурационном файле клиента OpenVPN нужно указать путь к ним путь.
После мы подключаемся через ярлык Open VPN client в трее:
Я подключился и получил следующий IP для своего ПК:
IPv4-адрес. . . . . . . . . . . . : 15.10.2.14 Маска подсети . . . . . . . . . . : 255.255.255.252
На втором компьютере за NAT я выполнил те же действия, предварительно создав сертификат для второго пользователя, при подключении второй ПК так же получил IP из сети:
IPv4-адрес. . . . . . . . . . . . : 15.10.2.6 Маска подсети . . . . . . . . . . : 255.255.255.252
После подключения, оба компьютера оказались в одной сети и видят друг друга.
Запускаем пинг на втором ПК:
Обмен пакетами с 15.10.2.14 по с 32 байтами данных: Ответ от 15.10.2.14: число байт=32 время=67мс TTL=127
Запускаем пинг на первом ПК:
Обмен пакетами с 15.10.2.6 по с 32 байтами данных: Ответ от 15.10.2.6: число байт=32 время=71мс TTL=127
Оба подключенные VPN клиента могут обмениваться пакетами, и передавать файлы друг другу напрямую. Таким образом мы смогли объединить в одну локальную сеть два ПК, находящихся в разных точках страны.
На сервере с OpenVPN вы можете создать неограниченное количество ключей и сертификатов для пользователей. Если вам потребуется новый сертификат, выполните следующие команды в директории /etc/openvpn/easy-rsa/3:
./easyrsa gen-req имяклиента nopass
./easyrsa sign-req client имяклиента
Не забывайте периодически отзывать сертификаты клиентов, если они не используются, чтобы сохранить в безопасности ваши данные.