информационная безопасность компьютерных сетей
Главная | Новости | Статьи | Контакты | Софт | Поиск

BOZZA'Top 5
Настройка OpenVPN для FreeBSD, Linux и Windows
OpenVPN - настройка в Windows и Linux
Настройка 3proxy для чайников
Установка и настройка прокси сервера на основе Squid
Настройка повторителя (репитера) для беспроводной сети WiFi с поддержкой WPA/WPA2-PSK

Настройка OpenVPN для FreeBSD, Linux и Windows

Тэги: "VPN сервер" "Настройка VPN" "OpenVPN"

Ок, как обещал, совсем простого примера по использованию бесплатного VPN-сервера OpenVPN для организации безопасного удаленного доступа в локальную сеть не вышло. Сначала решил не указывать часть опций в конфигах, потом стало очевидно, что указывать их надо, причем сразу. И по мелочам набралось, так что придется вам прочитать все это безобразие до конца, тогда все станет просто, да и я писал все это вроде не напрасно. В данном случае считаю, что сервер OpenVPN настроен либо на Windows либо на Linux/FreeBSD, а удаленный клиент - Windows XP (например, на ноутбуке сотрудника, который в командировке).

Установку OpenVPN особо комментировать не надо. Она проходит просто и в Windows и в Linux/FreeBSD. В Windows просто скачиваете дистрибутив с GUI с сайта http://openvpn.se, для Linux - можно из портов, Yast или другого менеджера пакетов, для FreeBSD: "cd /usr/ports/security/openvpn", "make", "make install". Другими словами, на этом этапе проблем быть не должно.

Далее действуем полностью аналогично статье "OpenVPN - настройка в Windows и Linux" в части, касающейся генерирования сертификатов:

Переменные, сертификаты и прочие звери OpenVPN

Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты (там, где я не буду указывать дополнительно, имейте ввиду, что в Windows пути внутри папки "OpenVPN" не отличаются от Linux/FreeBSD-версии):

# mkdir -p /etc/openvpn/keys

Копируем комплект скриптов "easy-rsa", предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов (в версии для Windows каталог "easy-rsa" уже лежит в директории C:Program FilesOpenVPN).

# cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn

Экспорт переменных из файла vars (vars.bat - Windows)

Откройте файл /etc/openvpn/easy-rsa/vars и подправьте там пути до уже указанных там файлов. Отсебятины не надо, все уже есть, надо только уточнить значения переменных.

Далее следует экспортировать переменные KEY_*, они необходимы для работы скриптов build-*, генерирующих сертификаты. На этом шаге могу отметить, что у меня не сразу получилось экспортировать переменные из файла /etc/openvpn/easy-rsa/keys, пришлось делать скрипт с экспортом системной переменной $PATH, но, как мне кажется, это чисто у меня такая проблема была (в Windows-версии C:Program FilesOpenVPNeasy-rsavars.bat переменные экспортировались без проблем):

# cd /etc/openvpn/easy-rsa
# . ./vars

Дополнение: только что (уже после опубликования статьи) прочел следующее на http://www.lissyara.su/?id=1549: Внимание! Если у вас по умолчанию не баш, то перед следующими операциями нужно набрать в консоли "sh", советую для "100-%-ного" результата всё же наверняка сделайте это, даже если у вас шелл sh. Загружаем переменные в оболочку (для выхода из режима sh ввести exit):

cd /etc/openvpn/easy-rsa
sh
. ./vars

В Windows откройте командную строку "cmd",

cd C:Program FilesOpenVPNeasy-rsa
vars.bat

Аналогично, далее все скрипты в Linux и Windows запускаются одинаково.

Генерируем ключи и сертификаты OpenVPN

Удаляем все предыдущие файлы ключей и сертифкатов из директории /etc/openvpn/easy-rsa/keys (эта директория указана в переменной KEY_DIR файла vars):

./clean-all

Создаем сертификат подлинности (Certificate Authority) сервера:

./build-ca

Создаем сертификат X.509 для сервера:

./build-key-server server

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

Для создания файла параметров Диффи-Хелмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:

./build-dh

Создаем сертификаты для удаленного клиента:

./build-key client1

На последок генерируем общий для клиента и сервера TLS-ключ, служащий дополнительной защитой. TLS предоставляет возможности аутентификации и безопасной передачи данных через Интернет с использованием криптографических средств. Часто происходит лишь аутентификация сервера, в то время как клиент остается неаутентифицированным. Для взаимной аутентификации каждая из сторон должна поддерживать инфраструктуру открытого ключа (PKI), которая позволяет защитить клиент-серверные приложения от перехвата сообщений, редактирования существующих сообщений и создания поддельных (источник: wikipedia).

openvpn --genkey --secret ta.key

В результате в папке /etc/openvpn/easy-rsa/keys мы имеем следующие файлы:

ca.crt - главный сертификат подлинности (Certificate Authority), этот файл нужен и клиенту и серверу
dh1024.pem - ключ Диффи Хельмана, этот файл нужен только серверу
server.crt - сертификат X.509 сервера (стандарт X.509 ITU-T является фундаментальным стандартом, лежащим в основе всех остальных, используемых в Инфраструктуре Открытых Ключей (ИОК). Основное его назначение - определение формата электронного сертификата и списков отозванных сертификатов), нужен только серверу
server.key - ключ сервера, нужен только серверу (СЕКРЕТНЫЙ файл)
client1.crt - сертификат X.509 клиента, нужен только клиенту
client1.key - ключ клиента, нужен только клиенту (СЕКРЕТНЫЙ файл)
ta.key - TLS-ключ, нужен и клиенту и серверу

Серверу - одно, клиенту - другое

Теперь в папку /etc/openvpn/keys на будущем сервере OpenVPN скопируем файлы ca.crt, dh1024.pem, server.crt, server.key и ta.key:

mkdir /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/keys/ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys

В папку будущего клиента /etc/openvpn/client1 скопируем файлы ca.crt, client1.crt, client1.key и ta.key:

mkdir /etc/openvpn/client1
cp /etc/openvpn/easy-rsa/keys/ca.crt client1.crt client1.key ta.key /etc/openvpn/client1

Теперь подкаталог "client1" можно скопировать в папку конфигурации будущего удаленного клиента Windows.

В принципе, в папке /etc/openvpn/easy-rsa/keys/ все файлы можно оставить, на всякий случай :) Права на доступ к папке openvpn лучше обновить до правильных:

chown -R root:wheel /etc/openvpn

Конфиг сервера OpenVPN

Расположение файла конфигурации сервера: "/etc/openvpn/config/server.conf" (для Windows: "C:Program FilesOpenVPNconfigserver.ovpn").

Пример файла конфигурации сервера OpenVPN (подходит для Windows, Linux, FreeBSD с минимальными изменениями):

port 1194

# на сайте разработчиков рекомендуется использовать udp в том числе
# по соображениям безопасности
proto udp

dev tun

ca "/etc/openvpn/keys/ca.crt"
cert "/etc/openvpn/keys/server.crt"
key "/etc/openvpn/keys/server.key" # Этот файл хранить в секрете!

dh "/etc/openvpn/keys/dh1024.pem"

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

#задаем IP-адрес сервера и маску подсети
server 10.8.0.0 255.255.255.0

#задаем МАРШРУТ который передаём клиенту
# и маску подсети для того чтобы он "видел"
# сеть за OpenVPN сервером (сеть 192.168.1.0/24)
push "route 192.168.1.0 255.255.255.0"

ifconfig-pool-persist "/etc/openvpn/config/ipp.txt"

# удерживать соединение (полезно при работе через nat, proxy и т.п.)
keepalive 10 120

# включаем шифрацию пакетов
cipher BF-CBC

# включить сжатие
comp-lzo

# максимум клиентов
max-clients 5

;user nobody
;group nobody

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

# клиенты могут "видеть" друг друга
client-to-client

status "/etc/openvpn/log/openvpn-status.log"

log "/etc/openvpn/log/openvpn.log"
log-append "/etc/openvpn/log/openvpn.log"

# уровень детализации отчетов
verb 3

Примечания к конфигурационному файлу сервера OpenVPN

В данном конфиге будут только два различия в версиях сервера для Unix или для Windows.

1. Пути расположения файлов конфигурации, сертификатов и пр. в конфиге для Windows должны прописываться так:

dh "C:\Program Files\Openvpn\config\dh1024.pem"

а в Linux/FreeBSD так:

dh "/etc/openvpn/config/dh1024.pem"

2. В конфиге для Windows следующие строки должны быть закомментированы:

;user nobody
;group nobody

а в Linux/FreeBSD (по желанию или по соображениям безопасности, но режиме отладки самого сервера OpenVPN можно сначала запускать сервер OpenVPN под админом, чтобы в случае проблем не грешить на права доступа, но потом обязательно сменить запуск на nobody!!!) раскомментированы:

user nobody
group nobody

С конфигом для сервера, в принципе, все. Для начала работы вполне достаточно того конфига, который указан выше.

Автозапуск сервера OpenVPN в Linux/FreeBSD

Для автоматического запуска сервера OpenVPN можно использовать следующий скрипт (# - комментарий), например, start_openvpn.sh (не забудьте сделать его исполняемым "chmod +x start_openvpn.sh"):

#!/bin/sh
dir=/etc/openvpn/config
modprobe tun
echo 1 > /proc/sys/net/ipv4/ip_forward
openvpn --cd $dir --daemon --config /etc/openvpn/config/server.conf
# кстати, здесь можно запускать несколько серверов OpenVPN одновременно:
# openvpn --cd $dir --daemon --config /etc/openvpn/config/server2.conf

либо такой (например, во FreeBSD):

openvpn_enable="YES"
openvpn_if="tun" #
openvpn_configfile="/etc/openvpn/config/server.conf"
openvpn_dir="/etc/openvpn" # --cd directory

Конфиг клиента OpenVPN на Windows XP

Файлы клиента берем из папки /etc/openvpn/client1 на сервере и копируем их в папку C:Program FilesOpenVPNconfig на клиенте.

Расположение файла конфигурации клиента: "C:Program FilesOpenVPNconfigclient1.ovpn" (для Linux/FreeBSD расположение, полагаю, где-либо в домашней папке юзера, к примеру, /home/vpn/client1.ovpn).

Пример файла конфигурации клиента OpenVPN :

client

dev tun

proto udp

# IP-адрес и порт сервера OpenVPN)
remote 444.333.222.111 1194

resolv-retry infinite

nobind

persist-key
persist-tun

ca "C:\Program Files\OpenVPN\config\ca.crt"
cert "C:\Program Files\OpenVPN\config\client1.crt"
key "C:\Program Files\OpenVPN\config\client1.key"

tls-client
tls-auth "C:\Program Files\OpenVPN\config\ta.key" 1
auth MD5

#Это еще одна защита, на этот раз от "man in the middle" атаки
ns-cert-type server

comp-lzo

verb 3

Ну вот и все. Вообще говоря, совсем просто не вышло, просто не получается проще. В итоге - очередной клон многих статей про OpenVPN. Если вы устанавливали на клиентском компьютере версию OpenVPN с GUI (http://openvpn.se), то после того, как файлы клиента (сертификаты и конфиг) будут скопированы в директорию "C:Program FilesOpenVPNconfig", щелкните пиктограмму OpenVPN в трее, выберите Connect и смотрите на процесс инициализации удаленного доступа. После успешного прохождения инициализации, появиться уведомление, что вашему адаптеру TAP-Win32 назначен адрес. Откройте окно терминала "cmd" и наберите "ipconfig". Можете пинговать себе удаленный сервер в свое удовольствие!

Возможные проблемы

Если что-то идет не так, то проверьте сначала следующее - в конфигурационных файлах пути до сертификатов и пр. прописаны правильно (не забудьте про разницу написания путей в Linux и Windows!). Со стороны клиента попробуйте выполнить nmap с ключом -sU (udp-сканирование), убедитесь, что сервер запущен. Если сервер не запускается, смотрите логи в /var/log/messages (в Windows будут гореть зеленые огоньки на пиктограмме в трее, если все нормально), проверьте еще раз пути и наличие всех необходимых файлов сертификатов. Еще один вариант - измените тип протокола с udp на tcp (некоторые провайдеры режут udp), изменив конфиги клиента и сервера. Помните, что несмотря на кучу всяких там сертификатов, конфигов и прочего хлама - OpenVPN очень прозрачная система с настолько простой структурой, что ее практически без изменений можно переносить с Windows на Linux, с FreeBSD на Windows и т.д. - т.е. проблем может быть совсем немного. Так что дерзайте, пишите отзывы, прочтите сразу несколько мануалов (они все похожи, но каждый несет в себе что-то особенное). Могу сказать, что самое сложное для меня было прочитать до конца и начать редактировать файл vars.bat. Дальше все пошло нормально. Сначала я сделал сервер и клиент на Windows (почему-то проще показалось), потом перенес сертификаты и конфиги на сервер OpenSuSe 11 - все заработало (как говорил выше, попарился только с экспортом переменных).

Укрепление безопасности сервера OpenVPN

При введении в эксплуатацию сервера OpenVPN (да и не только его одного) надо понимать, что вы фактически даете зеленый свет для всяких любителей "посканить", "потрогать" и т.п. Поэтому по возможности используйте разные правила доступа в сеть для клиентов OpenVPN и для локальных пользователей. Скорее всего, обратить внимание надо будет на доступ удаленных клиентов к серверам, возможно, удаленным пользователям будет достаточно доступа к корпоративной почте (ведь чаще всего удаленный доступ нужен командированным сотрудникам, у которых с собой могут быть необходимые документы, а опративность сможет ограничиться почтовыми сервисами - помните, что чем меньше сможет сделать пользователь, тем меньше сможет сделать нарушитель, особенно, если права доступа ограничены на уровне брандмауэра на сервере.

Отдельно могу отметить, что с помощью OpenVPN и брандмауэра pf можно сделать такой набор правил, что для разных удаленных клиентов будут применяться разные правила брандмауэра! Но это уже немного другой разговор, и я оставлю это вам как затравку.

Использованные материалы:
1. http://www.lissyara.su/?id=1549
2. http://www.xakep.ru/magazine/xa/110/156/1.asp

Дополнения: взаимодействие между клиентами

В процессе работы я отметил, что если использовать интерфейсы tun, то клиенты друг с другом не взаимодействуют. Различные изменения в назначении ip-адресов клиентам вручную, автоматом, автоматом из определенного диапазона ни к чему не привели (возможно, я не учел какой-нить маааленький нюанс). А я хотел, чтобы клиенты могли пинговать друг друга, взаимодействовать друг с другом. После некоторого времени поисков было принято решение вместо tun использовать tap-интерфейсы в конфиге (разница между ними в том числе в маске подсети: для tun последний октет *.252, в то время как для tap - *.какую_хошь, соответственно, при маске *.252 (11111100) другого клиента и не должно быть видно). Так что если хотите, чтобы удаленные клиенты юзали друг друга, попробуйте следующий конфиг сервера server.conf:

port 1194
proto udp
dev tap

ca "/etc/openvpn/keys/ca.crt"
cert "/etc/openvpn/keys/server.crt"
key "/etc/openvpn/keys/server.key"
dh "/etc/openvpn/keys/dh1024.pem"
auth MD5

mode server
# задаем ip-сервера
ifconfig 10.8.0.1 255.255.255.0

# задаем интервал раздачи ip-адресов клиентам
ifconfig-pool 10.8.0.2 10.8.0.10 255.255.255.0

push "route 192.168.1.0 255.255.255.0"

ifconfig-pool-persist "/etc/openvpn/config/ipp.txt"

keepalive 10 120

# указываем шифрование
cipher BF-CBC

comp-lzo

max-clients 5

user nobody
group nobody

persist-key
persist-tun

client-to-client

status "/etc/openvpn/log/openvpn-status.log"

log "/etc/openvpn/log/openvpn.log"
log-append "/etc/openvpn/log/openvpn.log"

verb 3

Естественно, интерфейс tap необходимо указать и в конфигах клиентов. Довольно неплохо об этом смотрите здесь (на английском).

Комментарии

30.5.2009 7:15
Виталий
Отличная статья! Все написано понятно, после первого же прочтения все получилось!
3.6.2009 16:39
Дмитрий
Я не дока в настройках VPN. Не понимаю в чем дело. Вроде делаю так же, но ген-я серт.не проходит. При запуске build-ca сообщает
3.6.2009 19:6
Дмитрий
2480:error:02001005:system library:fopen:Input/output error:.cryptoioss_file.c:126:fopen('C:Program FilesOpenVPNeasy-rsa','rb')
2480:error:2006D002:BIO routines:BIO_new_file:system lib:.cryptoioss_file.c:131:
2480:error:0E078002:configuration file routines:DEF_LOAD:system lib:.cryptoconfconf_def.c:199:
ОС - win 2003
2.10.2009 22:42
Алексей
Ошибка на первых же шагах ((<br />
<br />
aster# pwd<br />
/etc/openvpn/easy-rsa<br />
aster# sh<br />
# . ./vars<br />
NOTE: when you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys<br />
# ./clean-all<br />
./clean-all: Permission denied<br />
# ./build-ca<br />
./build-ca: Permission denied<br />
3.10.2009 15:47
billybons2006
Алексей, а вы под админом выполняете clean-all и build-ca?
17.10.2009 17:32
Виталий
У меня все так просто не взлетело, возникла непонятная проблема:<br />
<br />
Клиент: Windows Vista Ultimate<br />
Сервер: Ubuntu Server 9.04 (за ним локалка)<br />
Интернет: безлимитный, но это не суть важно :)<br />
<br />
Задача: Получить доступ к локалке, а значит ее шарам и сервисам с удаленной машины.<br />
<br />
Все сделал, как написано, коннект проходит вроде бы нормально (экранчики на клиенте - зеленые, логи на сервере не матюкаются).<br />
<br />
Но вот пингов между [клиентом] и [локалкой за сервером] нет, и какой в чей бубен стучать
18.10.2009 22:35
billybons2006
Виталий, а сам сервер Ubuntu пингуется?<br />
Если да, то возможно вопрос в настройке роутинга:<br />
<br />
push &quot;route 192.168.1.0 255.255.255.0&quot;<br />
<br />
Мне ни разу не было необходимости соединять сети через OpenVPN. Я только предоставлял доступ к серверу в зоне DMZ, которая в локалку входа не имееет. Но фишка именно в команде push &quot;route... &quot;.
22.10.2009 16:28
Виталий
billybons2006, Вот здесь максимально подробно описана проблема: forum.ubuntu.ru/index.php?topic=70908<br />
<br />
Локалка у меня 10.0.0.0/255.0.0.0<br />
<br />
В конфиге OpenVPN:<br />
push &quot;route 10.0.0.0 255.0.0.0&quot;<br />
<br />
Нигде помочь никто не может... :(
7.6.2010 16:47
first2006
Виталий, я думаю Вам нужно изменить ip адресацию на сервере VPN, т.к. &quot;Локалка у меня 10.0.0.0/255.0.0.0&quot; , то например так<br />
<br />
# задаем ip-сервера VPN<br />
ifconfig 192.168.1.1 255.255.255.0<br />
# задаем интервал раздачи ip-адресов клиентам<br />
ifconfig-pool 192.168.1.2 192.168.1.254 255.255.255.0<br />
# задаем им щлюз<br />
push &quot;route-gateway 192.168.1.1&quot;<br />
, а вот чтобы ваши VPN клиенты видели и пинговали адреса вашей внутренней сети, добавить<br />
<br />
#задаем МАРШРУТ который передаём клиенту<br />
7.6.2010 16:49
first2006
<br />
#задаем МАРШРУТ который передаём клиенту<br />
# и маску подсети для того чтобы он &quot;видел&quot;<br />
# сеть за OpenVPN сервером (сеть 10.0.0.0)<br />
push &quot;route 10.0.0.0 255.0.0.0&quot;<br />
<br />
Это всё выше написано, я обобщил к вашему варианту, у меня так примерно работает<br />
29.7.2010 10:51
Илья
Подскажите &quot;...Можете пинговать себе удаленный сервер в свое удовольствие!&quot;, собственно после подключения пинги без проблем идут на любую машину сети за OpenVPN, а вот открыть ни одну шару не удается, так же как и запустить RDP. В какую сторону вообще копать?
30.7.2010 10:20
billybons2006
Илья, мне кажется, что проблема в использовании/не использовании команды push &quot;route... &quot;. Как я писал выше, мне не приходилось ее использовать, поэтому точно объяснить не смогу. Думаю, нацти информацию об этом будет просто в Яндексе или Гугле.
6.8.2010 12:31
Максим
Всем привет,<br />
ищем специалиста, который может установить OpenVPN на нашу сетку.. Пишите сюда info@kemaclub.ru<br />
<br />
По оплате договоримся..<br />
<br />
всем спасибо..
19.2.2011 11:20
siv237
про iroute забали?
22.2.2011 12:44
billybons2006
Действительно, про --iroute малость забыли :) Для тех, кто желает просветиться - http://openvpn.net/index.php/manuals/427-openvpn-22.html (ищите iroute).
10.3.2011 1:55
karavan
Тем у кого под linux ошибки вроде этой &quot;./clean-all: Permission denied&quot;<br />
проверьте права доступа, а так же флаги исполняемости.
6.7.2011 21:2
Volframka
Возможно, уже много раз спрашивали. Но у меня проблема.<br />
Настроил, как написано. Сервер-клиент &quot;общаются&quot; без проблем.<br />
Но клиенту надо &quot;идти&quot; дальше в инет.<br />
Провайдер айпишник выдает автоматически, всегда один, но автоматически. Сеть с провайдером тоже организована с помощью vpn. (интернет московский проводной beeline)<br />
<br />
Если более подробнее, то в компании закрыты все порты, кроме 20 и 21. Договорится с админом не получилось.<br />
Стац. комп хочу организовать как сервер, ч
12.11.2011 22:4
Геннадий
# IP-адрес и порт сервера OpenVPN)
remote 444.333.222.111 1194

Это сила...
Гляньте хотя бы сюда http://habrahabr.ru/blogs/sysadm/92767/
Я не призываю так уж фанатично следовать RFC, но хотя бы за 255 не перескакивать, а то возникают некоторые сложности при переводе такого адреса в двоичный или шестнадцатеричный формат. Да и маску сложно определить.
А в остальном - хорошая статья.
13.11.2011 11:34
billybons2006
Геннадий, по поводу ip 444.333.222.111 - это же специально написано, чтобы наверняка уж исправили ДО "service openvpn start" ;)
6.12.2011 13:43
Сергей
cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn
у меня нету комплекта скриптов easy-rsa
в чём может быть проблема)
6.12.2011 17:53
billybons2006
Сергей, сама папка-то есть? Если папка есть, а скриптов нет - то, пожалуй, не знаю. А если самой папки нет, так может она в другом месте лежит? Дистрибутивов со своими фишечками сейчас немало.
17.2.2012 22:50
Роман
billybons2006, посмотрите наличие папки и скриптов поэтому пути: /usr/local/share/doc/openvpn/easy-rsa
У меня скрипты там находятся

Добавить комментарий

Поддерживаются теги [b],[/b],[i],[/i]

Ваше имя:
Email:
(не публикуется, для уведомлений о новых комментариях)
Сообщение
(максимум 2000 символов):



 


Главная | Новости | Статьи | Ссылки | Контакты | Софт | Поиск

Внимание! Любое использование информации с этого сайта возможно
только с письменного разрешения владельца сайта bozza.ru
Рейтинг@Mail.ru Rambler's Top100 network monitoring software
Внешние ссылки: Геометрическая оптика