Установка и настройка OpenVPN на Linux CentOS 7


Тематические термины: VPN, CentOS
Подготовка системы
Установка OpenVPN
Создание сертификатов
Настройка сервера
Настройка клиента
Доступ к локальной сети
Аутентификация
Автозапуск клиента
Статические IP
Доступ в Интернет через VPN-сервер
Настройка анонимности
Возможные проблемы
Для удобства настройки заходим под суперпользователем:
$ sudo su
Подготовка системы
Обновляем установленные пакеты:
yum update
Установим правильную временную зону:
timedatectl set-timezone Europe/Moscow
* в данном примере московское время.
Устанавливаем сервис для синхронизации времени:
yum install chrony
Разрешаем автозапуск службы chrony и запускаем ее:
systemctl enable chronyd --now
Отключаем Selinux:
setenforce 0
Чтобы Selinux не включился после перезагрузки, откроем данный файл:
vi /etc/selinux/config
И отредактируем строчку SELINUX=enforcing на:
SELINUX=disabled
Создаем правило для firewalld:
firewall-cmd --permanent --add-port=443/udp
* в данной инструкции мы настроим работу OpenVPN на порту 443 по UDP (по умолчанию, это 1194/UDP). Если в вашем случае необходим другие порт и протокол, меняем значения на соответствующие.
... и применяем его:
firewall-cmd --reload
Если используется iptables, правило создаем командой:
iptables -I INPUT -p udp --dport 443 -j ACCEPT
* где 443 — порт, который мы будем использовать для openvpn.
Установка, настройка и запуск VPN-сервера
Установка OpenVPN
Устанавливаем репозиторий epel:
yum install epel-release
Устанавливаем необходимые пакеты следующей командой:
yum install openvpn easy-rsa
Создание сертификатов
В основе идеи VPN лежит шифрование трафика, а значит для его работы необходимы сертификаты.
Переходим в каталог easy-rsa:
cd /usr/share/easy-rsa/3
* в зависимости от версии easy-rsa, последний каталог может быть другим. Увидеть точное название каталога можно командой ls /usr/share/easy-rsa/.
Чтобы упростить и ускорить процесс создания ключей, создаем следующий файл:
vi vars
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Sankt-Petersburg"
export KEY_CITY="Sankt-Petersburg"
export KEY_ORG="DMOSK COMPANY"
export KEY_EMAIL="master@dmosk.ru"
export KEY_CN="DMOSK"
export KEY_OU="DMOSK"
export KEY_NAME="name-openvpn-server.dmosk.ru"
export KEY_ALTNAMES="name-openvpn-server"
* где KEY_CN и KEY_OU: рабочие подразделения (например, можно указать название отдела); KEY_NAME: адрес, по которому будет выполняться подключение (можно указать полное наименование сервера); KEY_ALTNAMES — альтернативный адрес.
* так как мы генерируем самоподписный сертификат, значения данных полей никак не повлияют на работу OpenVPN, однако, для удобства, лучше подставить реальные данные.
Запускаем созданный файл на исполнение:
. ./vars
Инициализируем PKI:
./easyrsa init-pki
Мы должны увидеть:
...
init-pki complete; you may now create a CA or requests.
...
... а в текущем каталоге появится папка pki.
Генерируем корневой сертификат:
./easyrsa build-ca
... после ввода Enter обязательно задаем пароль дважды. На запрос ввести Common Name можно просто нажать ввод или написать свое имя:
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
Создаем ключ Диффи-Хеллмана:
./easyrsa gen-dh
Для создания сертификата сервера необходимо сначала создать файл запроса:
./easyrsa gen-req vpn-server nopass
* на запрос ввода Common Name просто вводим Enter, чтобы использовать настройку из файла vars; nopass можно упустить, если хотим повысить безопасность с помощью пароля на сертификат.
... и на его основе — сам сертификат:
./easyrsa sign-req server vpn-server
После ввода команды подтверждаем правильность данных, введя yes:
Confirm request details: yes
... и вводим пароль, который указывали при создании корневого сертификата.
Для создания ta ключа используем команду:
openvpn --genkey --secret pki/ta.key
Сертификаты сервера готовы и находятся в каталоге pki.
Создаем каталог в /etc/openvpn, в котором будем хранить сертификаты:
mkdir /etc/openvpn/keys
Копируем в него содержимое каталога pki:
cp -r pki/* /etc/openvpn/keys/
Настройка OpenVPN-сервера
Создаем конфигурационный файл:
vi /etc/openvpn/server.conf
И вставляем в него следующее:
local 192.168.0.15
port 443
proto udp
dev tun
ca keys/ca.crt
cert keys/issued/vpn-server.crt
key keys/private/vpn-server.key
dh keys/dh.pem
tls-auth keys/ta.key 0
server 172.16.10.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
max-clients 32
client-to-client
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 0
mute 20
daemon
mode server
tls-server
comp-lzo
* где из всех параметров, обязательно, внести изменения нужно в следующие — local: IP-адрес, на котором будет обрабатывать запросы OpenVPN; port: сетевой порт (443 позволит избежать проблем при использовании Интернета в общественных местах, но может быть уже занят в вашей системе — посмотреть список используемых портов можно командой ss -tunlp. Если порт занят, используйте любой из свободных, например 1194).
Создаем каталог для логов сервера:
mkdir /var/log/openvpn
Разрешаем автоматический старт сервиса vpn:
systemctl enable openvpn@server
И запускаем его:
systemctl start openvpn@server
Проверим, что сервис корректно работает:
systemctl status openvpn@server
Настройка OpenVPN-клиента
Для настройки клиента необходимо на сервере сгенерировать сертификаты, а на клиентском компьютере установить программу openvpn и настроить ее.
На сервере
Генерируем сертификаты для клиента. Для этого переходим в каталог easy-rsa (если мы из него выходили):
cd /usr/share/easy-rsa/3
Запускаем еще раз vars:
. ./vars
Создаем запрос и сам сертификат:
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
* как и при генерировании сертификата сервера, подтверждаем правильность данных и вводим пароль корневого сертификата. В данном примере мы создадим сертификат для client1.
На сервере скопируем ключи во временную директорию, выполнив последовательно 3 команды:
mkdir /tmp/keys
cp pki/issued/client1.crt pki/private/client1.key pki/dh.pem pki/ca.crt pki/ta.key /tmp/keys
chmod -R a+r /tmp/keys
* сертификаты скопированы в каталог /tmp для удобства переноса их на клиентский компьютер.
На клиенте
Мы рассмотрим настройку клиента на примере операционных систем Windows и Linux.
Windows
1. Заходим на официальную страницу загрузки openvpn и скачиваем клиента для Windows:
Запускаем скачанный файл и устанавливаем программу, нажимая «Далее».
2. Переходим в папку %userprofile%\OpenVPN\config или C:\Program Files\OpenVPN\config (лучше в профиле пользователя). И копируем в нее файлы ca.crt, client.crt, client.key, dh.pem, ta.key из каталога /tmp/keys на сервере, например, при помощи программы WinSCP.
После переноса файлов, не забываем удалить ключи из временного каталога на сервере:
rm -Rf /tmp/keys
3. Теперь возвращаемся к компьютеру с Windows, открываем блокнот от имени администратора и вставляем следующие строки:
client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo
ca ca.crt
cert client1.crt
key client1.key
dh dh.pem
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
verb 0
* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы.
Сохраняем файл с именем config.ovpn в папке %userprofile%\OpenVPN\config или C:\Program Files\OpenVPN\config (лучше в профиле пользователя).
4. Запускаем с рабочего стола программу «OpenVPN GUI» от имени администратора (это важно).
Нажимаем правой кнопкой по появившемуся в трее значку и выбираем «Подключиться»:
Произойдет подключение и значок поменяет цвет с серого/желтого на зеленый.
Linux
1. Устанавливаем клиента одной из команд.
а) для Rocky Linux / CentOS:
yum install epel-release
yum install openvpn
б) для Ubuntu / Debian:
apt-get install openvpn
2. Переходим в каталог:
cd /etc/openvpn
Копируем в каталог файлы ca.crt, client1.crt, client1.key, dh.pem, ta.key из каталога /tmp/keys на сервере, например, при помощи утилиты scp:
scp admin@192.168.0.15:/tmp/keys/* .
* где admin — имя пользователя, под которым можно подключиться к серверу по SSH; 192.168.0.15 — IP-адрес сервера.
Для закрытых ключей разрешаем доступ только для владельца:
chmod 600 client1.key ta.key
После переноса файлов, не забываем удалить ключи из временного каталога на сервере:
rm -R /tmp/keys
3. Создаем конфигурационный файл:
vi /etc/openvpn/client.conf
client
resolv-retry infinite
nobind
remote 192.168.0.15 443
proto udp
dev tun
comp-lzo no
ca ca.crt
cert client1.crt
key client1.key
dh dh.pem
tls-client
tls-auth ta.key 1
float
keepalive 10 120
persist-key
persist-tun
verb 0
* где 192.168.0.15 443 — IP-адрес OpenVPN-сервера и порт, на котором он принимает запросы.
4. Разово запустим клиента:
cd /etc/openvpn
openvpn --config /etc/openvpn/client.conf
Соединение должно выполниться. Мы можем увидеть предупреждения — по желанию, межете их исправить самостоятельно.
5. Прерываем выполнение подключения комбинацией Ctrl + C и запустим клиента в качестве службы:
systemctl enable openvpn@client --now
Проверить, что соединение состоялось можно пинганув сервер по VPN-адресу:
ping 172.16.10.1
Доступ к локальной сети
Для настройки доступа к локальной сети, воспользуйтесь инструкцией Настройка доступа к локальной сети клиентам OpenVPN в CentOS 7.
Аутентификация пользователей
Позволяет требовать от пользователя ввод логина и пароля при каждом подключении. Также идентификация каждого пользователя необходима для уникальной идентификации каждого из них и выдачи разных IP-адресов.
Настройка на сервере
Открываем конфигурационный файл openvpn:
vi /etc/openvpn/server.conf
И добавляем следующую строчку:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so login
* как путь, так и название файла openvpn-plugin-auth-pam.so могут отличаться. Это зависит от версии Linux и OpenVPN. Чтобы найти путь до нужного файла, можно воспользоваться командой find / -name "openvpn-*auth-pam*" -print.
Перезапускаем сервер:
systemctl restart openvpn@server
Создаем учетную запись для авторизации:
useradd vpn1 -s /sbin/nologin
passwd vpn1
Настройка на клиенте
В конфигурационный файл клиента добавляем:
auth-user-pass
Можно пробовать подключаться.
Вход без ввода пароля
Если необходимо настроить авторизацию, но автоматизировать вход клиента, открываем конфигурационный файл последнего и строку для авторизации меняем на:
auth-user-pass auth.txt
* где auth.txt — файл, в котором мы будем хранить логин и пароль.
Создаем текстовый файл auth.txt в той же папке, где находится файл конфигурации со следующим содержимым:
username
password
* где username — логин пользователя, а password — пароль.
Переподключаем клиента.
Описанный метод аутентификации является базовым и требует наличие обычной системной учетной записи. Если необходима более сложная авторизация на базе LDAP, можно воспользоваться инструкцией
настройка OpenVPN сервера с аутентификацией через LDAP (написана на базе Linux Ubuntu).
Автоматический запуск клиента
Если необходимо, чтобы клиент OpenVPN запускался при старте операционной системы Windows и подключался к серверу, просто открываем службы и находим OpenVPNService. Переводим его в режим автозапуска:
Статические IP для клиентов
На основе сертификатов
На сервере для каждого клиента генерируем свой сертификат. Например, для client2 вводим следующие команды:
cd /usr/share/easy-rsa/3
. ./vars
./easyrsa gen-req client2 nopass
./easyrsa sign-req client client1
После чего переходим к каталог pki, где находятся новые сертификаты и копируем их на клиентский компьютер. Полный список файлов, которые необходимо копировать:
- ca.crt
- issued/client2.crt
- private/client2.key
- dh.pem
- ta.key
Также на сервере открываем следующий файл и заносим статический адрес для клиента:
vi /etc/openvpn/ipp.txt
client,172.16.10.4
client2,172.16.10.24
* в данном примере клиент client будет получать IP 172.16.10.4, а client2 — 172.16.10.24.
В конфигурационном файле server.conf должна быть строчка:
ifconfig-pool-persist ipp.txt
Перезапускаем сервер:
systemctl restart openvpn@server
Теперь на клиенте не забываем указать правильные названия файлов в конфигурационном файле клиента:
cert client2.crt
key client2.key
Пробуем подключиться.
На основе логинов
Также статические адреса могут назначаться на основе учетных записей пользователей.
В конфигурационный файл добавим:
client-config-dir ccd
username-as-common-name
Создадим каталог ccd:
mkdir /etc/openvpn/ccd
Создадим файл с индивидуальными настройками пользователя:
vi /etc/openvpn/ccd/vpn1
* где vpn1 — пользователь, под которым будем подключаться по VPN.
Добавляем в него:
ifconfig-push 172.16.10.5 172.16.10.6
* в данном примере мы задали для пользователя vpn1 адрес 172.16.10.5.
* возможны варианты — (1, 2) (5, 6) (9, 10) (13, 14) (17, 18) (21, 22) (25, 26) (29, 30) (33, 34) (37, 38) (41, 42) (45, 46) (49, 50) (53, 54) (57, 58) (61, 62) (65, 66) (69, 70) (73, 74) (77, 78) (81, 82) (85, 86) (89, 90) (93, 94) (97, 98) (101, 102) (105, 106) (109, 110) (113, 114) (117, 118) (121, 122) (125, 126) (129, 130) (133, 134) (137, 138) (141, 142) (145, 146) (149, 150) (153, 154) (157, 158) (161, 162) (165, 166) (169, 170) (173, 174) (177, 178) (181, 182) (185, 186) (189, 190) (193, 194) (197, 198) (201, 202) (205, 206) (209, 210) (213, 214) (217, 218) (221, 222) (225, 226) (229, 230) (233, 234) (237, 238) (241, 242) (245, 246) (249, 250) (253, 254).
Перезапускаем openvpn:
systemctl restart openvpn@server
Доступ в Интернет через VPN-сервер
Настройка делает так, что клиенты VPN-сервера начинают использовать последний как шлюз по умолчанию. Таким образом, весь трафик идет через наш сервер.
Открываем на сервере конфигурационный файл:
vi /etc/openvpn/server.conf
и добавляем:
push "redirect-gateway def1"
push "dhcp-option DNS 77.88.8.8"
Перезапускаем сервер:
systemctl restart openvpn@server
* сервер должен быть настроен в качестве шлюза. Подробнее в инструкции Настройка Интернет шлюза на CentOS 7.
Настройка анонимности
Для обеспечения полной анонимности при использовании VPN-сервера, делаем дополнительные настройки.
1. Необходимо, чтобы время на сервере совпадало с временем на компьютере.
На стороне сервера необходимо задать часовой пояс, например, если наш прокси находится в Германии, вводим:
timedatectl set-timezone Europe/Berlin
На стороне клиента либо меняем часовой пояс в системе, либо устанавливаем плагин для браузера, например, для Mozilla Firefox и меняем часовой пояс уже в нем.
2. Отключение icmp. По времени ответа на ping можно определить отдаленноесть клиента от прокси. Чтобы проверку нельзя было выполнить, отключаем на сервере icmp. Для этого создаем файл:
vi /etc/sysctl.d/icmp.conf
net.ipv4.icmp_echo_ignore_all=1
И применяем настройки:
sysctl -p /etc/sysctl.d/icmp.conf
3. Настройка MTU.
Для решения проблем с VPN fingerprint, на стороне сервера добавляем 2 опции:
vi /etc/openvpn/server.conf
...
tun-mtu 1500
mssfix 1620
Перезапускаем сервис:
systemctl restart openvpn@server
На стороне клиента также добавляем в конфигурационный файл 2 опции:
...
tun-mtu 1500
mssfix 1620
Переподключаемся к серверу VPN.
4. Проверяем настройки.
Открываем браузер, который работает через прокси и переходим на страницу 2ip.ru/privacy — кликаем по Проверить:
Будет выполнена проверка анонимности нашего сервера.
Возможные проблемы при работе с OpenVPN
Диагностировать большинство возникающих ошибок можно с помощью опции verb в конфигах клиента и сервера. В примерах выше значение данного параметра выставлялась в 0 — могут быть такие варианты:
- 0 — покажет только фатальные ошибки.
- 4 — вывод предупреждений, ошибок и важных сообщений.
- 5, 6 — подробный вывод ошибок. Удобно для решения проблем.
- 9 — подробный вывод всех сообщений.
Ниже приведены наиболее часто возникающие проблемы и способы их решения.
1. no package openvpn available
Описание: при попытке установить сервер, получаем ошибку.
Причина: не настроен репозиторий для данного пакета.
Решение: устанавливаем EPEL репозиторий:
yum install epel-release
2. failed to start openvpn robust and highly flexible tunneling application on server
Описание: при запуске сервера получаем данную ошибку.
Причина: как правило, связано с отсутствием сертификата.
Решение: открываем лог /var/log/openvpn/openvpn.log и смотрим, с каким сертификатом проблема. Проверяем, что все файлы скопированы и что мы не забыли сгенерировать все сертификаты.
3. Постоянно разрывается соединение
Описание: с периодичностью от 1 до 5 минут постоянно рвется соединение с сервером. После нескольких минут переподключается.
Причина: как правило, конфликт IP-адресов. Такая ситуация возникает при случаях, когда подключение выполняется с нескольких компьютеров одновременно с одинаковыми сертификатами.
Решение:
Способ 1. Настройте клиента для подключения к серверу с уникальными сертификатами. Для каждого подключения генерируем свои ключи. Рекомендуется использовать именно этот способ.
Способ 2. Можно настроить сервер openVPN для выдачи различных IP-адресов, независимо от сертификата. Для этого открываем конфигурационный файл:
vi /etc/openvpn/server.conf
... и добавляем:
...
duplicate-cn
Перезапускаем сервис:
systemctl restart openvpn@server