|
Ок, как обещал, совсем простого примера по использованию бесплатного 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
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 необходимо указать и в конфигах клиентов. Довольно неплохо об этом смотрите здесь (на английском).
Комментарии
Добавить комментарий
Поддерживаются теги [b],[/b],[i],[/i]
|