Установка OpenVPN на CentOS 6.4

в 10:03, , рубрики: linux, openvpn, системное администрирование, метки: ,

Возникла необходимость быстро и качественно настроить доступ из домашней обстановки в трудовую среду рабочего помещения. Поскольку дома компьютер находится за линией фронта натизации от провайдера, да и на работе локальная подсеть спрятана за забор NAT, то в качестве решения для организации безопасного доступа для вечернего досуга на работе был выбран замечательный продукт OpenVPN, который хорошо справляется с такими препонами. Помимо этого довольно прост (относительно) в настройках и имеет клиентские решения под известные операционные системы и популярные мобильные платформы (отговорка что ты не за компом может быть не актуальной).

В качестве сервера openvpn был взят простенький компьютер с установленной ОС CentOS:

uname -a 
Linux qwert0 2.6.32-358.18.1.el6.i686 #1 SMP Wed Aug 28 14:27:42 UTC 2013 i686 i686 i386 GNU/Linux

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

Установка OpenVPN-сервера в дистрибутиве CentOS 6.4 довольно проста:

yum install openvpn

Будет установлена версия openvpn-2.3.2-1.el6.i686 сервера. Так же во время установки будет создана группа openvpn и заведён пользователь openvpn. Перед тем как приступать к настройкам следует проверить сущестуют ли в системе интерфейсы tun/tap. Вводим:

cat /dev/net/tun
cat: /dev/net/tun: File descriptor in bad state

Обратите внимание на статус: «File descriptor in bad state» — значит здесь всё есть хорошо.
На следующем шаге следует создать дополнительные файлы и каталоги, поменять права и контекст на них:

touch /etc/openvpn/server.conf
touch /etc/openvpn/ip.sv
mkdir /var/log/openvpn
chown openvpn.openvpn /etc/openvpn/*
chcon -u system_u /etc/openvpn/* 
restorecon -v -R  /etc/openvpn/*

Далее файл /usr/share/openvpn/easy-rsa/2.0/vars привести к следущему виду:

Содержимое файла vars

# easy-rsa parameter settings 

# NOTE: If you installed from an RPM, 
# don't edit this file in place in 
# /usr/share/openvpn/easy-rsa -- 
# instead, you should copy the whole 
# easy-rsa directory to another location 
# (such as /etc/openvpn) so that your 
# edits will not be wiped out by a future 
# OpenVPN package upgrade. 

# This variable should point to 
# the top level of the easy-rsa 
# tree. 
export EASY_RSA="`pwd`" 

# 
# This variable should point to 
# the requested executables 
# 
export OPENSSL="openssl" 
export PKCS11TOOL="pkcs11-tool" 
export GREP="grep" 

 
# This variable should point to 
# the openssl.cnf file included 
# with easy-rsa. 
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` 

# Edit this variable to point to 
# your soon-to-be-created key 
# directory. 
# 
# WARNING: clean-all will do 
# a rm -rf on this directory 
# so make sure you define 
# it correctly! 
export KEY_DIR="$EASY_RSA/keys" 

# Issue rm -rf warning 
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR 

# PKCS11 fixes 
export PKCS11_MODULE_PATH="dummy" 
export PKCS11_PIN="dummy" 

# Increase this to 2048 if you 
# are paranoid.  This will slow 
# down TLS negotiation performance 
# as well as the one-time DH parms 
# generation process. 
export KEY_SIZE=2048 

# In how many days should the root CA key expire? 
export CA_EXPIRE=730 

# In how many days should certificates expire? 
export KEY_EXPIRE=730 

# These are the default values for fields 
# which will be placed in the certificate. 
# Don't leave any of these fields blank. 
export KEY_COUNTRY="RU" 
export KEY_PROVINCE="OUTSIDEMKAD" 
export KEY_CITY="Babaysk" 
export KEY_ORG="Faton" 
export KEY_EMAIL="support@wostok.su" 
export KEY_EMAIL=support@wostok.su 
export KEY_CN=qwert0 
export KEY_NAME=server 
export KEY_OU=DD 
#export PKCS11_MODULE_PATH=changeme 
#export PKCS11_PIN=1234

Прознать какая версия openssl стоит в системе:

rpm -qa openssl 
openssl-1.0.0-27.el6_4.2.i686

Переименовать файл /usr/share/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf в /usr/share/openvpn/easy-rsa/2.0/openssl.cnf, чтобы нормально отработали скрипты генерации ключей:

mv openssl-1.0.0.cnf openssl.cnf

Теперь выполняем всё по порядку:

. ./vars

Обратите внимание — две точки через пробел
Удаляем всё и подготовим к генерации каталог /usr/share/openvpn/easy-rsa/2.0/keys:

./clean-all

Создаём файл ca.key — он нужен и серверу и клиенту. Генератор будет задавать различные вопросы, можно жать Enter на всех вопросах:

Генерация файла ca.key

./build-ca 
Generating a 2048 bit RSA private key 
.....+++ 
................................+++ 
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) [OUTSIDEMKAD]: 
Locality Name (eg, city) [Babaysk]: 
Organization Name (eg, company) [Faton]: 
Organizational Unit Name (eg, section) [ChaosDepartament]: 
Common Name (eg, your name or your server's hostname) [qwert0.wostok.su]: 
Name [server]: 
Email Address [support@wostok.su]:

Генерируем сертификат и ключ для сервера:

Сертификат и ключ сервера
./build-key-server server 
Generating a 2048 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) [OUTSIDEMKAD]: 
Locality Name (eg, city) [Babaysk]: 
Organization Name (eg, company) [Faton]: 
Organizational Unit Name (eg, section) [ChaosDepartament]: 
Common Name (eg, your name or your server's hostname) [server]: 
Name [server]: 
Email Address [support@wostok.su]:

Please enter the following 'extra' attributes 
to be sent with your certificate request 
A challenge password []: 
An optional company name []: 
Using configuration from /usr/share/openvpn/easy-rsa/2.0/openssl.cnf 
Check that the request matches the signature 
Signature ok 
The Subject's Distinguished Name is as follows 
countryName           :PRINTABLE:'RU' 
stateOrProvinceName   :PRINTABLE:'OUTSIDEMKAD' 
localityName          :PRINTABLE:'Babaysk' 
organizationName      :PRINTABLE:'Faton' 
organizationalUnitName:PRINTABLE:'ChaosDepartament' 
commonName            :PRINTABLE:'server' 
name                  :PRINTABLE:'server' 
emailAddress          :IA5STRING:'support@wostok.su' 
Certificate is to be certified until Apr 17 07:51:46 2015 GMT (730 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

Теперь генерируем файл параметров по алгоритму Diffie-Hellman:

Создание файла параметров по алгоритму Diffie-Hellman

./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2 
This is going to take a long time 
..................................+..............................................+...+...................................................+...........................+.....................................+.................................................................................................................................................+.......................................................................................................................................................+........................................................................................................................................................................+............................................................................................................................................................................................................................................................+.................................................................................................................................................+.................................+................................................................................................................................+.......................................................................................................................+..+............................+..............................+...........................................+.................................+.......+.........................................+......+......................+....................................+.......+.............................................................+......................................................+...........................................................................................................................................................................................................++*++*

Генерируем сертификат и ключ для клиента velowup (такое вот имя у клиентского сертификата):

Создание сертификата и ключа для клиента

./build-key velowup 
Generating a 2048 bit RSA private key 
.................+++ 
........................+++ 
writing new private key to 'velowup.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) [OUTSIDEMKAD]: 
Locality Name (eg, city) [Babayks]: 
Organization Name (eg, company) [Faton]: 
Organizational Unit Name (eg, section) [ChaosDepartament]: 
Common Name (eg, your name or your server's hostname) [velowup]: 
Name [server]: 
Email Address [support@wostok.su]: 

Please enter the following 'extra' attributes 
to be sent with your certificate request 
A challenge password []: 
An optional company name []: 
Using configuration from /usr/share/openvpn/easy-rsa/2.0/openssl.cnf 
Check that the request matches the signature 
Signature ok 
The Subject's Distinguished Name is as follows 
countryName           :PRINTABLE:'RU' 
stateOrProvinceName   :PRINTABLE:'OUTSIDEMKAD' 
localityName          :PRINTABLE:'Babayks' 
organizationName      :PRINTABLE:'Faton' 
organizationalUnitName:PRINTABLE:'ChaosDepartament' 
commonName            :PRINTABLE:'velowup' 
name                  :PRINTABLE:'server' 
emailAddress          :IA5STRING:'support@wostok.su' 
Certificate is to be certified until Apr 17 08:51:17 2015 GMT (730 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

И последним создаем общий ключ для клиентов и сервера. Это TLS-ключ:

openvpn --genkey --secret ta.key

Теперь следует создать каталоги в конфигурационной директории для ключей:

mkdir /etc/openvpn/.key
mkdir /etc/openvpn/.tls

Переместить сгенерированные файлы в соответствующие каталоги:

cp /usr/share/openvpn/easy-rsa/2.0/key/* /etc/openvpn/.key/
cp /usr/share/openvpn/easy-rsa/2.0/ta.key /etc/openvpn/.tls/

Поправить контекст:

chcon -u system_u /etc/openvpn/.key/*
restorecon -v  /etc/openvpn/.key/* 
chcon -u system_u /etc/openvpn/.tls/*
restorecon -v  /etc/openvpn/.tls/*
chcon -u system_u /etc/openvpn/.key/
restorecon -v  /etc/openvpn/.key/
chcon -u system_u /etc/openvpn/.tls/ 
restorecon -v  /etc/openvpn/.tls/

Разрешаем tcp на порту 1723 в SELinux:

semanage port -a -t openvpn_port_t -p tcp 1723

Конфигурационный файл сервера /etc/openvpn/server.conf привести к следующему виду:

Содержимое конфигурационного файла сервера

# Какой интерфейс слушать?
#(У кого-то это может быть ip адрес интерфейса, который смотрит в интернет. Скорее всего это скорее всего eth0)
local 192.168.0.253

# Какой порт слушать?
port 1723

# На каком протоколе будем работать?
proto tcp-server

# В каком режиме работать? Мостом (tap) или маршрутизация (tun)
dev tun0
;dev tap0

# MTU
tun-mtu 1392

# Разрешить аутентификацию по паролю
#auth-user-pass
# Пути к корневому сертефикату, сертификату и закрытому ключу.
ca /etc/openvpn/.key/ca.crt
cert /etc/openvpn/.key/server.crt
key /etc/openvpn/.key/server.key

# Параметры Диффи-Хелмана
dh /etc/openvpn/.key/dh2048.pem

# Отключить проверку пользовательских сертификатов
# client-cert-not-required
# username-as-common-name

# Настройка режима сервера и ИП адресов для выдачи клиентам. Сервер возьмет
# себе 10.10.20.1
# На каждом клиенте указывается адрес сервера 10.10.20.1. Закомментируйте эту
# строку, если вы используете ethernet мост.
server 10.10.20.0 255.255.255.0
;ifconfig 172.16.1.1 255.255.255.0
;ifconfig-pool 172.16.1.2 172.16.1.96

# Установите серверный режим для ethernet моста.
# Вы должны сначала в своей ОС настроить мост
# между TAP и NIC интерфейсом.
# Затем вы должны вручную установить
# IP/маску на мост, к примеру 10.8.0.4/255.255.255.0.
# В заключении мы должны установить диапазон IP
# адресов в этой подсети для выделения клиентам
# (начало=10.8.0.50 конец=10.8.0.100).
# Оставьте эту строку закоментированной, если вы
# не используете ethernet мост.
;server-bridge

# Режим сервера
daemon
mode server

# Разрешаем использовать TLS
tls-server

# Разрешить клиентам доступ VPN клиентам между друг другом?
#client-to-client

# Сопоставления клиент <-> виртуальный IP-адрес
# хранятся в этом файле. Если OpenVPN упадет или
# будет перезапущен, повторно подключающимся клиентам могут быть назначены
# из пула такие же виртуальные IP-адреса, которые были назначены им в прошлый
# раз.
ifconfig-pool-persist /etc/openvpn/ip.sv

;client-config-dir /etc/openvpn/.clt

# Передача клиенту параметров маршрутизации, где X.X.X.X — IP адрес вашего eth0, что смотрит в интернет
push «route 192.168.0.0 255.255.255.0»

# Передаем клиенту настройку шлюза
;push «route-gateway 192.168.0.2»

# Некоторые Windows-специфичные сетевые настройки
# могут быть переданы клиентам, такие как адреса DNS-
# или WINS-серверов. ПРЕДОСТЕРЕЖЕНИЕ:
# openvpn.net/faq.html#dhcpcaveats
push «dhcp-option DNS 192.168.0.2»
;push «dhcp-option DNS 192.168.0.1»

# Чтобы весь трафик при подключении к VPN шел через VPN-сервер (это заставляет
# клиента изменить шлюз по умолчанию на vpn-сервер),
# нужно добавить следующую строчку в основной конфиг openvpn.conf.
;push «redirect-gateway»

# Проверка соединения
keepalive 10 120

# Для большей безопасности и защиты от ДОС и флуда выдаём клиентам ta.key. На сервере 0, на клиентах 1.
tls-auth /etc/openvpn/.tls/ta.key 0

# Допустимые алгоритмы шифра. Надо прописывать так же и на клиенте.
cipher AES-256-CBC
#cipher AES256-SHA

# размер ключа в битах
#keysize 2048

# алгоритм хэширования
auth SHA512

# Включить сжатие. Если да, то надо прописывать и на клиенте.
comp-lzo

# Максимальное количество одновременно подключенных клиентов
max-clients 20

# От какого пользователя и группы работать серверу?
user openvpn
group openvpn

# persist-опции скажут OpenVPN при перезагрузке воздержаться от доступа
# к определенным ресурсам,
# т.к. они могут быть недоступны из-за понижения привелегий.
persist-key
persist-tun

# Файл состояния текущих соединений. Перезаписывается раз в минуту.
status /var/log/openvpn/openvpn-status.log

# Куда писать логи?
log-append /var/log/openvpn/openvpn.log

# Уровень детализации лога
verb 5

# Не записывать больше повторяющихся сообщений сразу
mute 20

Теперь можно переходить к настройкам файервола.
В iptables перед строчками, запрещающими все INPUT и FORWARD

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

пишем:

-A INPUT -i tun0 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT

Также добавляем строки «натизации»:

*nat 
:PREROUTING ACCEPT [4:614] 
:POSTROUTING ACCEPT [18:936] 
:OUTPUT ACCEPT [18:936] 
-A POSTROUTING -s 10.10.20.0/24 -o eth0 -j MASQUERADE

«Рестартим» iptables:

service iptables restart

Запускаем openvpn

service openvpn start

Проверяем что сервис открыл порт да и вообще работает:

netstat -nlp | grep 1723
tcp        0      0 192.168.0.2:1723         0.0.0.0:*                   LISTEN 

Если всё нормально, ставим OpenVPN в автозапуск:

chkconfig openvpn on

Настройка клиента OpenVPN

Поскольку дома на рабочей машине стоит CentOS, то установку и настройку клиентской части буду вести относительно этой операционки, хотя отличие для других дистрибутивов и операционных систем минимальны.
Создать каталоги, в которых будут располагаться клиентские ключевые файлы:

mkdir /etc/openvpn/.key/
mkdir /etc/openvpn/.tls/

Наисекретнейшим образом стоит перенести на будущую клиентскую машину файлы, ранее сгенерированные на сервере:

ca.crt 
dh2048.pem 
velowup.crt 
velowup.key

в каталог /etc/openvpn/.key/.
А файл ta.key пусть полежит в каталоге etc/openvpn/.tls.
Файл конфигурации клиента OpenVPN следующего вида:

Клиентский конфигурационный файл

# Укажем, что мы являемся клиентом
client
tls-client
# В каком режиме работать? Мостом (tap) или маршрутизация (tun)
dev tun

# На каком протоколе работать
proto tcp-client

# Адрес и порт сервера (Хоть IP хоть доменное имя)
remote wostok.su 1723

# Бесконечно пробовать разрешить имя хоста OpenVPN-сервера.
resolv-retry infinite

# Не «биндиться» к интерфейсу
nobind

# Стараться сохранять некоторое объекты между перезапусками
persist-key
persist-tun

# Параметры SSL/TLS.
# Смотрите файл конфигурации сервера для более
# подробного описания. Лучше всего использовать
# отдельные пары .crt/.key-файлов
# для каждого клиента. Один ca-файл
# может быть использован для всех клиентов.
ca /etc/openvpn/.key/ca.crt
dh /etc/openvpn/.key/dh2048.pem
cert /etc/openvpn/.key/velowup.crt
key /etc/openvpn/.key/velowup.key

# Если на сервере используется ключ tls-auth,
# то каждый клиент также должен иметь этот ключ.
tls-auth /etc/openvpn/.tls/ta.key 1

# Выбор криптографического шифра (cipher).
# Если опция cipher используется на сервере,
# то вы также должны указать её здесь.
cipher AES-256-CBC
auth SHA512

# Включить сжатие
comp-lzo

# Уровень журналирования
verb 4

# Не записывать повторяющиеся сообщения более чем
mute 20

# От какого пользователя и группы работать клиенту?
user openvpn
group openvpn

# Куда писать журнальные данные о работе клиента?
log-append /var/log/openvpn/openvpn_client.log
status /var/log/openvpn/status_client.log

;route 172.16.1.0 255.255.255.0

Вот, собственно, и все настройки. Дальше запуск клиента и выполнение требуемых операций из далека:

/usr/sbin/openvpn /etc/openvpn/client.conf

Автор: bARmaleyKA

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js