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

  1. Поставьте OpenVPN Connect.
  2. Скиньте файл .ovpn на телефон.
  3. Откройте OpenVPN Connect, нажмите на кнопку в правом верхнем углу и выберите «Import → Import Profile from SD card».
  4. Найдите и импортируйте ваш файл.

Теперь переключитесь на другой WiFi или на мобильный интернет, чтобы проверить подключение. Жмите «Connect» и смотрите, что всё работает. Попробуйте зайти на ваш роутер и на другие сервера вашей домашней сети. Если вы настраивали VPN так, чтобы весь трафик шёл через VPN, то и это проверьте. Например, зайдите на Яндекс.Интернетометр и убедитесь, что ваш IP совпадает с домашним.

Если что-то пошло не так, то можно нажать на и выбрать там «Show log file». И разбираться, почему не работает.

Иконку для подключения VPN-туннеля можно вывести на домашний экран. Для этого в приложении нажмите « → Add Shortcut». Подключения можно переименовывать.

Настройка iOS

  1. Установите OpenVPN Connect. Теперь надо скинуть .ovpn в телефон.
  2. Подключите телефон к компу и откройте iTunes.
  3. Выберите там ваш телефон, в левой колонке выберите Apps, и прокрутите вниз до секции «File Sharing».
  4. В этой секции выберите OpenVPN, жмите кнопку «Add» и выбирайте ваш файл.
  5. Открывайте на телефоне OpenVPN Connect.
  6. Там увидите ваш файл, он будет называться типа «адрес-сервера/имя-клиенте». Жмите под ним зелёный плюс.

Теперь так же подключитесь к другой сети (соседский WiFi или мобильный интернет), и попробуйте подключить VPN. Проверьте, что можете открыть ресурсы домашней сети. За кнопкой со статусом соединения (Connecting / Connected) скрывается лог, в который надо смотреть в случае проблем.

Подключения тоже можно переименовывать. И включать их можно прямо в настройках айфона: «Settings → VPN». Всё описанное справедливо и для айпада.

Если вы хотите настроить VPN более тонко, и подробнее узнать про ключи и сертификаты, то почитайте большое руководство по установке и настройке OpenVPN на хабре.