Установка и настройка OpenVPN на Centos
Поднимаем на удаленном сервере, OpenVPN сервер с сертификатной аутентификацией. Весь трафик пользователя ( веб, icq, почта и т.д. ), при подключении VPN, должен автоматически направляться через защищенный канал. На выходе получаем трафик с IP адреса OpenVPN сервера( на OS Centos — как установить Centos?).
OpenVPN — свободная реализация технологии VPN ( виртуальная частная сеть ) для создания шифрованных каналов связи. Для обеспечения безопасности управляющего канала и канала данных используется библиотека OpenSSL. Сфера применения довольно обширна, безопасное удаленное администрирование, организация удаленных рабочих мест, и обеспечение анонимной работы в интернете.
OpenVPN поддерживает несколько видов аутентификации.
- Предустановленный ключ — самый простой вариант.
- Аутентификация по сертификатам — наиболее гибкий в настройках метод.
- Аутентификация по логину и паролю — клиентский сертификат при этом можно не использовать ( сертификат сервера обязателен ).
Мы будем использовать второй вариант, то есть аутентификацию клиентов с помощью сертификатов, поскольку он является самым гибким из перечисленных.
Включаем форвардинг пакетов
Важный шаг, поскольку если этого не сделать, работать данная схема не будет.
Подправляем файл /etc/sysctl.conf, в строке:
net.ipv4.ip_forward = 0
меняем 0 на 1
net.ipv4.ip_forward = 1
и выполняем команду:
[root@localhost /]# sysctl -p
это загрузит переменные ядра из обновленного файла sysctl.conf.
В CentOS, как и в большинстве дистрибутивов Linux, в качестве стандартного фаервола выступает iptables, добавляем в фаервол следующее правило:
[root@localhost /]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to-source ВНЕШНИЙ_IP
Вместо SNAT, можно использовать MASQUERADE, как рекомендует мануал по OpenVPN, но SNAT работает быстрей.
Не забудьте сделать что-бы оно загружалось при запуске системы.
[root@localhost ~]# mkdir /etc/iptables [root@localhost ~]# /sbin/iptables-save > /etc/iptables/rules [root@localhost ~]# echo "/sbin/iptables-restore < /etc/iptables/rules" >> /etc/rc.d/rc.local
Установка OpenVPN сервера
В стандартных репозитариях CentOS, пакет OpenVPN отсутствует, поэтому сначала нужно добавить репозитарий в котором есть OpenVPN, используем EPEL.
[root@localhost ~]# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm Retrieving http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm warning: /var/tmp/rpm-xfer.FQI0km: Header V3 DSA signature: NOKEY, key ID 217521f6 Preparing... ########################################### [100%] 1:epel-release ########################################### [100%]
Репозитарий добавлен, можно приступать к установке.
[root@localhost ~]# yum install openvpn
После установки OpenVPN, появляется ее домашняя папка, /etc/openvpn.
При установке, кроме самого OpenVPN сервера, будет установлен набор скриптов, для простой генерации ключей и сертификатов, расположено все это добро в /usr/share/openvpn/easy-rsa/2.0/. Кроме того в /usr/share/doc/openvpn-( версия )/, можно найти различные скрипты и примеры конфигов, которые могут пригодиться при построении различных вариантов VPN соединений.
Теперь можно приступать к настройке OpenVPN сервера.
Создание ключей и сертификатов
Настраиваем структуру папок для ключей. В папке /usr/share/openvpn/easy-rsa/2.0/, создаем папку keys:
[root@localhost /]# cd /usr/share/openvpn/easy-rsa/2.0/ [root@localhost /]# mkdir ./keys
Далее настраиваем переменные в файле /usr/share/openvpn/easy-rsa/2.0/vars.
export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" # папка для ключей echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" export KEY_SIZE=1024 # длина ключа, можно поставить 2048 export CA_EXPIRE=3650 # срок действия корневого сертификата export KEY_EXPIRE=3650 # срок действия ключа export KEY_COUNTRY="Russia" export KEY_PROVINCE="MO" export KEY_CITY="moscow" export KEY_ORG="org" export KEY_EMAIL="ivan@feanor184.ru"
Этот файл вызывается перед запуском скриптов генерации для установки необходимых значений переменных окружения. Можно прописать вызов vars, в начало каждого скрипта, который мы будем использовать. Например файл build-ca будет выглядеть так:
#!/bin/bash
# Build a root certificate
. ./vars # это будет срабатывать только если запускать build-ca находясь в той-же папке, можно прописать и абсолютный путь
export EASY_RSA="${EASY_RSA:-.}"
"$EASY_RSA/pkitool" --interact --initca $*
Так-же в качестве подготовки, нужно создать пару файлов, выполнив следующие команды:
[root@localhost 2.0]# touch /usr/share/openvpn/easy-rsa/2.0/keys/index.txt [root@localhost 2.0]# echo "00" > /usr/share/openvpn/easy-rsa/2.0/keys/serial
Кроме того, рекомендую заглянуть в файл openssl.cnf, это файл конфигурации openssl, значения из которого так-же будут использоваться в процессе создания сертификатов и ключей. В частности там можно настроить названия, получаемых на выходе файлов.
Теперь создадим самоподписной корневой сертификат с секретным ключом, в процессе отвечаем на вопросы:
[root@localhost 2.0]# ./build-ca NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/2.0/keys Generating a 1024 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) [Russia]: State or Province Name (full name) [MO]: Locality Name (eg, city) [Moscow]: Organization Name (eg, company) [org]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) [Feanor CA]:openvpn-ca Name []:openvpn-ca Email Address [ivan@feanor184.ru]:
Теперь создадим сертификат и секретный ключ для сервера:
[root@localhost 2.0]# [root@localhost 2.0]# ./build-key-server server
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/2.0/keys
Generating a 1024 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) [Russia]:
State or Province Name (full name) [MO]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [org]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [ivan@feanor184.ru]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: # для сервера пароль ставить не нужно, просто жмем Enter
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:'Russia'
stateOrProvinceName :PRINTABLE:'MO'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'org'
commonName :PRINTABLE:'server'
emailAddress :IA5STRING:'ivan@feanor184.ru'
Certificate is to be certified until Jan 15 10:51:17 2021 GMT (3650 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
Генерируем ключ Диффи-Хелмана. Алгоритм Диффи-Хелмана позволяет получить двум сторонам общий секретный ключ, использующийся для дальнейшего симметричного шифрования данных.
[root@localhost 2.0]# ./build-dh NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/2.0/keys Generating DH parameters, 1024 bit long safe prime, generator 2 This is going to take a long time .....................+...............................+.........................+.........................+..............................+..................................................+.......................................+...+.....................................................................................................................+........................................................................................+.......................................+..............................................................+...........................................................++*++*++*
Напоследок генерируем ключ для TLS аутентификации.
[root@localhost 2.0]# openvpn --genkey --secret keys/tls.key
Теперь создадим каталог /etc/openvpn/keys и скопируем туда необходимые серверу ключи и сертификаты:
[root@localhost 2.0]# mkdir /etc/openvpn/keys [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/ca.crt /etc/openvpn/keys/ca.crt [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/server.crt /etc/openvpn/keys/server.crt [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/server.key /etc/openvpn/keys/server.key [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/tls.key /etc/openvpn/keys/tls.key [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/dh1024.pem /etc/openvpn/keys/dh1024.pem
Настало время определиться с конфигом. Можно взять готовый файл server.conf из /usr/share/doc/openvpn-2.1.1/sample-config-files/, и привести к необходимому виду.
Получиться должно примерно следующее:
port 1194 # Порт на котором сервер будет принимать соединения local xxx.xxx.xxx.xxx # Адрес, на котором будет висеть openvpn сервер proto tcp # Протокол. Можно поставить tcp или udp. Вопрос что выбрать, не однозначный и зависит от конкретных условий. Протокол udp работает побыстрей, но не всегда применим. dev tun0 # Устройство туннеля server 10.8.0.0 255.255.255.0 # Виртуальная сеть, которая будет установлена между клиентом и сервером # Ключи и сертификаты ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh2048.pem tls-auth keys/tls.key 0 # На стороне сервера 0, на стороне клиента 1 cipher AES-256-CBC # Алгоритм шифрования, в данном случае 256-битный AES user nobody # Пользователь от которого будет работать OpenVPN сервер group nobody # Группа status openvpn-status.log log-append openvpn.log verb 3 # Уровень логгирования mute 20 # Не выводить повторять сообщение после 20 повторов max-clients 30 # Максимальное количество клиентов keepalive 10 120 # Каждые 10 секунд слать пинг, по истечении таймаута 120 секунд, перезапустить туннель client-config-dir /etc/openvpn/servers/server/ccd # Директория для индивидуальных настроек каждого клиента tls-server # Явное указание, что данный хост является TLS сервером comp-lzo # Сжатие трафика persist-key # Не трогать tun устройство при перезапуске openvpn сервера persist-tun # Не перечитывать файлы ключей при перезапуске туннеля push "redirect-gateway def1" # Протолкнуть клиенту новый шлюз по умолчанию push "dhcp-option DNS 8.8.8.8" # Назначить для клиента DNS сервер, в данном случае публичный DNS от гугла
Собственно теперь можно пробовать запустить серверную часть и проверить, все-ли в норме.
[root@localhost openvpn]# service openvpn start Starting openvpn: [ OK ]
Проверяем, появилось-ли устройство для туннеля.
[root@localhost openvpn]# ifconfig tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Занял-ли OpenVPN сервер, отведенный ему адрес и порт.
[root@localhost openvpn]# netstat -tupln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ............. udp 0 0 192.168.60.147:1194 0.0.0.0:* 3315/openvpn .............
Вроде все на месте.
Если что-то пошло не так, смотрим /etc/openvpn/openvpn.log, при необходимости можно увеличить уровень логгирования с помощью опции конфига verb.
Настраиваем OpenVPN клиента
Начнем с создания ключей и сертификата.
[root@localhost openvpn]# cd /usr/share/openvpn/easy-rsa/2.0
[root@localhost 2.0]# ./build-key client01
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/openvpn/easy-rsa/2.0/keys
Generating a 1024 bit RSA private key
.........++++++
..................++++++
writing new private key to 'client01.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) [Russia]:
State or Province Name (full name) [MO]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [org]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client01]:
Name []:
Email Address [ivan@feanor184.ru]:
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:'Russia'
stateOrProvinceName :PRINTABLE:'MO'
localityName :PRINTABLE:'Moscow'
organizationName :PRINTABLE:'org'
commonName :PRINTABLE:'client01'
emailAddress :IA5STRING:'ivan@feanor184.ru'
Certificate is to be certified until Jan 16 12:38:32 2021 GMT (3650 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
Копируем все необходимые клиенту файлы.
[root@localhost 2.0]# mkdir /root/ovpn [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/ca.crt /root/ovpn/ca.crt [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/client01.crt /root/ovpn/client01.crt [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/client01.key /root/ovpn/client01.key [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/tls.key /root/ovpn/tls.key [root@localhost 2.0]# cp /usr/share/openvpn/easy-rsa/2.0/keys/dh1024.pem /root/ovpn/dh1024.pem
Стандартный файл конфигурации клиента можно взять все там-же, /usr/share/doc/openvpn-2.1.1/sample-config-files/client.conf.
Приводим конфиг к следующему виду:
client remote 188.116.32.161 1194 # Адрес и порт OpenVPN сервера proto tcp # Протокол, должен совпадать с сервером dev tun # Устройство # Сертификаты и ключи ca ca.crt dh dh2048.pem cert admin.crt key admin.key tls-auth tls.key 1 cipher AES-256-CBC #Алгоритм шифрования, должен совпадать с серверным verb 3 mute 20 keepalive 10 120 comp-lzo persist-key persist-tun resolv-retry infinite nobind
Кидаем получившийся файл конфигурации в папку с ключами:
[root@localhost 2.0]# cp /usr/share/doc/openvpn-2.1.1/sample-config-files/client.conf /root/client01.conf # Для *nix клиентов [root@localhost 2.0]# cp /usr/share/doc/openvpn-2.1.1/sample-config-files/client.conf /root/client01.ovpn # Для Windows клиентов
Для добавления программ в автозапуск, в CentOS, используется команда chkconfig. При запуске без параметров выведет возможные ключи. Добавим необходимые сервисы:
[root@localhost ~]# chkconfig --level 2345 openvpn on
Проверяем:
[root@localhost ~]# chkconfig --list
С CentOS закончили.
Клиентская часть OpenVPN
Со страницы официального клиента openvpn качаем клиент под нужную операционную систему, устанавливаем.
Операционная система | Программа | Путь к файлу конфигурации |
Windows | OpenVPN Community Edition binaries | C:\Program Files\OpenVPN\config |
Mac OS X | Tunnelblick | ~/Library/Application Support/Tunnelblick/Configurations |
Linux | openvpn | any |
В Linux подключение происходит следующей командой
sudo openvpn —config ~/path/to/client.ovpn
|
Рассмотрим подключение на примере WinXP. Что-бы все заработало, нужно добавить в Win виртуальное TAP устройство, сделать это можно с помощью bat файла из комплекта OpenVPN ( C:\Program Files (x86)\OpenVPN\bin\addtap.bat ).
Клиентские ключи и конфиг, которые мы копировали в папку /root/ovpn, нужно скинуть на машину-клиента и скопировать в папку C:\Program Files (x86)\OpenVPN\config\client01. Далее запускаете OpenVPN GUI, в трее появится значок, по правому клику вылезем менюшка со списком возможных соединений, там можно обнаружить и наш client01. Соединение берет имя файла конфигурации клиента, в нашем случае это client01.ovpn.
Если все было сделано правильно, после установки соединения с OpenVPN сервером, весь трафик пойдет через созданный шифрованный туннель.
Очень хорошая статья!
На mac-air не получилось настроить…хелп..
что конкретно не получилось?:) Отпиши на почту, помогу)
На фрибсд попробовал поставить по этой схеме…не прокатило( может напишете для фришки еще статейку?)
слишком страшно выглядит для простых смертных…..
Для того, чтобы не засорять системные директории в /usr и для удобства, советую скопировать /usr/share/openvpn/easy-rsa/ в /etc/openvpn, и уже там генерировать сертификаты и ключи.
Pss, вполне разумное замечание:) Ну тут уже все зависит от личного удобства и привычки, мне привычнее держать все в системе.