...

среда, 25 сентября 2013 г.

[Из песочницы] Установка 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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends:



Комментариев нет:

Отправить комментарий