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

от автора

Возникла необходимость быстро и качественно настроить доступ из домашней обстановки в трудовую среду рабочего помещения. Поскольку дома компьютер находится за линией фронта натизации от провайдера, да и на работе локальная подсеть спрятана за забор 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 

ссылка на оригинал статьи http://habrahabr.ru/post/194144/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *