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