Проект переехал на новый домен!  [[ перейти ]]

OpenVPN

Стратегия такова
У нас будет сервер vpn на FreeBSD (принимать запросы) 
и клиента я реализовал на WindowsXP (будет делать запрос)  

Сначала устанавливаем из портов
cd /usr/ports/security/openvpn
make install clean && rehash

Всё добро и шаблоны конфигурационных файлов упали в каталог
/usr/local/share/doc/openvpn

Собственно туда и перемещаемся.
cd /usr/local/share/doc/openvpn 

Там меня интересует каталог
../easy-rsa
В этом каталоге лежат скрипты 
для генерация сертификатов (они нам нужны для безопасного 
соединения сервера и клиента)

Так как мы настраиваем сначала серверную часть то
нам нужно побеспокоится от том чтобы в ядре было
разрешено псевдо интерфейс tun.и random (он будет
нужен для генерации случайных чисел)
################################################################
# Pseudo devices.
device          loop            # Network loopback
----------------------------------------------------------------
device          random          # Entropy device
----------------------------------------------------------------
device          ether           # Ethernet support
device          sl              # Kernel SLIP
device          ppp             # Kernel PPP
----------------------------------------------------------------
device          tun             # Packet tunnel.
----------------------------------------------------------------
device          pty             # Pseudo-ttys (telnet etc)
device          md              # Memory "disks"
device          gif             # IPv6 and IPv4 tunneling
device          faith           # IPv6-to-IPv4 relaying (translation)
################################################################
cd /usr/src/sys/i386
cp GENERIC OpenVPN
ee OpenVPN
compile OpenVPN
cd ../compile/OpenVPN
clean depend && make depend
make install clean
reboot

Далее ежели всё прошло успешно и система не порушилась 
от неправильного конфигурирования (всякое бывает)
начинаем генерировать сертификаты:

для этого нам нужно отредактировать следущие файлы:
cd /usr/local/share/doc/openvpn/easy-rsa
ee openssl.cnf  (я там изменил следующие пункты)
################################################################
#dir             = $ENV::KEY_DIR
dir             = /usr/local/share/doc/openvpn/easy-rsa/keys/
#предворительно создав недостающие коталоги коммандой
#mkdir -pv /usr/local/share/doc/openvpn/easy-rsa/keys

#default_bits            = $ENV::KEY_SIZE
default_bits            = 1024

# req_extensions = v3_req # The extensions to add to a certificate request

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
#countryName_default             = $ENV::KEY_COUNTRY
countryName_default             = RU
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
#stateOrProvinceName_default     = $ENV::KEY_PROVINCE
stateOrProvinceName_default     = MyOblast

localityName                    = Locality Name (eg, city)
#localityName_default            = $ENV::KEY_CITY
localityName_default            = MyGorod

0.organizationName              = Organization Name (eg, company)
#0.organizationName_default      = $ENV::KEY_ORG
0.organizationName_default      = MyOrganization

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = MyUnit

commonName                      = Common Name (eg, your name or your server\'s hostname)
commonName_max                  = 64

emailAddress                    = Email Address
#emailAddress_default            = $ENV::KEY_EMAIL
emailAddress_default            = admin@myorganization.ru
emailAddress_max                = 40
################################################################ 
Остальное не трогаем а просто сохраняем наш конфиг...
Следующий шаг это скрипты.
Так как мне не удалось экспортировать пути и переменные
то я руками прописал следующие строчки:
KEY_DIR="/usr/local/share/doc/openvpn/easy-rsa/keys"
KEY_CONFIG="/usr/local/share/doc/openvpn/easy-rsa/openssl.cnf"
в скрипты:
build-ca	build-dh	build-key	build-key-server
так же добавляем в скрипт clean-all строку:
d="/usr/local/share/doc/openvpn/easy-rsa/keys"

Сначала запускаем clean-all
он создаёт в директории /usr/local/share/doc/openvpn/easy-rsa/keys
двай файла index.txt (пустой) и serial (в нём две цифры 01)
Эти файлы не трогаем и продолжаем работать.

Запускаем ./build-ca для генерации главного сертификата:
################################################################
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) [RU]:RU
State or Province Name (full name) [MyOblast]:
Locality Name (eg, city) [MyGorod]:
Organization Name (eg, company) [MyOrganization]:
Organizational Unit Name (eg, section) [MyUnit]:

# ЗДЕСЬ УКАЗЫВАЕМ, ЧТО ЭТОТ СЕРТИФИКАТ на НАШ СЕРВЕР (пишем имя)
---------------------------------------------------------------
Common Name (eg, your name or your server's hostname) []:server
---------------------------------------------------------------

Email Address [admin@myorganization.ru]: 
################################################################


Создаем сертификат X.509 для нашего сервера.
################################################################
#./build-key-server server

Country Name (2 letter code) [RU]:RU
State or Province Name (full name) [MyOblast]:
Locality Name (eg, city) [MyGorod]:
Organization Name (eg, company) [MyOrganization]:
Organizational Unit Name (eg, section) [MyUnit]:

# ЗДЕСЬ УКАЗЫВАЕМ, ЧТО ЭТОТ СЕРТИФИКАТ на НАШ СЕРВЕР (пишем имя)
---------------------------------------------------------------
Common Name (eg, your name or your server's hostname) []:server
---------------------------------------------------------------
Email Address [admin@myorganization.ru]: 

Дальше вводим пароль и организацию! Опять же пишем наш сервер!
Please enter the following 'extra' attributes
to be sent with your certificate request
# пароль
A challenge password []:123456789
# название организации (как и в создании корневого сертификата)
An optional company name []:server

И говорим YES!
################################################################


Теперь тоже самое но для клиента!!!
################################################################
Запускаем ./build-key client для генерации главного сертификата:
################################################################
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) [RU]:RU
State or Province Name (full name) [MyOblast]:
Locality Name (eg, city) [MyGorod]:
Organization Name (eg, company) [MyOrganization]:
Organizational Unit Name (eg, section) [MyUnit]:

# ЗДЕСЬ УКАЗЫВАЕМ, ЧТО ЭТОТ СЕРТИФИКАТ на НАШ КЛИЕНТ (пишем имя)
---------------------------------------------------------------
Common Name (eg, your name or your server's hostname) []:client
---------------------------------------------------------------
Email Address [admin@myorganization.ru]: 

Дальше вводим пароль! Опять же указываем, что это наш клиент!
Please enter the following 'extra' attributes
to be sent with your certificate request
# пароль
A challenge password []:123456789
# название организации (как и в создании сертификата клиента)
An optional company name []: client

И говорим YES!
################################################################


Дальше нужно сделать ключ Хельман 
################################################################
#./build-dh
################################################################
Запустили и набравшись терпения ожидаем завершение процесса.


Осталось создать ключ tls
################################################################
#openvpn --genkey --secret /usr/local/share/doc/openvpn/easy-rsa/keys/ta.key
################################################################

В итоге если полюбоватся на то что у нас получилось, то получится
приблизительно вот это:
#cd /usr/local/share/doc/openvpn/easy-rsa/keys/
#ls -a
00.pem   ca.key       client.key   index.txt.attr       serial        server.csr
01.pem   client.crt   dh1024.pem   index.txt.attr.old   serial.old    server.key
ca.crt   client.csr   index.txt    index.txt.old        server.crt    ta.key

Из всей каши нам нужно следущее:

Для клиента:	Для сервера:
------------	------------
ca.crt		ca.crt
dh1024.pem	dh1024.pem
client.crt	server.crt
client.key	server.key
ta.key		ta.key
------------	------------

Разобрались с сертификатами и переходим к конфигурированию openvpn:
Создадим каталоги:
#mkdir -pv /usr/local/etc/openvpn
#mkdir -pv /usr/local/etc/openvpn/keys
#mkdir -pv /usr/local/etc/openvpn/ccd
#mkdir -pv /usr/local/etc/openvpn/log

Копируем сертификаты и ключи для сервера в каталог /usr/local/etc/openvpn/keys

дальше редактируем конфиг openvpn
################################################################
#cd /usr/local/etc/openvpn/
#ee server.conf
################################################################
#порт на котором работает сервер
port 2000
#протокол
proto tcp
#Это то что мы добавил в ядро ))) 
dev tun0

#Указываем пути на сертификаты для сервера
ca 	/usr/local/etc/openvpn/keys/ca.crt
cert 	/usr/local/etc/openvpn/keys/server.crt
key 	/usr/local/etc/openvpn/keys/server.key
dh 	/usr/local/etc/openvpn/keys/dh1024.pem

# Виртуальная сеть VPN
server 10.1.1.0 255.255.255.0

# В какую сеть нас будут роутить ))))
push "route 192.168.1.0 255.255.255.0"

# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd

# Маршрут сервер-клиент
route 10.1.1.0 255.255.255.252

# TLS! указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-server
tls-auth /usr/local/etc/openvpn/keys/ta.key 0
tls-timeout 120 

#Шифрование
auth MD5 
cipher BF-CBC

#Простой
keepalive 10 120

#Компрессия
comp-lzo

#Макс клиентофф )))
max-clients 100

#Для виндовых машин
user nobody 
group nobody

# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun

# Наши логи
status 	/usr/local/etc/openvpn/log/openvpn-status.log
log /usr/local/etc/openvpn/log/openvpn.log
# Уровень наших логов (3,5,9; 9-не советую!)
verb 3
################################################################

Для этой строки у нас есть каталог с файлом:
----------------------------------------------------------------
# указываем где хранятся файлы с
# настройками IP-адресов клиентов
client-config-dir ccd
----------------------------------------------------------------

Содержимое файла клиентов следущее: 
#cd /usr/local/etc/openvpn/ccd
#####################################
#ee client.conf
#####################################
#где 10.1.1.1 - виртуальны шдюз для VPN
#Соответственно новых клиентов будем 
#добовлять сюда... по принципу...
#ifconfig-push 10.1.1.6 10.1.1.5
ifconfig-push 10.1.1.2 10.1.1.1
#####################################

Ну и для запуска нам нужно прописать всё это дело в /etc/rc.conf
#################################################################
openvpn_enable="yes"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
openvpn_dir="/usr/local/etc/openvpn" 
#################################################################

#reboot
#если есть проблемы смотрим логи
#tail -f /usr/local/etc/openvpn/log/openvpn.log

Так же если стоит фаирвол не забываем открыть порт TCP 2000 )))))
С сервером всё

Переходим к клиенту:
Клиент у нас с WindowsXP... Идём его качать...
Я взял отсюда http://openvpn.se/files/install_packages/ 
предпоследнюю версию. Новая бета смутила меня размером )))
Устонавливаем... Программа вам вешает свой драйвер Через него
и будет идти связь..После установки просят перезагрузку.
Не отказываем )))

В установленом каталоге C:\PROGRA~1\OpenVPN\sample-config можно найти
типы конфигураций.

Скопируем client.ovpn в C:\PROGRA~1\OpenVPN\config и отредактируем
#################################################################
port 2000
proto tcp
dev tun
remote 222.33.44.55   #(реальный айпи вашего сервера куда коннектимся)
client
resolv-retry infinite

ca 	C:\PROGRA~1\OpenVPN\keys\ca.crt
cert 	C:\PROGRA~1\OpenVPN\keys\client.crt
key 	C:\PROGRA~1\OpenVPN\keys\client.key

#Помните что для клиента - 1
tls-client
tls-auth C:\PROGRA~1\OpenVPN\keys\ta.key 1

auth MD5
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
verb 3
#################################################################

Сохраняем и пытаемся коннектится. Вот вроде и всё.
Что не так - смотрим логи! И не забываем про всякие брэндмауэры 
и фаирволы которые могу быть причиной нехождения траффика. )))

Чужую сетку я не нашёл как проглядеть. Но занял IP без проблем
приконектился к ним по их внутреннему IP как будто я в их локалке ))))