VPN-туннель домой
Я хотел получить доступ к домашней сети из любой точки мира. Например, с работы или из кино. Чтобы забрать какой-то файл, который я оставил на домашнем компьютере, или поставить кино на закачку, или включить вебкамеру и посмотреть, не зашли ли ко мне воры! В TomatoUSB, который я накатил на роутер, как раз есть всё необходимое.
Сначала надо либо арендовать статический IP у вашего провайдера, либо настроить Dynamic DNS, чтобы когда вы не дома, вы всегда могли знать IP-адрес вашего роутера.
Настройки VPN-сервера находятся в разделе «VPN Tunneling → OpenVPN Server». Сначала нагенерим ключи. На роутере нет интерфейса для генерации ключей, будем генерировать на линуксовой или маковой машине. Генерировать надо там, куда не пройдёт злоумышленник, и там, где вы эти ключи не потеряете.
Генерация ключей
Скачиваем easy-rsa. Клонируем или качаем архив в разделе «Releases». И заходим в easy-rsa/easyrsa3
.
Создаём инфраструктуру ключей:
./easyrsa init-pki
Создаём удостоверяющий центр:
./easyrsa build-ca
Команда спросит пароль, вы будете его вводить каждый раз при создании ключей для нового устройства, так что сделайте его надёжным и не забудьте. Ещё спросит «Common Name» — это имя удостоверяющего центра, и для домашней сети можно ввести что угодно.
Эта команда нагенерит два файла: pki/ca.crt
— сертификат, который нужно будет закинуть в роутер и на каждый клиент; и pki/private/ca.key
— приватный ключ удостоверяющего центра, которым и будут подписываться ключи для клиентов. Пароль, который вы вводили — от этого ключа.
Теперь сгенерируем ключи для роутера:
./easyrsa build-server-full router nopass
Команда спросит пароль, который вы создали при генерации удостоверяющего центра. И создаст файлы: pki/private/router.key
— приватный ключ сервера; и pki/issued/router.crt
— сертификат сервера.
Теперь сгенерируем файл Диффи-Хелмана:
./easyrsa gen-dh
Пока команда работает, можно попить чай. Теперь зальём все ключи на сервер. В «VPN Tunneling → OpenVPN Server» на вкладке «Keys» заливаем:
- в поле «Certificate Authority» содержимое файла
pki/ca.crt
; - в поле «Server Certificate» содержимое
pki/issued/router.crt
; - в поле «Server Key» —
pki/private/router.key
; - в «Diffie Hellman parameters» —
pki/dh.pem
.
Не забудьте нажать кнопку «Save» внизу.
Настройка VPN-сервера
На вкладке «Basic» в этом разделе всё нормально, я ещё поставил галку «Start with WAN», чтобы VPN-сервер работал всегда, когда есть интернет.
На вкладке «Advanced» ставлю галку «Respond to DNS», чтобы из VPN можно было ходить по локальным адресам типа mediaserver.lan
, как я писал в предыдущей статье. И под ней появляется галка «Advertise DNS to clients», чтобы клиент при подключении узнавал, что на роутере есть DNS-сервер, в который надо ходить.
Ещё в «Advanced» я ставлю «Manage Client-Specific Options», и появившуюся под ней «Allow Client ↔ Client» — чтобы VPN-клиенты могли между собой взаимодействовать.
Сохраняемся и нажимаем кнопку «Start Now».
Генерация ключей для клиента
Есть два пути: правильный и удобный. Правильный: сгенерировать приватный ключ и запрос на сертификат на клиенте, передать запрос на сертификат на машину, где удостоверяющий центр, сгенерировать из запроса на сертификат сам сертификат, передать сертификат обратно на клиент. Удобный: одной командой сгенерировать всё в удостоверяющем центре. Я использую правильный, когда выписываю ключ для компьютера, и удобный, когда для мобильного устройства.
Удобный способ:
./easyrsa build-client-full lenin nopass
Это значит «сделай всё для клиента по имени lenin и чтобы без пароля». Чтобы с паролем, надо убрать nopass
(будет спрашивать при подключении). Получится два файла: pki/private/lenin.key
и pki/issued/lenin.crt
— ключ и сертификат соответственно.
Правильный способ описан в доке easy-rsa. В общем, генерируете ключи для всех клиентов. Но лучше сначала для одного сделать и проверить, всё ли вы сделали правильно.
Настройка клиента
На клиент надо доставить его приватный ключ, его сертификат, сертификат удостоверяющего центра, и, собственно, настройки: на какой сервер ходить, в какой порт стучаться, какой интерфейс использовать, какой протокол и т.п.
Для того, чтобы все эти файлы притащить на клиент, придумали формат .ovpn
. Там в одном файле и настройки, и ключ, и сертификаты. Формат его такой:
Настройки списком
<ca>
сертификат удостоверяющего центра
</ca>
<cert>
сертификат клиента
</cert>
<key>
ключ клиента
</key>
Я написал скрипт, который генерирует .ovpn
файл из шаблона конфигурации. Там, где у вас удостоверяющий центр, создайте шаблон template.ovpn
примерно такой:
client
dev tun
remote example.com # Замените этот адрес на ваш IP или DDNS-домен
resolv-retry infinite
nobind
persist-key
persist-tun
verb 1
keepalive 10 120
port 1194
proto udp
cipher BF-CBC
comp-lzo
remote-cert-tls server
redirect-gateway
key-direction 1
${ca}
${cert}
${key}
В директории easy-rsa/easyrsa3
, в которой вы генерировали ключи и сертификаты, выполните:
./ovpn_maker.sh template.ovpn lenin > lenin.ovpn
Это значит «сгенерируй-ка мне файл lenin.ovpn
с ключами для клиента lenin
и настройками из template.ovpn
». Полученный файл надо закинуть на устройство.
Настройка Android
- Поставьте OpenVPN Connect.
- Скиньте файл
.ovpn
на телефон. - Откройте OpenVPN Connect, нажмите на кнопку
⋮
в правом верхнем углу и выберите «Import → Import Profile from SD card». - Найдите и импортируйте ваш файл.
Теперь переключитесь на другой WiFi или на мобильный интернет, чтобы проверить подключение. Жмите «Connect» и смотрите, что всё работает. Попробуйте зайти на ваш роутер и на другие сервера вашей домашней сети. Если вы настраивали VPN так, чтобы весь трафик шёл через VPN, то и это проверьте. Например, зайдите на Яндекс.Интернетометр и убедитесь, что ваш IP совпадает с домашним.
Если что-то пошло не так, то можно нажать на ⋮
и выбрать там «Show log file». И разбираться, почему не работает.
Иконку для подключения VPN-туннеля можно вывести на домашний экран. Для этого в приложении нажмите «⋮
→ Add Shortcut». Подключения можно переименовывать.
Настройка iOS
- Установите OpenVPN Connect. Теперь надо скинуть
.ovpn
в телефон. - Подключите телефон к компу и откройте iTunes.
- Выберите там ваш телефон, в левой колонке выберите Apps, и прокрутите вниз до секции «File Sharing».
- В этой секции выберите OpenVPN, жмите кнопку «Add» и выбирайте ваш файл.
- Открывайте на телефоне OpenVPN Connect.
- Там увидите ваш файл, он будет называться типа «адрес-сервера/имя-клиенте». Жмите под ним зелёный плюс.
Теперь так же подключитесь к другой сети (соседский WiFi или мобильный интернет), и попробуйте подключить VPN. Проверьте, что можете открыть ресурсы домашней сети. За кнопкой со статусом соединения (Connecting / Connected) скрывается лог, в который надо смотреть в случае проблем.
Подключения тоже можно переименовывать. И включать их можно прямо в настройках айфона: «Settings → VPN». Всё описанное справедливо и для айпада.
Если вы хотите настроить VPN более тонко, и подробнее узнать про ключи и сертификаты, то почитайте большое руководство по установке и настройке OpenVPN на хабре.