Настройка OpenVpn.

За основу взята статья mak_v_ по первой ссылке. Задача – организовать доступ по защищенному шифрованному каналу к серверу. Сервер – FreeBSD 6.3-RELEASE-p3, два интерфейса:
ed0 – внешний, смотрящий к провайдеру IP 111.111.111.111/30;
em0 – внутренний, смотрящий в локальную сеть IP 192.168.210.1/24.
Удаленные клиенты – Windows XP.
Схема работы – любой сетевой трафик, принимаемый и посылаемый сетевухой инкапсулируется в зашифрованый пакет и доставляется получателю, у него он инкапсулируется и доставляется в локальную сеть. Почему OpenVPN – есть похожий порт /usr/ports/net/mpd5 с помощью которого можно организовать защищенный канал, но он работает на протоколе GRE, который не имеет понятия о портах, посему организовать тунель из под NAT невозможно, только с честных IP.
Основные плюсы OpenVPN:
– кроссплатформенный, работает Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;
– поддержка режимов маршрутизации (routed) и мостов (bridged), т.е. тунелирует и IP-пакеты и Ethernet-фреймы;
– для транспорта использует tcp или udp – может работать поверх Nat.
– клиентам по умолчанию назначают динамические IP-номера, но можно и прописать по каждому статически;
– ассиметрическое шифрование с использованием статических ключей SSL/TLS-сертификатов.

Устанавливаем из портов:
# cd /usr/ports/security/openvpn
# make install clean
В make.conf нужно проследить, чтобы не стояла опция NOPORTDOCS=true(по умолчанию ее нет). Создаем папку /usr/local/etc/openvpn и туда копируем комплект скриптов для создания cертификатов /usr/local/share/doc/openvpn/easy-rsa:
# mkdir /usr/local/etc/openvpn
# cp /usr/local/share/doc/openvpn/easy-rsa /usr/local/etc/openvpn
Теперь нам нужно изменить файлик vars, в котором определяются переменные, необходимые для создания скриптов, я изменил только следующие параметры:

export KEY_COUNTRY=Ua
export KEY_PROVINCE=none
export KEY_CITY=Kiev
export KEY_ORG=”OpenVPN-Firmaname”
export KEY_EMAIL=”admin@firma.com.ua”

В дальнейшем все команды будем выполнять в шеле sh. Определяем переменные оболочки:
# sh
# cd /usr/local/etc/openvpn/easy-rsa
# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/keys
# sh clean-all
Скрипт clean-all проверяет наличие папки /usr/local/etc/openvpn/easy-rsa/keys, если ее нет – она создается, если есть – очищается от содержимого. Теперь создаем корневой и серверный (X.509) сертификат:
# sh build-ca
# sh build-key-server server
На все вопросы отвечаем enter-ом, кроме поля Common Name – пишем server. При создании серверного сертификата указываем пароль и подписываем этот сертификат корневым – два раза отвечаем yes.

Создаем сертификат и ключ для клиента:
# sh build-key user1
# sh build-key user2 …
Ответы на вопросы – аналогично ответам при создании серверного сертификата, только поле Common Name для user1 указываем user1, для user2 указываем user2 и т.д. Этих ключей можно создавать столько сколько клиентов. !!! Если ключ создается позже, по мере необходимости, то перед созданием нужно запускать . ./vars для того ,чтобы определить переменные.

Для более надежной защиты данных при установке соединения клиента с сервером создаем ключ Диффи-Хельмана:
# sh build-dh

Создаем статический ключ HMAC (shared secret) – применяется клиентом и сервером для снижения вероятности проведения DoS-атаки на сервер:
# openvpn –genkey –secret keys/ta.key
# exit

Ключи и сертификаты создали. Теперь определим что нужно серверу, а что клиенту

Серверу Клиенту
ca.crt – главный сертификат
dh1024.pem – ключ Диффи Хельмана
server.crt – сертификат сервера user1.crt – сертификат клиента
server.key – ключ сервера user1.key – ключ клиента
ta.key – TLS-ключ ta.key – TLS-ключ

Теперь настроим сервер. Берем дефолтный конфиг, копируем его в нашу созданную папку openvpn и правим.
# cp /usr/local/share/doc/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/server.conf
# ee server.conf

# На каком IP будет открыт порт для подключенияч клиентов к серверу, если не указывать слушается порт на всех интерфейсах.
;local a.b.c.d

# Какой порт.
port 2000

# Тип пакета tcp или udp.
proto tcp

# Указание типа девайса: tun используется для постоения маршрутизированного ip-тунеля, tap – для ethernet тунеля, используется для режима моста, когда объединяются 2 сети. В нам случае использем tun, т.к. наш сервер будет принимать подключения от многих клиентов, которых нужно зароутить в локальную сеть, при этом отображаться компьютеры в пределах рабочей группы не будут, т.к. запросы по ходят по бродкастах, которые не могут быть зароучены, открыть сетевые папки можно будет только по IP. Для отображения компов рабочей группы нужно использовать режим моста.
dev tun

# Для Window можно задать название TAP-Win32-адаптера, если он у Вас не один, например, в сетевых подключения обычно адаптер называется “Подключение по локальной сети 2(3,4,…)”, меняем название на VPN1, в конфиге указываем dev-node VPN1 и именно этот адаптер будет использоваться при подключениях. Мне это не нужно.
;dev-node MyTap

# Указание размещения SSL/TLS корневого сертификата, сертификата сервера и его ключ, ключ Диффи-Хельмана.
ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt
cert /usr/local/etc/openvpn/easy-rsa/keys/server.crt
key /usr/local/etc/openvpn/easy-rsa/keys/server.key
dh /usr/local/etc/openvpn/easy-rsa/keys/dh1024.pem

# Задаем виртуальную подсеть, из которой будут выделять IP клиентам, только для режима routed, если режим bridged – нужно закоментировать. Сервер берет из себе первый IP-номер – 192.168.210.1.
server 192.168.220.0 255.255.255.0

# Файлик(кеш), в котором будет храниться соответствие клиент <-> виртуальный IP, в случае, когда VPN-сервер временно недоступен, чтобы потом, когда он появится, клиенты смогли получить тот же IP, а не из диапазона 192.168.220.0/24. Дальше по конфигу у меня каждый клиент будет иметь свой собственный IP, поэтому опция для меня безполезна.
ifconfig-pool-persist ipp.txt

# эта опция для режима bridged, если routed – закоментировать. Задание IP/mask на мост и указание диапазона IP, которые будут выдаваться кдиентам.
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.10

# Сеть за VPN 192.168.210.0/24, сеть VPN 192.168.220.1, чтобы клиенты VPN видели сеть локальной сети нужно им задать маршрут, push – команда передается на выполнение клиенту.
push “route 192.168.210.0 255.255.255.0″

# Задание директории для дополнительных настроек для определенных клиентов, предварительно нужно создать папку /usr/local/etc/openvpn/client. У нас есть сертификат с именем user1, создаем в этой папке файлик с таким же названием user1 и в нем прописываем привязку к определенному IP :ifconfig-push 192.168.220.6 192.168.220.5. Помним, что каждому клиенту выдается не один IP, а подсеть /30, имеющая 4 адреса. Сервер имеет 192.168.210.1, посему занята сеть 192.168.210.1-192.168.210.4, следующий клиент будет иметь диапазон 192.168.210.5-192.168.210.8. Вышеуказанной строчкой клиенту присваивается 6-й, серверу 5-й номер.
client-config-dir client

# Задание маршрута сервер-клиент – чтобы сервер видел клиентов.
route 192.168.220.0 255.255.255.252

# Эта опция меняет клиентам маршрут по умолчанию на IP VPN-сервера, весь IP-трафик пойдет через VPN-сервер, что не очень мне хочется.
;push “redirect-gateway”

# Опция передает некие сетевые параметры клиентам
;push “dhcp-option DNS 10.8.0.1″
;push “dhcp-option WINS 10.8.0.1″

# По умолчанию клиенты видят только сервер, опция позволяет клиентам видеть друг друга.
client-to-client

# Эта опция позволяет подключаться по одному ключу и сертификату многим клиентам – считаю это непривильным, каждый клиент должен иметь свой ключ и сертификат,но для тестирования можно использовать.
;duplicate-cn

# Опция keepalive посылает ping каждые 10 сек., если через 120 секун ответ не получен считается хост недоступен.
keepalive 10 120

# Дополнительная защита (можно и без нее). Создается так называемый “HMAC firewall” для защиты от Dos-атак и флуда udp-порта. Генерируется ключ, который прописывается у клиента и сервера. Определяем TLS аутентификацию для сервер (на клиенте – tls-client).
tls-server

# Указываем местоположение ключа с цифрой 0 для сервера и 1 для клиента.
tls-auth /usr/local/etc/openvpn/easy-rsa/keys/ta.key 0

# Указание используемого криптографического сертификата(нужно указать также и на клиенте)
cipher BF-CBC

# Дополнительная опция – в конфиге нет. Таймаут до реконекта 120 секунд.
tls-timeout 120

#Аутентификация MD5 (в конфиге опции нет).
auth MD5

# Использование сжатия в VPN-канале(нужно также указать и на клиенте).
comp-lzo

# Максимальное число одновременно подключенных клиентов.
max-clients 100

# Запуск не от root, а от nobody.
user nobody
group nobody

# Не перечитывать ключи и не переоткрывать TUN/TAP интерфейсы после рестара
persist-key
persist-tun

# Логирование – предварительно нужно создать эту директорию и файлы.
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log

# Уровень логов, 0 – ничего не писать, только фатальные ошибки, 4 – общие сведения, 5 и 6 – для отладки соединения, 9 – все логи.
verb 5

# Если идут в логи 20 однотипных сообщений – в лог пишется только одно.
;mute 20

 

Лог подключения:
Mon Dec 01 12:39:01 2008 OpenVPN 2.0.9 Win32-MinGW [SSL] [LZO] built on Oct 1 2006
Mon Dec 01 12:39:01 2008 Control Channel Authentication: using ‘ta.key’ as a OpenVPN static key file
Mon Dec 01 12:39:01 2008 Outgoing Control Channel Authentication: Using 128 bit message hash ‘MD5′ for HMAC authentication
Mon Dec 01 12:39:01 2008 Incoming Control Channel Authentication: Using 128 bit message hash ‘MD5′ for HMAC authentication
Mon Dec 01 12:39:01 2008 LZO compression initialized
Mon Dec 01 12:39:01 2008 Control Channel MTU parms [ L:1538 D:162 EF:62 EB:0 ET:0 EL:0 ]
Mon Dec 01 12:39:01 2008 Data Channel MTU parms [ L:1538 D:1450 EF:38 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Dec 01 12:39:01 2008 Local Options hash (VER=V4): ’03fa487d’
Mon Dec 01 12:39:01 2008 Expected Remote Options hash (VER=V4): ‘1056bce3′
Mon Dec 01 12:39:01 2008 UDPv4 link local (bound): [undef]:2000
Mon Dec 01 12:39:01 2008 UDPv4 link remote: 62.244.4.14:2000
Mon Dec 01 12:39:01 2008 TLS: Initial packet from 62.244.4.14:2000, sid=6d5eaf80 41eea419
Mon Dec 01 12:40:01 2008 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Mon Dec 01 12:40:01 2008 TLS Error: TLS handshake failed
Mon Dec 01 12:40:01 2008 TCP/UDP: Closing socket
Mon Dec 01 12:40:01 2008 SIGUSR1[soft,tls-error] received, process restarting
Mon Dec 01 12:40:01 2008 Restart pause, 2 second(s)
Mon Dec 01 12:40:03 2008 Re-using SSL/TLS context
Mon Dec 01 12:40:03 2008 LZO compression initialized
Mon Dec 01 12:40:03 2008 Control Channel MTU parms [ L:1538 D:162 EF:62 EB:0 ET:0 EL:0 ]
Mon Dec 01 12:40:03 2008 Data Channel MTU parms [ L:1538 D:1450 EF:38 EB:135 ET:0 EL:0 AF:3/1 ]
Mon Dec 01 12:40:03 2008 Local Options hash (VER=V4): ’03fa487d’
Mon Dec 01 12:40:03 2008 Expected Remote Options hash (VER=V4): ‘1056bce3′
Mon Dec 01 12:40:03 2008 UDPv4 link local (bound): [undef]:2000
Mon Dec 01 12:40:03 2008 UDPv4 link remote: 62.244.4.14:2000
Mon Dec 01 12:40:03 2008 TLS: Initial packet from 62.244.4.14:2000, sid=f53d1cb3 edf5f0b2
Mon Dec 01 12:40:03 2008 VERIFY OK: depth=1, /C=Ua/ST=none/L=Kiev/O=OpenVPN-Firma/CN=server/emailAddress=admin@firma.com.ua
Mon Dec 01 12:40:03 2008 VERIFY OK: nsCertType=SERVER
Mon Dec 01 12:40:03 2008 VERIFY OK: depth=0, /C=Ua/ST=none/O=OpenVPN-Icc/CN=server/emailAddress=admin@icc.ukraine.com.ua
Mon Dec 01 12:40:06 2008 Data Channel Encrypt: Cipher ‘BF-CBC’ initialized with 128 bit key
Mon Dec 01 12:40:06 2008 Data Channel Encrypt: Using 128 bit message hash ‘MD5′ for HMAC authentication
Mon Dec 01 12:40:06 2008 Data Channel Decrypt: Cipher ‘BF-CBC’ initialized with 128 bit key
Mon Dec 01 12:40:06 2008 Data Channel Decrypt: Using 128 bit message hash ‘MD5′ for HMAC authentication
Mon Dec 01 12:40:06 2008 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Mon Dec 01 12:40:06 2008 [server] Peer Connection Initiated with 62.244.4.14:2000
Mon Dec 01 12:40:07 2008 SENT CONTROL [server]: ‘PUSH_REQUEST’ (status=1)
Mon Dec 01 12:40:07 2008 PUSH: Received control message: ‘PUSH_REPLY,route 192.168.210.0 255.255.255.0,route 192.168.220.1,ping 10,ping-restart 120,ifconfig 192.168.220.5 192.168.220.6′
Mon Dec 01 12:40:07 2008 OPTIONS IMPORT: timers and/or timeouts modified
Mon Dec 01 12:40:07 2008 OPTIONS IMPORT: –ifconfig/up options modified
Mon Dec 01 12:40:07 2008 OPTIONS IMPORT: route options modified
Mon Dec 01 12:40:07 2008 TAP-WIN32 device [Подключение по локальной сети 3] opened: \\.\Global\{7ED2932F-F6C8-4B84-843E-8A26FA3D85D0}.tap
Mon Dec 01 12:40:07 2008 TAP-Win32 Driver Version 8.4
Mon Dec 01 12:40:07 2008 TAP-Win32 MTU=1500
Mon Dec 01 12:40:07 2008 Notified TAP-Win32 driver to set a DHCP IP/netmask of 192.168.220.5/255.255.255.252 on interface {7ED2932F-F6C8-4B84-843E-8A26FA3D85D0} [DHCP-serv: 192.168.220.6, lease-time: 31536000]
Mon Dec 01 12:40:07 2008 Successful ARP Flush on interface [3] {7ED2932F-F6C8-4B84-843E-8A26FA3D85D0}
Mon Dec 01 12:40:07 2008 TEST ROUTES: 0/0 succeeded len=2 ret=0 a=0 u/d=down
Mon Dec 01 12:40:07 2008 Route: Waiting for TUN/TAP interface to come up…
Mon Dec 01 12:40:08 2008 TEST ROUTES: 0/0 succeeded len=2 ret=0 a=0 u/d=down
Mon Dec 01 12:40:08 2008 Route: Waiting for TUN/TAP interface to come up…
Mon Dec 01 12:40:09 2008 TEST ROUTES: 0/0 succeeded len=2 ret=0 a=0 u/d=down
Mon Dec 01 12:40:09 2008 Route: Waiting for TUN/TAP interface to come up…
Mon Dec 01 12:40:10 2008 TEST ROUTES: 0/0 succeeded len=2 ret=0 a=0 u/d=down
Mon Dec 01 12:40:10 2008 Route: Waiting for TUN/TAP interface to come up…
Mon Dec 01 12:40:11 2008 TEST ROUTES: 0/0 succeeded len=2 ret=0 a=0 u/d=down
Mon Dec 01 12:40:11 2008 Route: Waiting for TUN/TAP interface to come up…
Mon Dec 01 12:40:12 2008 TEST ROUTES: 2/2 succeeded len=2 ret=1 a=0 u/d=up
Mon Dec 01 12:40:12 2008 route ADD 192.168.210.0 MASK 255.255.255.0 192.168.220.6
Mon Dec 01 12:40:12 2008 Route addition via IPAPI succeeded
Mon Dec 01 12:40:12 2008 route ADD 192.168.220.1 MASK 255.255.255.255 192.168.220.6
Mon Dec 01 12:40:12 2008 Route addition via IPAPI succeeded
Mon Dec 01 12:40:12 2008 Initialization Sequence Completed

Источник информации:
1. http://www.lissyara.su/?id=1549
2. http://amhost.net/doc/openvpn/
3. http://bozza.ru/?c=340&p=content

© Mau, 2008.

Admiralarma.ru - задвижка шиберная фото ножевая