Приветствую, хабралюди. Не буду писать традиционное «этой мой первый топик на Хабре, не судите строго». Наоборот — обоснованная критика приветствуется, т.к. я не имею большого опыта написания статей и буду признателен за любую реакцию.
Предупреждение номер раз. Данный пост, скорее всего, не будет интересен гуру от мира сетей. Он в первую очередь адресован тем, чьи интересы лежат в других областях мира IT, но им свойственно любопытство и интересно все новое. Поэтому для тех, кто «в теме» текст может показаться набором известных истин и банальностей. Господа, я стремлюсь не удивить вас, а помочь менее продвинутым в данной области. Все нижесказанное будет касаться исключительно компьютеров под управлением различных версий Windows.
Предупреждение намбер ту. Я также не считаю себя гуру и могу ошибаться/допускать неточности в некоторых утверждениях и суждениях. Однако сам алгоритм действий по настройке рабочий и проверен лично.
Предупреждение три. Много букв. Пишу намеренно подробно, как следствие – обширно.
Если вышесказанное вас не испугало – приступим.
Для начала с помощью wiki напомню, что такое VPN и чем, собственно, оно может быть полезно. VPN (англ. Virtual Private Network — виртуальная частная сеть) — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений (логическую сеть) поверх другой сети (например Интернет). Теперь по-русски. При необходимости можно безопасно объединить сколь угодно удаленные компьютеры так, что они будут считать себя членами одной локальной сети со всеми вытекающими отсюда выгодами и удобствами, был бы только у них доступ в интернет.
Пример первый: ваш домашний провайдер имеет двойной тариф, локальный (дешевый и шустрый коннект) и внешний, «в мир» (подороже и медленней). На одном из недомашних компьютеров, к которым у вас есть доступ (например, рабочем), есть анлим-интернет с хорошей скоростью. Морально-этическо-правовые аспекты оставим в стороне, сейчас нас интересует сугубо технический аспект – можно ли нам получить выход в мир через упомянутый анлим-канал по тарифам локального трафика? Ответ – можно, VPN нам в помощь.
Пример два: находясь вне дома, возникает необходимость получить доступ к файлам домашнего компа. При чем доступ надёжно шифрованный, ибо начинающих кулхацкеров в сети (возможно, и в вашей локальной) хватает и многие из них могут не иметь даже приблизительных понятий о спуфинге, стеке TCP/IP и прочих мудрёных «моделяхоси», но зато знают, как запускать программы типа «Cain&Abel», умеющих не только перехватывать большинство передаваемых в достижимом сегменте сети паролей, но и услужливо брутфорсить те из них, которые зашифрованы, но выбраны не очень качественно. Наряду с другими способами, VPN нам в помощь вновь – весь трафик надёжно шифруется с использованием открытых и годами проверенных алгоритмов и механизмов.
Для организации VPN желательно, чтобы хотя бы одна сторона организовываемого канала имела «честный» IP-адрес. Можно реализовать и между двумя частными сетями с «серыми» IP-адресами за NAT-ом или прокси-сервером, придётся лишь дополнительно привлечь на помощь Hamachi, или обойтись «пробросом порта» (методом “connect” для прокси), если есть доступ к настройкам сервера/роутера. Далее я рассматриваю именно такой случай.
Вариантов организации виртуального частного канала достаточно много, я хочу рассказать об одном из них, бесплатном и общедоступном, как и явствует из названия – OpenVPN. Еще одно преимущество данного ПО в том, что оно кросс-платформенно. Соединяемые компьютеры могут иметь разные ОС, *nix в том числе, но настройка таких машин выходит за рамки данной статьи.
Несомненно, каждый при желании и известной настойчивости может самостоятельно разобраться с установкой и настройкой данного клиент-серверного софта, поэтому цель данной статьи – предупредить о тех граблях, на которые довелось наступить мне, чтобы сэкономить время другим для анализа своих. Итак, (наконец-то!) что и как нужно делать?
1. Качаем софт
2. Ставим. Сперва на стороне будущего сервера. Потом повторим на стороне клиента (это немного проще), хотя последовательность не принципиальна. Я, как существо ленивое, согласился с путями установки по умолчанию (C:\Program Files\OpenVPN\), за что поплатился первыми граблями.
Проблема: при работе софт некорректно отрабатывает пути к конфигурационным файлам, которые содержат пробелы.
Решение: ставить в корень диска в отдельную подпапку без пробелов в названии или же позже «экранировать» в конфигах такие пути кавычками. Я экранировал и дальнейшее описание основано на стандартном пути установки.
3. Для установки шифрованного соединения с удаленной машиной потребуются сертификаты для каждой из сторон виртуального канала, которые будут подтверждать, что они именно те, за кого себя выдают. Их можно купить (сотни долларов в год, хотя бывают и триальные варианты до 90 дней) в одном из многочисленных центрах сертификации (CA). Плюс такого решения – ни одна операционная система или браузер не будет истерить, что сертификат выдан неизвестным поставщиком и «хозяина, одумайся, кому ты веришь?». Минус очевиден – расходы. Второй вариант – создать такие сертификаты самому, соорудив свой локальный CA для личных нужд. Способов для этого есть достаточно много, важно лишь внимательно отнестись к параметрам готовых сертификатов (а именно сличать «отпечатки» (thumbprint или хэши) сгенерированного и внедряемого), которые вы будете подсовывать OpenVPN и убедиться в том, что это именно созданные вами, а не злым хакером, который хочет утащить весь ваш архив
Я упомяну лишь о двух способах создания сертификатов. Первый – с использованием серверной винды. Процедура не самая быстрая и очевидная, но вполне осуществимая. Однако в данном случае удобнее все же использовать второй – встроенные средства самого OpenVPN на любой винде.
Для тех, кто хочет побыстрее и не боится повторять чужие ошибки: все ниже написанное про создание ключей и сертификатов кратко изложенно на английском в файле C:\Program Files\OpenVPN\easy-rsa\README.txt.
Распишу подробнее и расскажу, на чем возникали проблемы у меня.
Центр сертификации, ключи, сертификаты
a. Переходим в C:\Program Files\OpenVPN\easy-rsa
b. Открываем openssl.cnf.sample, правим по необходимости. Тут действует стандартное правило – «не уверен – не трогай». К слову, данный файл можно вообще не менять, настройка по дефолту вполне рабочая. Но если руки чешутся: например, некоторые значения переменных будут обязательны для ввода пользователем при создании сертификата, но их можно задать заранее по умолчанию и они будут отображены как вариант ответа в квадратных скобках, их можно будет применить простым нажатием Enter. Такие переменные обозначены «match». Нетребуемые параметры обозначены «optional». Обязательные для ввода и уникальные параметры, которые каждый раз нужно вводить вручную обозначены «supplied» (такие переменные крайне не рекомендуется переводить в другой статус).
Можно настроить срок действия сертификатов (по умолчанию – 10 лет), ограничения на длину контактной информации пользователя и прочее. Сохраняем под именем openssl.cnf.
c. Запускаем init-config.bat
Внимание, возможны грабли! Рекомендуется этот и все последующие *.bat-файлы запускать не привычно двойным кликом, а в консоли винды. Для тех, кто ею пользуется редко напомню, что немного облегчить себе жизнь можно копипейстом путей для быстрого перехода в нужную папку. Проводник – >выделить путь к папке –> скопировать – >переход в консоль (win+r -> cmd) ->правая кнопка мыши –> вставить (Ctrl+V не прокатит!). Если нужно скопировать путь из консоли в буфер: правая кнопка мыши –> Пометить –> выделить нужный кусок текста –> Enter.
Переходим в консоли в папку C:\Program Files\OpenVPN\easy-rsa и запускаем init-config.bat.
d. Возвращаемся в проводнике в easy-rsa и правим файл vars.bat (советую открыть его WordPad-ом, если открывать из контекстного меню Проводника «изменить» можно получить очередные грабли — сообщение о том, что файл не найден с предложением создать новый, виной тому все тот же пробел в пути). Все параметры снабжены комментариями, разобраться, что к чему, несложно. По большому счёту там все тоже можно оставить по умолчанию, однако по патриотическим соображениям можно и поменять страну, город, вписать свой e-mail. Это ни на что влиять не будет, а просто будет отображаться как информация в сертификатах. Обратите внимание на переменную KEY_DIR=keys. Это название подпапки, которую нужно будет создать после сохранения vars.bat в easy-rsa, там будут лежать ключи и сертификаты, необходимые для шифрования. Имя можно поменять, но не забудьте это отобразить в переменной KEY_DIR.
e. Не забываем создать папку keys или ваш вариант названия.
f. Создаем в keys новые пустые файлы “index.txt“ и “serial”. В easy-rsa уже лежат файлы index.txt.start и serial.start, их можно просто скопировать в keys и там переименовать, убрав расширение .start. В serial будет лежать количество выданных СА сертификатов (первый – сертификат самого СА), в index.txt – информация о выданных сертификатах.
g. Запускаем vars.bat, запускаем clean-all.bat (и снова не забываем — в консоли!)
h. Создаем ключ центра сертификации: запускаем vars.bat, запускаем build-ca.bat отвечаем на вопросы. На все можно отвечать Enter-ом, используя предложенные варианты по умолчанию, кроме уникального ответа на вопрос «Common Name» (т.е. вашего имени или имени компьютера). Пару раз подтвердить намерения, согласиться подписать.
Результат: файл-сертификат центра сертификации «ca.crt» и файл-закрытый ключ СА «ca.key» в папке Keys. Все закрытые ключи необходимо надежно хранить, имея их можно расшифровать все натужно и старательно зашифрованное.
i. Создаем ключ Диффи-Хелмана (что это и зачем – можно прочесть в wiki, если лень — просто примем тот факт, что это нужно): запускаем vars.bat, запускаем build-dh.bat, немного ждем и любуемся процессом. Если запускать build-dh.bat не в консоли, а мышью, то ничего не происходит, опять таки не забываем, я на эти грабли потратил несколько часов.
j. Создаем закрытый ключ и сертификат для сервера: запускаем vars.bat, запускаем build-key-server.bat <имя_сервера>. Имя сервера как параметр через пробел от имени батника при запуске указать весьма желательно, потому как по умолчанию мы получим файлы ключа и сертификата без имен, с одними расширениями, что при некоторых обстоятельствах может привести к перезаписыванию других сертификатов и ключей, так же созданных без имени (еще одни грабли).
k. Создаем закрытый ключ для клиента: запускаем vars.bat, запускаем build-key.bat <имя_клиента>. Рекомендация по имени аналогично – желательно указать. В итоге получим ключ в PEM-формате. (Есть возможность создать ключ в формате PKCS N12, для этого вместо build-key.bat <имя_клиента>. нужно запустить build-key-pkcs12.bat <имя_клиента>. Разницу между форматами описывать не буду, при желании можно погуглить).
l. Все. Не прошло и получаса, как мы создали необходимые ключи и сертификаты для клиента и сервера и сэкономили несколько сотен долларов.
Настройка
4. Теперь собственно настройка OpenVPN. Опять придётся править конфиг-файлы, это наследие linux-корней программы. Переходим в C:\Program Files\OpenVPN\sample-config, копируем оттуда client.ovpn и server.ovpn, кладем их в C:\Program Files\OpenVPN\config.
a. Настройка клиента
В C:\Program Files\OpenVPN\config открываем (можно просто двойным кликом) client.ovpn, читаем комментарии к каждой переменной, меняем нужные нам. Закомментированные варианты начинаются с “;”, действующие (и рекомендуемые) – без точки с запятой в начале. С большинством рекомендованных параметров можно согласиться, как минимум обязательно нужно изменить следующие параметры:
«ca ca.crt». Тут нужно указать полный путь к сертификату центра сертификации. Если ваш путь установки программы совпадает с моим, то он лежит в easy-rsa\keys. Внимание, грабли: в конфигах сервера и клиента в путях к файлам нужно использовать не однократные, а двойные слеши. Это особенность программы. Про еще одни грабли я упоминал ранее: пути содержат пробел, поэтому их необходимо взять в кавычки. Переменная ca будет выглядеть так:
ca «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\ca.crt»
то же проделать с переменными клиента cert и key:
cert «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\<имя_клиента>.crt»
key «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\<имя_клиента>.key»
remote: тут нужно указать IP-адрес сервера и через пробел порт, на котором он будет слушать входящие подключения (порт настраивается при конфигурации сервера).
Небольшое отступление. Так как инициатором соединения в клиент-серверных моделях выступает клиент, то именно сервер должен обладать «честным» IP-адресом или хотя бы находится за сервером/роутером, к которым есть доступ, с таковым. Я настраивал VPN между рабочим (за NAT-ом) и домашним (аналогично) компами, домашний имеет «серый» IP-адрес, но это легко решилось «пробросом» порта (я выбрал 7000) роутера на этот комп, так как у роутера постоянный и «честный» адрес в сети.
Остальные переменные я оставил по умолчанию, вы можете поменять нужное, они хорошо описаны.
b. Настройка сервера.
Переменная port – указываем UDP-порт (или TCP-порт, если вы сменили протокол в переменной proto, нужно только чтобы значение proto совпадало на сторонах клиента и сервера), который сервер будет слушать. Можно выбрать любое значение от 1025 до 65535, важно чтобы оно не конфликтовало с другим серверным софтом, если таковой имеется (или другими программами, которые могут быть привязаны к конкретному порту, например торрент-качалки).
Аналогично клиентским, переменные ключей и сертификатов:
ca «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\ca.crt» (сертификат СА один, клиенту и серверу указывается один и тот же)
cert «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\<имя_сервера>.crt»
key «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\<имя_сервера>.key»
Плюс ключ Диффи-Хелмана:
dh «C:\\Program Files\\OpenVPN\\easy-rsa\\keys\\dh1024.pem»
Переменная server. Определяет частную («серую») сеть, из диапазона которой будут выбраны IP-адреса для соединяемых компьютеров. При организации VPN средствами OpenVPN на сервере и на клиенте появляются новые виртуальные сетевые интерфейсы, которые винда, благодаря драйверам в комплекте, считает вполне полноценными реальными сетевыми картами. Их настройки и определяются этой переменной. В большинстве случаев можно оставить по умолчанию.
Остальные переменные так же можно не менять, упомяну еще только про переменную verb. Она определяет подробность логов, которые будут вестись на стороне сервера про все события и ошибки. Значение 1 – самый минимум подробности, значение 9 вас впечатлит. Так для одной попытки неудачного коннекта я получил лог-файл весом порядка 600 кб. Разумно оставить 3, или повысить до 4-5 при необходимости тщательного анализа ошибок.
5. Теперь необходимо расположить нужные файлы на сторонах сервера и клиента. Самый простой вариант – установить на каждой стороне программу и все файлы, настроенные по алгоритму выше, скопировать в соответствующие папки. Если подходить тщательно и канонично – на стороне клиента оставить только клиентские ключи, сертификаты и сертификат центра сертификации, удалив все, что касается СА и сервера, на стороне сервера удалить все клиентское. Разумно – предварительно забекапив.
Запуск.
6. Настройка завершена, можно пытаться запустить все это. (Не забудьте открыть нужные порты и IP-адреса в файерволах!) Для этого есть два варианта:
a. Переходим на сервере в C:\Program Files\OpenVPN\config, правая кнопка мыши на server.ovpn -> Start OpenVPN on this config file. Аналогично на стороне клиента с файлом client.ovpn. В каждом случае наблюдаем сообщения и в случае удачи на клиенте увидим в последней строке:
«Initialization Sequence Completed»
или
b. Запускаем графическую оболочку C:\Program Files\OpenVPN\bin\ openvpn-gui-1.0.3.exe – Правая кнопка мыши на значке в трее – server – connect (для клиента – client – connect). В случае удачи на клиенте увидим поп-ап окошко из трея вида:
«Assigned IP: 10.8.0.6» и значок позеленеет.
7. Еще одни, последние грабли, с которыми мне довелось столкнуться. Если системная служба “DHCP-клиент” не запущена на клиенте (а я ее намеренно отключил сразу после установки винды, так как IP-адрес у машины постоянный), он не сможет получить IP-адрес, который ему будет пытаться выдать сервер. При чем графическая оболочка будет рапортовать, что адрес получен, но в сетевых подключениях в системной таблице маршрутизации мы этого не увидим.
Применение
8. Связь есть, что теперь? А теперь – только от вашей фантазии все зависит. Можно поставить дома ftp-сервер, слушающий ай-пи адрес виртуального канала (прощай, проблема открытой передачи логина и пароля по протоколу ftp), можно использовать что-то вроде R-Admin-а или его бесплатного аналога TightVNC, можно из дому ходить в интернет через удаленный шлюз (пример первый; правда, для этого нужно будет еще немного повозиться (как минимум — включить) с маршрутизацией на удаленном шлюзе и не забыть, что просто изменив шлюз по умолчанию на удаленный, можно потерять инет вместе с туннелем вообще; тут пригодиться раскомменитровать в настройках сервера переменную push «redirect-gateway def1 bypass-dhcp»). Можно настроить удаленную синхронизацию файлов. В общем, можно сделать все, что можно в локальной сети. И при этом безопасно. Так как туннель поднимается на транспортном уровне OSI – в него можно «завернуть» любое сетевое приложение.
А если к этому еще и прикрутить Wake-On-Lan — получается весьма удобная штука для самых разных применений.
P.S. Так сказать во избежание. Я не имею никакого отношения к проекту OpenVPN.
P.P.S. Картинки честно сперты, ссылки присутствуют.
UPD. Форматирование немного поправил.
Кроме того хочу внести некоторую ясность. Я не ставил перед собой задачу «раскрыть тему Open VPN»: для этого есть соответствующий сайт с подробной документацией. Я не ставил перед собой цель описать все переменные в конфигах: они и так описаны в самих файлах конфигурации, каждая минимум абзацем. Да и при такой подробности изложения статья получилась бы совершенно нечитабельно-огромной и унылой. Я хотел описать набор действий, минимально необходимый для того, чтобы все это запустить. А дальнейший тюнинг и тонкая настройка под конкретные задачи и конфигурации сети — это уже тема отдельной статьи.
UPD-2.Софт обновился до OpenVPN 2.1.1 (released on 2009.12.11), поэтому ссылку в статье обновил. Список изменений тут.