В качестве сервера 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
ссылка на оригинал статьи http://habrahabr.ru/post/194144/
Добавить комментарий