OpenVPN-Server на Centos 7
Устанавливаем репозиторий EPEL (если нет)
# yum install epel-release
Устанавливаем NET-Tools (если нет)
# yum install net-tools
Установка OpenVPN-Server и Easy-RSA
# yum install openvpn easy-rsa
Создаем директорию для генерации сертификатов и копируем туда Easy-RSA
# mkdir /etc/openvpn/easy-rsa
# cp -rf /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa
Переходим в директорию и создаем файл vars
# cd /etc/openvpn/easy-rsa
# vi vars
Записываем в файл 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 "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "My Organisation"
set_var EASYRSA_REQ_EMAIL "admin@itdraft.ru"
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"
set_var EASYRSA_CRL_DAYS 720
Делаем файл исполняемым
# chmod +x vars
Создание ключа и сертификата для OpenVPN Сервера
Инициализация каталог PKI
# ./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/pki
Создать ключ CA
# ./easyrsa build-ca
будет запрошен пароль, его будет запрашивать в дальнейшем при создании сертификатов
Создадим ключ сервера (название сервера srv-openvpn)
# ./easyrsa gen-req srv-openvpn nopass
опция nopass — отключение пароля для srv-openvpn
Подпишем ключ srv-openvpn используя наш CA-сертификат
# ./easyrsa sign-req server srv-openvpn
на вопрос: Confirm request details: — ответить: yes
в процессе у нас спросят пароль, который мы задавали CA
Проверим файлы сертификата, что бы убедится, что сертификаты сгенерировались без ошибок
# openssl verify -CAfile pki/ca.crt pki/issued/srv-openvpn.crt
pki/issued/srv-openvpn.crt: OK
Создание ключа клиента
# cd /etc/openvpn/easy-rsa
Сгенерируем ключ клиента client-01
# ./easyrsa gen-req client-01 nopass
Подпишем ключ client-01, используя наш CA сертификат
# ./easyrsa sign-req client client-01
на вопрос: Confirm request details: — ответить: yes
в процессе у нас спросят пароль, который мы задавали CA
Проверим файлы сертификата
# openssl verify -CAfile pki/ca.crt pki/issued/client-01.crt
pki/issued/client-01.crt: OK
Дополнительная настройка OpenVPN сервера
Сгенерируем ключ Диффи-Хеллмана
# ./easyrsa gen-dh
Сгенерируем CRL ключ необходимый для отзыва клиентских сертификатов
# ./easyrsa gen-crl
Для того, что бы отозвать сертификат надо выполнить команду (НА БУДУЩЕЕ)
# ./easyrsa revoke client-02
после каждого отозванного сертификата необходимо обновлять CRL ключ
Копируем сертификаты сервера
# cp pki/ca.crt /etc/openvpn/server/
# cp pki/issued/srv-openvpn.crt /etc/openvpn/server/
# cp pki/private/srv-openvpn.key /etc/openvpn/server/
# cp pki/dh.pem /etc/openvpn/server/
# cp pki/crl.pem /etc/openvpn/server/
Копируем сертификаты клиента
# cp pki/ca.crt /etc/openvpn/client/
# cp pki/issued/client-01.crt /etc/openvpn/client/
# cp pki/private/client-01.key /etc/openvpn/client/
Настройка OpenVPN сервера
Создадим файл конфигурации server.conf
# cd /etc/openvpn
# vi server.conf
Записываем в файл server.conf
# OpenVPN Port, Protocol and the Tun
port 1194
#proto udp
proto tcp
dev tun
# OpenVPN Server Certificate - CA, server key and certificate
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/srv-openvpn.crt
key /etc/openvpn/server/srv-openvpn.key
# DH and CRL key
dh /etc/openvpn/server/dh.pem
crl-verify /etc/openvpn/server/crl.pem
# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.0.10.0 255.255.255.0
push "redirect-gateway def1"
#push "route 82.146.59.16 255.255.255.255"
# Using the DNS from https://dns.watch
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Enable multiple client to connect with 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
comp-lzo yes
daemon
user nobody
group nobody
# Статус подключения списка клиентов
status /etc/openvpn/openvpn-status.log
# Разрешить клиентам видеть друг-друга
client-to-client
# OpenVPN Log
log-append /var/log/openvpn.log
verb 3
Настройка Firewalld
Отредактировать файл /etc/sysctl.conf:
Добавить:
net.ipv4.ip_forward = 1
Выполняем команду
# sysctl -p
Настройка для firewalld
firewall-cmd --permanent --add-masquerade
firewall-cmd --zone=public --add-port=1194/tcp --permanent
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.0.10.0/24 -o eth0 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -s 10.0.10.0/24 -o eth0 -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i eth0 -d 10.0.10.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -p tcp --tcp-flags SYN,RST SYN -s 10.0.10.0/24 -j TCPMSS --clamp-mss-to-pmtu
firewall-cmd --reload
настройка для iptables
открыть пот 1194 для подключения клиентов
iptables -I INPUT -i eth0 -m state --state NEW -p tcp --dport 1194 -j ACCEPT
разрешим интерфейсу tun коммуникацию с другими интерфейсами в системе
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
включить nat
iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -o eth0 -j MASQUERADE
разрешить исходящий трафик на tun-инмерфейсе
iptables -A OUTPUT -o tun+ -j ACCEPT
сохранить правила iptables
service iptables save
Запустим OpenVPN и добавим его в автозагрузку
# systemctl start openvpn@server
# systemctl enable openvpn@server
Проверим
# systemctl status openvpn@server
Настройка OpenVPN клиента
Создадим файл конфигурации client-01.ovpn
# cd /etc/openvpn/client
# vi client-01.ovpn
Записываем в файл client-01.ovpn
client
dev tun
proto tcp
remote xx.xx.xx.xx 1194
remote-cert-tls server
ca ca.crt
cert client-01.crt
key client-01.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 lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
в строке ‘remote xx.xx.xx.xx 1194‘ надо прописать IP-адрес вместо ‘xx.xx.xx.xx‘
Чтобы через соединение работала только определенная подсеть, к примеру локалка, а интернет текущий:
route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0
Теперь для надо заархивировать сертификаты (ca.crt, client-01.crt), ключ клиента (client-01.key), файл конфигурации (client-01.ovpn), и передать их на ПК, который будет подключаться к OpenVPN серверу
Для подключения с iPhone, iPad, Mac: Passepartout, OpenVPN Client
Для подключения с андройда лучше использовать: OpenVPN for Android
https://openvpn.net/community-downloads/
Скачать APK OpenVPN for Android v-0.7.15
Скачать OpenVPN for Windows 7, 8
Скачать OpenVPN for Windows 10
Ярлык для автозапуска с подключением:
"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect client-01.ovpn --silent_connection 1
Расположение ярлыка для автозапуска:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
Выделение статических ip адресов клиентам
создать директорию /etc/openvpn/ccd:
mkdir /etc/openvpn/ccd
добавить строку в конфиг сервера /etc/openvpn/server.conf:
...
client-config-dir /etc/openvpn/ccd
для созданных сертификатов создавать конфигурационные файлы (к примеру для client-01):
создать файл /etc/openvpn/ccd/client-01 и заполнить:
ifconfig-push 10.0.10.200 10.0.10.1
пользователь подключающийся при помощи сертификата client-01 будет выдан ip: 10.0.10.200
Ошибка при подключении на Windows
В моем случае ошибка появилась на Windows 7:
OpenVPN Error: All TAP-Windows adapters on this system are currently in use
Решение:
Перейти в папку: C:\Program Files\TAP-Windows
От администратора запустить Uninstall.exe
Пройти все жтапы для удаления драйвера
Скачать TAP-драйвер: tap-windows-9.21.2.exe
Запустить tap-windows-9.21.2.exe от администратора и установить драйвер
В моем случае ошибка не появлялась после данных манипуляций
Клиент на Linux:
поместить файлы ca.crt, client-01.crt, client-01.key, client-01.ovpn в /etc/openvpn и выполнить:
# openvpn --config /etc/openvpn/client-01.ovpn
Ошибка при подключении клиента:
...
Mon Jul 06 18:59:29 2020 open_tun
Mon Jul 06 18:59:29 2020 TAP-WIN32 device [Подключение по локальной сети] opened: \\.\Global\{84AD4B1B-C918-4BC8-A992-8ED12C53F793}.tap
Mon Jul 06 18:59:29 2020 TAP-Windows Driver Version 9.24
Mon Jul 06 18:59:29 2020 Notified TAP-Windows driver to set a DHCP IP/netmask of 10.0.10.6/255.255.255.252 on interface {84AD4B1B-C918-4BC8-A992-8ED12C53F793} [DHCP-serv: 10.0.10.5, lease-time: 31536000]
Mon Jul 06 18:59:29 2020 Successful ARP Flush on interface [30] {84AD4B1B-C918-4BC8-A992-8ED12C53F793}
Mon Jul 06 18:59:29 2020 MANAGEMENT: >STATE:1594051169,ASSIGN_IP,,10.0.10.6,,,,
Mon Jul 06 18:59:34 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:34 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:39 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:39 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:40 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:40 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:42 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:42 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:43 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:43 2020 Route: Waiting for TUN/TAP interface to come up...
Mon Jul 06 18:59:44 2020 TEST ROUTES: 0/0 succeeded len=-1 ret=0 a=0 u/d=down
Mon Jul 06 18:59:44 2020 Route: Waiting for TUN/TAP interface to come up...
...
Решение:
Нажимаем WIN+X выбираем Панель управления, в открывшемся окне кликаем Программы и затем Включение и отключение компонентов Windows.
Ищем там Пакет администрирования диспетчера RAS-подключений (CMAK) и убеждаемся, что напротив него стоит галочка. Если не стоит ее нужно поставить.
Если пакет не установлен то он установится после того как вы поставите галочку.
Если пакет установлен закрываем все нажатием ОК.
Нажимаем WIN+R вводим services.msc и жмем Выполнить.
Откроется окно Службы.
Ищем службу Сетевые подключения, делаем двойной клик мышью на ней.
Вам откроется Свойства: Сетевые подключения выставляем Тип запуска: Автоматически. Если служба не запущена(Состояние: Выключена) то запускаем ее нажатием на кнопку Запустить. Если служба уже запущена можно по желанию перезапустить ее (Остановить|Запустить).
Закрываем это окно нажатием ОК.
Ошибка в логах подключения
Mon Aug 01 10:29:35 2022 WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
Решение:
добавить в конфиг клиента:
...
remote-cert-tls server
...
Не подключается клиент. появляется ошибка:
...
Mon Aug 01 10:29:36 2022 Connection reset, restarting [0]
на сервере в логах появляется:
...
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 WARNING: Failed to stat CRL file, not (re)loading CRL.
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 VERIFY ERROR: depth=0, error=CRL has expired: CN=client-01, serial=289809041961108508093849536526172910990
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 OpenSSL: error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 TLS_ERROR: BIO read tls_read_plaintext error
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 TLS Error: TLS object -> incoming plaintext read error
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 TLS Error: TLS handshake failed
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 Fatal TLS error (check_tls_errors_co), restarting
Mon Aug 1 11:01:49 2022 1.2.3.4:2183 SIGUSR1[soft,tls-error] received, client-instance restarting
...
Решение (данное решение подходит к данной статье, т.к. директории соответствуют):
проверка файла crl.pem
openssl crl -inform PEM -in /etc/openvpn/server/crl.pem -text -noout
в результате найти строки по которым станет понятна причина, что CRL ключ просрочен
...
Issuer: /CN=Easy-RSA CA
Last Update: Jan 31 09:51:50 2022 GMT
Next Update: Jul 30 09:51:50 2022 GMT
CRL extensions:
...
удаляем предыдущие
rm -rf /etc/openvpn/server/crl.pem
rm -rf /etc/openvpn/easy-rsa/pki/crl.pem
переходим в /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
Сгенерируем CRL ключ необходимый для отзыва клиентских сертификатов
./easyrsa gen-crl
Копируем в папку с конфигурацией
cp pki/crl.pem /etc/openvpn/server/
Перезапускаем сервер:
systemctl restart openvpn@server
для увеличения срока генерации сертификата CRL добавить в файл vars параметр
set_var EASYRSA_CRL_DAYS 720
Поместить сертификаты в файл конфигурации
client
dev tun
proto tcp
remote xx.xx.xx.xx 1194
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 lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
<ca>
-----BEGIN CERTIFICATE-----
XXX CA XXX
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
XXX CLIENT XXX
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
XXX CLIENT PRIVATE XXX
-----END PRIVATE KEY-----
</key>
Если нужно соединение использовать только для одной подсети
К примеру 192.168.0. *:
route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0
Только для одного IP (192.168.0.1):
route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.1 255.255.255.255
Пример конфигурации с подсетью 192.168.0.*:
client
dev tun
proto tcp
remote 88.88.88.88 1194
route-nopull
route 10.0.10.0 255.255.255.0
route 192.168.0.0 255.255.255.0
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 lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
<ca>
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
</key>
Спасибо.
Спасибо, ваш сайт очень полезный!