Объединение двух подсетей с прямым доступом между устройствами при помощи OpenVPN. Часть 2. OpenVPN Server на Asus RT-N10U.

asus-rt-n10u2

Примечание

Этап 1. Включение JFFS.

Во первых необходимо включить в Tomato поддержку jffs. Раздел jffs будет нужен для хранения файла, в котором будут прописаны статические IP устройств внутри подсети OpenVPN. В нем также будут храниться файлы кастомных конфигураций клиентов(client-config-dir), о которых я расскажу ниже.

Для включения jffs необходимо перейти в меню Administration -> JFFS отметить галочкой Enable и сохранить изменения.

Этап 2. Генерация ключей.

Для защиты соединения и проверки прав доступа OpenVPN сервер требует генерации ряда ключей. Для удобной их генерации я собрал архив из связки easy-rsa и openssl.
Для создания ключей используется ряд параметров, такие как название организации, сведения о местоположении, длина ключа и прочие. Для примера они уже заполнены в файле vars.bat. Загрузим их:

vars

Сгенерируем ключ центра сертификации. Т.к. все необходимые переменные уже были заполнены в vars, остается только жать enter на все вопросы.

build-ca
Output

Сгенерируем ключ Диффи — Хеллмана:

build-dh
Output

Сгенерируем серверные ключи указав в качестве имени ServerKey. Опять жмем enter(challenge password можно оставить пустым). В конце 2 раза жмем “y” и enter чтобы подписать сертификат и занести его в базу данных.

build-key-server Serverkey
Output

На тему типов ключей доступа уже написано много в интернете. Расписаны их недостатки и приемущества. Для себя я выбрал ключи pkcs12.
В процессе генерации уже не нужно будет жать только enter как раньше – нужно будет заполнить имена Common Name и Name значениями отличными от ServerKey, иначе произойдет ошибка записи данных о ключе с теми же именами. Для себя я выбрал имена PCKey, TabletKey, SmartKey и NetgearKey. Также необходимо будет заполнить пароли к ключам. Обязательно сделайте это и сделайте их разными.

build-key-pkcs12 PCKey
Output
build-key-pkcs12 TabletKey
Output
build-key-pkcs12 SmartKey
Output
build-key-pkcs12 NetgearKey
Output

Этап 3. Настройка сервера.

Редактируем основные настройки в меню VPN Tunneling -> OpenVPN Server -> Basic:
vpn
Отметить галочку Start with WAN нужно для того, чтобы сервер стартовал автоматически когда включается роутер поднимается сеть.
Тип интерфейса лучше оставить TUN. В отличие от TAP, не придется рутовать смартфон на Android чтобы подключиться к сети.
Протокол рекомендуется ставить UDP, потому что сеть так быстрее будет работать. Но есть одно но. Если вы захотите поднять OpenVPN Client на персональном компьютере находясь за HTTP-прокси, сделать этого у вас не получится – UDP можно прокинуть только через SOCKS. TCP же можно прокинуть через HTTP, поэтому я выбрал его.
В качестве подсети указываем желаемую.
Остальные настройки оставляем по умолчанию.

Теперь можно настроить серверные ключи на вкладке Keys.
Содержимое файла ca.crt нужно перенести в Certificate Authority, ключ из конца файла Serverkey.crt в Server Certificate, Serverkey.key в Server Key, dh1024.pem в Diffie Hellman parameters.
vpn2
После этого можно впервые нажать на кнопку Start Now. Если всё было настроено правильно, надпись на кнопке станет Stop Now, то будет означать что сервер запущен успешно. Если сервер запущен неуспешно ошибки можно посмотреть в файле /var/log/messages непосредственно на роутере.

В качестве подготовки к последней настройке сервера необходимо зайти на роутер по ssh и создать на jffs два файла: /jffs/openvpn/ipp.txt и /jffs/openvpn/ccd/NetgearKey. Оба простые текстовые файлы. Второй без расширения, т.к. должен совпадать с именем Common Name зарегистрированного ключа(в данном случае NetgearKey).
Содержимое файлов:

ipp.txt
NetgearKey
О назначении файлов я напишу ниже.

Последний шаг – настройка дополнительных параметров во вкладке Advanced.
vpn3
На этой вкладке я предпочел не включать галки Push LAN to clients и Direct clients to redirect Internet traffic, а объявил команды вручную в блоке Custom Configuration.
В качестве шифрования выбрал AES-128-CBC.
Сжатие трафика отключено, т.к. забегая вперед, вызывало проблемы на роутере Netgear.

В блок Custom Configuration добавлены следующие команды:

Config
client-to-client – Открывает доступ между клиентами внутри vpn.
topology subnet – Рекомендуемая сейчас топология это subnet, но т.к. она не является в текущий момент по-умолчанию включаю её принудительно. Подробнее здесь.
auth sha1 – Метод хеширования кода авторизации при иницииации соединения с клиентом.
keepalive 10 60 – Сервер пингует клиента, если за последние 10 секунд от него не приходило никаких пакетов, и пытается пересоздать соединение, если пакетов не было 60 секунд.
ifconfig-pool-persist /jffs/openvpn/ipp.txt – Указывает на файл, в котором содержатся имена Common Name ключей и соответствующие им статические IP.
client-config-dir /jffs/openvpn/ccd – Указывает на директорию, в которой хранятся файлы совпадающие с именами Common Name ключей. Внутри файлов содержатся команды исполнять которые нужно только при подключении определенного клиента. В моём случае есть только один такой клиент – роутер Netgear. При его подключении выполняется команда iroute, которая создает внутренний маршрут указывающий на Netgear(192.168.105.0/24).
route 192.168.105.0 255.255.255.0 – Добавляет маршрут указывающий на подсеть из Netgear в Asus при старте OpenVPN Server.
mssfix 1400 – Помог мне вылечить нестабильную передачу данных. 1400 это значение в байтах, которое ограничивает максимальный размер пакета передаваемого внутри vpn-сети. В офф. доке написано, что параметр имеет смысл только при использовании UDP, но мне помог и с TCP.

Все опции push отправляют команду в ковычках клиенту и выполняются уже на клиентской машине.
push “dhcp-option DNS 8.8.8.8” – Назначаем клиентам гугловский DNS в качестве основного.
push “dhcp-option DNS 192.168.110.1” – В качестве вторичного DNS назначаем сам OpenVPN Server.
push “ping 10” – То же самое что и 10 секунд в команде keepalive. Просто передать keepalive на сторону клиента нельзя. Поэтому передаются ping и ping-restart.
push “ping-restart 60” – То же самое что и 60 секунд в команде keepalive.
push “redirect gateway def1” – Позволяет клиентам редиректить весь трафик на сервер и уже с сервера в интернет. С момента подключения внешний IP клиента совпадает с внешним IP роутера.
push “route 192.168.100.0 255.255.255.0” – Добавляет клиентам маршрут указывающий на подсеть Asus 192.168.100.0/24.
push “route 192.168.105.0 255.255.255.0 vpn_gateway 999” – Добавляет клиентам маршрут указывающий на подсеть Netgear 192.168.105.0/24. Большая метрика выставлена скорее всего из-за проблем с Netgear, когда маршрут указывающий на подсеть 192.168.105.0/24 со шлюзом 192.168.110.1(OpenVPN Server) имел меньшую метрику, чем тот же маршрут со шлюзом 192.168.105.1(Netgear). Точную причину не помню)

После занесения конфигурации можно нажать на кнопку Save, после чего OpenVPN сервер автоматически перезагрузится.

Поздравляю! OpenVPN сервер настроен. Теперь нужно протестить подключение к нему.

Leave a Reply

Your email address will not be published. Required fields are marked *