+7 (861)
2900132
info@planetatech.ru
  • Абонентское обслуживание компьютеров
  • Монтаж локальной сети
  • Настройка и обслуживание серверов
  • Внедрение IP телефонии

OpenVPN

Итак, стоит следующая задача: поднять на удаленном сервере, в другой стране, OpenVPN сервер с сертификатной аутентификацией. Весь трафик пользователя ( веб, icq, почта и т.д. ), при подключении VPN, должен автоматически направляться через защищенный канал, без каких либо дополнительных настроек приложений. На выходе получаем трафик с IP адреса OpenVPN сервера.
Сервер стоит на операционной системе 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 отсутствует, поэтому сначала нужно добавить репозитарий в котором есть OprnVPN, я использую 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, это справедливо как минимум для CentOS, в других операционных системах папка может располагаться в другом месте, например во операционной системе FreeBSD ее принято держать в /usr/local/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="ME"  
export KEY_PROVINCE="ME"
export KEY_CITY="MORDOR"
export KEY_ORG="DARKSIDE"
export KEY_EMAIL="darkside@nordor.buu"

Этот файл вызывается перед запуском скриптов генерации для установки необходимых значений переменных окружения. Что-бы лишний раз не заморачиваться с этим, я прописал вызов 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) [ME]:
State or Province Name (full name) [ME]:
Locality Name (eg, city) [MORDOR]:
Organization Name (eg, company) [DARKSIDE]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [DARKSIDE CA]:openvpn-ca  
Name []:openvpn-ca
Email Address [darkside@mmordor.buu]:

Теперь создадим сертификат и секретный ключ для сервера:

[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) [ME]:
State or Province Name (full name) [ME]:
Locality Name (eg, city) [MORDOR]:
Organization Name (eg, company) [DARKSIDE]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [server]:
Name []:
Email Address [darkside@mmordor.buu]:

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:'ME'
stateOrProvinceName   :PRINTABLE:'ME'
localityName          :PRINTABLE:'MORDOR'
organizationName      :PRINTABLE:'DARKSIDE'
commonName            :PRINTABLE:'server'
emailAddress          :IA5STRING:'darkside@mmordor.buu'
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 111.111.111.111 # Адрес, на котором будет висеть 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.50.135: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) [ME]:
State or Province Name (full name) [ME]:
Locality Name (eg, city) [MORDOR]:
Organization Name (eg, company) [DARKSIDE]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) [client01]:
Name []:
Email Address [darkside@mmordor.buu]:

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:'ME'
stateOrProvinceName   :PRINTABLE:'ME'
localityName          :PRINTABLE:'MORDOR'
organizationName      :PRINTABLE:'DARKSIDE'
commonName            :PRINTABLE:'client01'
emailAddress          :IA5STRING:'darkside@mmordor.buu'
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

Rопируем все необходимые клиенту файлы.

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

Где проверить свою анонимность, думаю найдете.

Комментарии

Комментариев пока нет

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