• XSS.stack #1 – первый литературный журнал от юзеров форума

Настройка VPN на основе OpenVPN

Robin Gud

(L1) cache
Пользователь
Регистрация
25.02.2006
Сообщения
517
Реакции
5
1. Предисловие..
Для большинства присутсвующих здесь VPN озночает организация шифрованого соеденения до сервера и получение в конечном итоге интернета не со своего ip-адресса.. Чтож, об том как это реализовать и будет описано в этой статье. В частности будет так же расмотренна установка мобильного клиента(т.е. можно записать на флэшку, и подключаться к впн пару кликами)

Что нам нужно: шелл с правами рута, желательно дедик. Рассматривать будем сервер с ОС FreeBSD

2. Устанавливаем и конфигурируем OpenVPN
Эта часть статьи почти полностью написана KaDaBR'ой(vbs скрипты и не большие переделки конкретно под freebsd с меня)

2.1 Устанавливаем OpenVPN на сервер
# wget http://openvpn.net/release/openvpn-2.0.7.tar.gz
# tar xvzf ./openvpn-2.0.7.tar.gz
# cd ./openvpn-2.0.7
# ./configure
# make
# make install
# rehash

2.2 Создаём ключи

после успешного завершения всех операций необходимо создать сертефикаты и ключи
Заходим в папку с исходниками OpenVPN и в ней:
# cd ./easy-rsa
# ee ./vars (в этом файлике внизу изменяете данные для подписи ключей под себя)
Внимание! Если у вас неустановлен баш, то перед следующими операциями нужно набрать в консоли "sh"
# . ./vars (загружаем эти переменные в оболочку)
# ./clean-all (отчищаем от старых сертификатов и ключей папку keys и создаем серийный и индексные файлы для новых ключей)
# ./build-ca (Создаем Certificate Authority для сервера)
# ./build-key-server server(Создаем сертификат X.509 для сервера)
# ./build-key client (Создаем сертификат X.509 для клиента)

Будьте внимательны при заполнени данных сертификатов, поле Common Name обязательно к заполнению, причем для сервера оно должно быть одно, а для клиента другое. Например в поле Common Name при генерации сертификата X.509 для сервера можно написать server, а для клиента соотвественно client

Создаем ключ Диффи Хельман(о нем можно почитать здесь: http://www.rsasecurity.com/rsalabs/node.asp?id=2248)
# ./build-dh
Теперь выходим из sh написав команду "exit"
И в конце создаем ключ для tls-аутификации
# openvpn --genkey --secret keys/ta.key

После всех этих манипуляций в папке keys получается много файлов:

ca.crt - Главный CA сертификат, этот файл нужен и клиенту и серверу
dh1024.pem - ключ Диффи Хельман, этот файл нужен только серверу
server.crt - Сертификат сервера, нужен только серверу
server.key - Ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
client.crt - Сертификат клиента, нужен только клиенту
client.key - Ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
ta.key - TLS-ключ, нужен и клиенту и серверу
Следовально серверу достаются файлы ca.crt, dh1024.pem, server.crt, server.key, ta.key, а клиентуca.crt, dh1024.pem,client.crt, client.key, ta.key

2.3 Настраиваем сервер

Файл конфигурации можно разместить где угодно, например в /etc/openvpn, так же для удобства скопируем туда все ключи(ca.crt, dh1024.pem, server.crt, server.key, ta.key).
Создаем конфигурационный файл openvpn.conf следующего содержимого:
proto udp #Сервер слушает только udp-порт
local 100.100.100.100 #IP, с которого принимаем подключения
dev tap #используемый тип устройства tap
port 1194 #используемый порт 1194
tls-server #включаем TLS аутификацию
tls-auth ta.key 0 #указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
ca ca.crt #указываем файл CA
cert server.crt #указываем файл с сертификатом сервера
key server.key #указываем файл с ключем сервера
dh dh1024.pem #указываем файл Диффи Хельман
mode server #включаем режим сервера
ifconfig 192.168.231.5 255.255.255.0 #задаем IP-адрес сервера и маску подсети виртуальной сети
ifconfig-pool 192.168.231.6 192.168.231.20 #задаем диапазон IP-адресов выдаваемых клиентам
push "route-gateway 192.168.231.5" #отправляем клиентам строку, с указанием шлюза
push "dhcp-option DNS 192.168.231.5" #задаём адрес dns-сервера
duplicate-cn #ВАЖНО! разрешаем пользоватся одним и тем же ключем, нескольким клиентам одновременно, иначе прийдется для всех клиентов генерировать отдельные сертификаты.
cipher DES-EDE3-CBC #включаем шифрацию пакетов Triple-DES
user nobody #устанавливаем OpenVPN-демону права пользователя nobody
group nobody
persist-tun #Не закрывать и переоткрывать TUN\TAP устройство, после получения SIGUSR1 или ping-restart
persist-key #Не перечитывать ключи после получения SIGUSR1 или ping-restart
comp-lzo #Включить сжатие траффика
keepalive 10 120 #Проверка жизни клиента каждые 10 секунд, если в течении 120 секунд не пришел ответ, то закрывается соединение
verb 3 #Уровень информации для отладки


Всё, сервер настроен, теперь мы его запускаем: openvpn vpn.conf(или то имя, которое вы дали конфигу)

Если vpn незапуститься, и ошибка будет что типа "непподерживаеться tun\tap устройство" то делаем kldload if_tap и загружаем заного

2.4 Настраиваем клиент под Windows

:zns5: Скачать клиент

Устанавливаем необходимые компоненты:

OpenVPN User-Space Components
OpenVPN GUI
OpenSSL DLLs
TAP-Win32 Virtual Ethernet Adapter

Теперь приступим к настройке клиента. Создадим конфигурационный файл openvpn.ovpn в папке config (Например C:\Program Files\OpenVPN\config). И скопируем туда же все необходимые ключи для работы (ca.crt, dh1024.pem, client.crt, client.key, ta.key).


Содержимое файла openvpn.ovpn:

client #указываем OpenVPN, что необходимо работать в режиме клиента
proto udp #указываем, что сервер работает через udp
remote x.x.x.x #хост, к которому присоединяемся
port 1194 #порт к которому следует подключатся
dev tap #используемый тип устройства tap
resolv-retry infinite #количество повторов соединения
redirect-gateway #ВАЖНО! переназначить стандартный шлюз на шлюз VPN
persist-tun #Не закрывать и переоткрывать TUN\TAP устройство, после получения SIGUSR1 или ping-restart
persist-key #Не перечитывать ключи после получения SIGUSR1 или ping-restart
tls-client #указываем, что подключение осуществляется по средствам tls-ключа
tls-auth ta.key 1 #указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
dh dh1024.pem #указываем файл Диффи Хельман
ca ca.crt #указываем файл CA
cert client.crt #указываем файл с сертификатом клиента
key client.key #указываем файл с ключем клиента
cipher DES-EDE3-CBC # Triple-DES #включаем шифрацию пакетов
comp-lzo #Включить сжатие траффика
verb 3 #Уровень информации для отладки

Теперь можно проверить работу клиента.

Нажимаем правой кнопкой мышки по значку в трее. и выбираем Connect

Сначала вылезет вот такое окошко:

Следом если пройдет все хорошо, то в трее загорится зеленый значек с ip-адресом виртуального VPN соединения.

Отключаемся тем же путем что и соединялись только выбрав Disсonnect.

2.5 Мобилизация

Теперь приступим к мобилизации нашего OpenVPN дистрибутива.
Для начала скопируем на переносной носитель информации всю папку OpenVPN (C:\Program Files\OpenVPN)
Далее создадим в корне переносного носителя три VB-скрипта:

InstallVPN.vbs:
Код:
Set WSHShell = WScript.CreateObject("WScript.Shell")
set a = createobject("Scripting.FileSystemObject")
set f = a.getfolder(".")

WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN",f.path & "OpenVPN", "REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\config_dir",f.path & "OpenVPN\config", "REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\config_ext","ovpn", "REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\exe_path",f.path & "OpenVPN\bin\openvpn.exe", "REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\log_dir",f.path & "OpenVPN\log", "REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\priority","NORMAL_PRIORITY_CLASS","REG_SZ"
WshShell.RegWrite "HKEY_LOCAL_MACHINE\Software\OpenVPN\log_append",0, "REG_SZ"
aScript = WSHShell.run("OpenVPN\bin\tapinstall.exe install OpenVPN\driver\OemWin2k.inf tap0801")

UninstallVPN.vbs:
Код:
Set WSHShell = WScript.CreateObject("WScript.Shell")
aScript = WSHShell.run("OpenVPN\bin\tapinstall.exe remove tap0801")
WshShell.RegDelete "HKEY_LOCAL_MACHINE\Software\OpenVPN\"
WshShell.RegDelete "HKEY_LOCAL_MACHINE\Software\OpenVPN-GUI\"


RunVPN.vbs:
Код:
Set WSHShell = WScript.CreateObject("WScript.Shell")
aScript = WSHShell.run("OpenVPN\bin\openvpn-gui.exe")

Теперь, когда нам необходимо восользоватся VPN, вставляем переносной носитель информации, и запускаем файл InstallVPN.vbs.
Дожидаемся установки драйвера TUN-TAP Win32, далее запускаем RunVPN.vbs.
После запуска OpenVPN GUI, выбираем Connect, и насдаждаемся мобильным VPN.

© KaDaBRa(icq 161222, email: kadabra@iks.ru) 2006

3. Выдаём ВПН'у интернет

PS сразу говорю что этот способ не претендует на лучшее решение=)

Ядро должно быть скомпиленно со следующими опциями:
options IPFIREWALL
options IPDIVERT
options IPFIREWALL_FORWARD
(
ipfw впнриципе можно подгрузить и модулем:
kldload ipfw; ipfw add 65000 allow ip from any to any
А если у вас FreeBSD >= 6.0 то перекомпиляция ядра может вообще непонадобиться:
kldload ipdivert
)
В /etc/rc.conf прописываем следующие строчки:

firewall_enable="YES"
firewall_type="/etc/firewall.conf"
firewall_quiet="YES"
firewall_logging="YES"
firewall_flags=""
gateway_enable="YES"
natd_enable="YES"

Содержимое /etc/firewall.conf :
add 65000 allow ip from any to any

Нужно перезагрузиться

Далее:

natd -a х.х.х.х -p 8668 # где x.x.x.x - внешний ip-адресс сервера
ipfw add 10 divert 8668 ip from 192.168.231.0/24 to any
ipfw add 20 fwd y.y.y.y ip from x.x.x.x to any # где y.y.y.y - дефолтный гейт(можно посмотреть в rc.conf) а x.x.x.x тот самый адресс, который указывали в первой команде
ipfw add 30 divert 8668 ip from any to x.x.x.x # думаю что такое x.x.x.x всем понятно

Вот вообщем то и всё, теперь покрайней мере вы сможете попинговать инетовские адреса с клиента, а если правильно указали днс сервера то и получите полноценный мобильный клиент со скрытием ip - адресса и шифрацией трафика
 
1. Где-то я ее уже видел... Разве это ты писал? Копирайтов не нашел.
2.
Для большинства присутсвующих здесь VPN озночает организация шифрованого соеденения до сервера и получение в конечном итоге интернета не со своего ip-адресса..
Конечно, на 90% используется впн для этого, но не помешало бы сказать, что VPN - Virtual Private Network - Виртуальная Частная Сеть --- что-то типа виртуальной локалки поверх интернета, и иногда исползуется и в других целях.
 
Вообще основное использование впн,связь двух локалок через инет в сеть\подсеть.
Ну не скажи, конечно это хорошо и удобно связать две локалки и при этом чтобы всё шифровалось 1024/2048 битным ключом, но долеко не основное
Сейчас VPN используют для обеспечения анонимности:организовывается связь между клиентом и сервером, в итоге у клиента фактически IP'шник сервера
Вобще VPN конечно мощный вариант организации своей безопасности, но делеко не дешёвый, поэтому хорошей заменой ему может быть SSH-туннелинг
Подробнее о нем можно почитать в статье Terabyta
 
Вообще основное использование впн,связь двух локалок через инет в сеть\подсеть.

Ну не скажи, конечно это хорошо и удобно связать две локалки и при этом чтобы всё шифровалось 1024/2048 битным ключом, но долеко не основное
Сейчас VPN используют для обеспечения анонимности:организовывается связь между клиентом и сервером, в итоге у клиента фактически IP'шник сервера
Вобще VPN конечно мощный вариант организации своей безопасности, но делеко не дешёвый, поэтому хорошей заменой ему может быть SSH-туннелинг
Подробнее о нем можно почитать в статье Terabyta
И это тоже .) Эту статейку рекомендовать нужно,имхо для новичков самый лучший вариант.
 
Описание команд и основных опций (и их применимость на сервере и клиенте)
secret, ca, cert, key, dh (сервер, клиент) - указание файлов ключей, сертификатов и т.п. Параметры указывающие на файлы можно (или даже желательно) указывать с полными путями. Для Windows символ "\" указывается как "\\".

dev [tun | tap] (сервер, клиент) - указание типа интерфейса и режима работы: tun = L3-туннель, tap = L2-туннель

dev-node TAP-interface-Name (сервер, клиент) - указание использование конкретного интерфейса, актуально если их в ситеме несколько и они по разному настроены в ОС (например, один tap и включён в мост, а второй - tun)

server-bridge

client-to-client

ifconfig

route

push "команда"


redirect-gateway [local] [def1] (клиент) - переключение шлюза на удалённый, есть 2 доп.параметра - local (см.manual) и def1 - изменяет маршрут не методом удаления старого маршрута 0.0.0.0/0 и назначением нового, а методом назначения двух более узких маршрутов 0.0.0.0/1 и 128.0.0.0/1

dhcp-option DNS 192.168.1.254 (клиент) - использование удалённого DNS

dhcp-option WINS 192.168.1.254 (клиент) - использование удалённого WINS

proto [tcp-server | tcp-client | udp] (сервер, клиент) - протокол, по умолчанию UDP

port 1194 (сервер, клиент) - номер порта, default=1194 (на клиенте для tcp-client игнорируется и используется динамический порт)

nobind (клиент) - указание использовать динамический порт на клиенте

remote host [port] (сервер, клиент) - указание второй стороны, host может быть как DNS-именем, так и IP-адресом. Клиент обязан иметь эту строку, причём она может быть не одна - это обеспечивает возможность подключения к разным интерфейсам сервера (отказоустойчивость) или распределение нагрузки. В режиме tcp-server этот параметр на сервере кроме того работает как фильтр и принимает соединения ТОЛЬКО от указанного host.

remote-random (клиент) - использовать в случайном порядке одну из нескольких строк строк remote

resolv-retry infinite (клиент) - пытаться бесконечно определить адрес сервера (при указании его по имени), чтобы "обойти" проблему с завершением попытки при отказе DNS

comp-lzo (сервер, клиент) - сжатие трафика

status openvpn-status.log (сервер, клиент) - периодически сохранять информ. о текущем состоянии в указанный файл, это текстовый файл.

log openvpn.log или log-append openvpn.log (сервер, клиент) - сохранять или добавлять лог в указанный файл

client-config-dir Client-Config-Dir (сервер) - использовать из указанного каталога дополнительные индивидуальные файлы для конфигугации каждого клиента, файлы должны называться так же как и CN (Common Name, то есть то что укзывается при конфигурации ключа клиента командой build-key, см.далее) клиента без расширения

keepalive 10 120 (сервер, клиент) - "пинговать" противоположную сторону туннеля с периодом 10 сек, при отсутствии ответа в течение 120 сек считать туннель упавшим. Полезно также для поддержания статуса работающего udp-потока в транзитных NAT-шлюзах.

management localhost 8329 (сервер, клиент) - открыть порт 8329 на интерфейсе 127.0.0.1 для управления (см. http://openvpn.net/management.html)
route-method exe (сервер, клиент) - указывает OpenVPN-у, что добавление маршрута надо делать не через API, а через route.exe. См. также в секции "Некоторые распростанённые проблемы и методы решения"

route-delay 10 (сервер, клиент) - см. в секции "Некоторые распростанённые проблемы и методы решения"
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх