company_banner

VPN в домашнюю локалку



    TL;DR: я устанавливаю Wireguard на VPS, подключаюсь к нему с домашнего роутера на OpenWRT, и получаю доступ к домашней подсети с телефона.

    Если вы держите на домашнем сервере личную инфраструктуру или у вас дома множество девайсов управляемых по IP, то вы наверняка хотите иметь к ним доступ с работы, из автобуса, поезда и метрo. Чаще всего для аналогичных задач приобретается IP у провайдера, после чего порты каждого сервиса пробрасываются наружу.

    Вместо этого я настроил VPN с доступом в домашнюю локалку. Плюсы такого решения:

    • Прозрачность: чувствую себя как дома при любых обстоятельствах.
    • Простота: настроил и забыл, не надо думать о пробросе каждого порта.
    • Цена: у меня уже есть VPS, для таких задач современный VPN почти бесплатен по ресурсам.
    • Безопасность: ничего не торчит наружу, можно оставить MongoDB без пароля и никто не утащит данные.

    Как всегда, есть и минусы. Во-первых, вам придётся настраивать каждый клиент по отдельности, в том числе, на стороне сервера. Может быть неудобно при наличии большого числа устройств, с которых хочется иметь доступ к сервисам. Во-вторых, у вас на работе может оказаться совпадающая по диапазону локалка — придётся разрешать эту проблему.

    Нам понадобится:

    1. VPS (в моём случае на Debian 10).
    2. Роутер на OpenWRT.
    3. Телефон.
    4. Домашний  сервер с каким-нибудь веб-сервисом для проверки.
    5. Прямые руки.

    В качестве технологии VPN я буду использовать Wireguard. Это решение также имеет сильные и слабые стороны, я их не буду описывать. Для VPN я использую подсеть 192.168.99.0/24, а дома у меня 192.168.0.0/24.

    Конфигурация VPS


    Для дела хватит даже самого нищенского VPS за 30 рублей в месяц, если вам повезёт такой урвать.

    Все операции на сервере я выполняю от рута на чистой машине, при необходимости добавьте `sudo` и адаптируйте инструкции.

    Wireguard не успели завезти в стейбл, поэтому я выполняю `apt edit-sources` и добавляю бэкпорты двумя строчками в конец файла:

    deb http://deb.debian.org/debian/ buster-backports main
    # deb-src http://deb.debian.org/debian/ buster-backports main


    Пакет устанавливается привычным образом: apt update && apt install wireguard.

    Далее генерируем пару ключей: wg genkey | tee /etc/wireguard/vps.private | wg pubkey | tee /etc/wireguard/vps.public. Эту операцию повторите ещё дважды для каждого девайса-участника схемы. Поменяйте пути к файлам с ключами для другого устройства и не забудьте о безопасности приватных ключей.

    Теперь готовим конфиг. В файл /etc/wireguard/wg0.conf помещается конфиг:

    [Interface]
    Address = 192.168.99.1/24
    ListenPort = 57953
    PrivateKey = 0JxJPUHz879NenyujROVK0YTzfpmzNtbXmFwItRKdHs=

    [Peer] # OpenWRT
    PublicKey = 36MMksSoKVsPYv9eyWUKPGMkEs3HS+8yIUqMV8F+JGw=
    AllowedIPs = 192.168.99.2/32,192.168.0.0/24

    [Peer] # Smartphone
    PublicKey = /vMiDxeUHqs40BbMfusB6fZhd+i5CIPHnfirr5m3TTI=
    AllowedIPs = 192.168.99.3/32


    В секции [Interface] указываются настройки самой машины, а в [Peer] — настройки для тех, кто будет к ней подключаться. В AllowedIPs через запятую прописываются подсети, которые будут маршрутизироваться в соответствующего пира. Из-за этого пиры устройств-«клиентов» в подсети VPN должны иметь маску /32, всё остальное будет маршрутизироваться сервером. Так как домашняя сеть будет маршрутизироваться через OpenWRT, в AllowedIPs соответствующего пира дописываем домашнюю подсеть. В PrivateKey и PublicKey разложите приватный ключ сгенерированный для VPS и публичные ключи пиров соответственно.

    На VPS осталось только запустить команду, которая поднимет интерфейс и добавит его в автозапуск: systemctl enable --now wg-quick@wg0. Текущий статус соединений можно проверить командой wg.

    Конфигурация OpenWRT


    Всё, что нужно для этого этапа есть в модуле luci (веб-интерфейс OpenWRT). Залогиньтесь в нём и в меню System откройте вкладку Software. OpenWRT не хранит кэш на машине, поэтому надо обновить список доступных пакетов, нажав на зелёную кнопку Update lists. После завершения в фильтр вбиваете luci-app-wireguard и, глянув на окошко с красивым деревом зависимостей, устанавливаете этот пакет.

    В меню Networks выбираете Interfaces и жмёте зелёную кнопку Add New Interface под списком уже имеющихся. После ввода имени (так же wg0 в моём случае) и выбора протокола WireGuard VPN открывается форма настроек с четырьмя вкладками.



    На вкладке General Settings надо вбить приватный ключ и IP адрес заготовленный для OpenWRT вместе с подсетью.



    На вкладке Firewall Settings заводите интерфейс в локальную сеть. Так соединения из VPN будут свободно попадать в локалку.



    На вкладке Peers жмёте единственную кнопку, после чего в обновленной форме заполняете данные VPS-сервера: публичный ключ, Allowed IPs (надо всю VPN-подсеть замаршрутизировать в сервер). В Endpoint Host и Endpoint Port вводите соответственно IP адрес VPS с портом в ранее указанным в директиве ListenPort. Отметьте Route Allowed IPs, чтобы были созданы маршруты. И обязательно заполните Persistent Keep Alive, иначе туннель туннель от VPS к роутеру будет обрываться, если последний за NAT.





    После этого можно сохранить настройки, а затем на странице со списком интерфейсов нажать Save and apply. При необходимости явно запустите интерфейс кнопкой Restart.

    Настраиваем смартфон


    Вам потребуется клиент Wireguard, он доступен в F-Droid, Google Play и App Store. Открыв приложение жмёте плюсик и в секции Interface вводите имя соединения, приватный ключ (публичный сгенерируется автоматически) и адрес телефона с маской /32. В секции Peer указываете публичный ключ VPS, пару адрес: порт VPN-сервера в качестве Endpoint и маршруты до VPN- и домашней подсети.

    Жирный скриншот с телефона


    Жмёте на дискетку в углу, включаете и…

    Готово


    Теперь вы можете получить доступ к домашнему мониторингу, менять настройки роутера, или делать что угодно на уровне IP.

    Скриншоты из локалки




    RUVDS.com
    VDS/VPS-хостинг. Скидка 10% по коду HABR

    Comments 36

      –8
      Поправьте ошибку.
      В качесnве технологии VPN — В качестве технологии VPN
        0
        Открыл для себя недавно Tailscale — тот же Wireguard но в обёртке и без VPS и OpenWRT.
        Для удобства на внутреннем хосте среди прочего контейнер с dnsmasq что бы разрешать красивые локальные имена в адреса назначенные Tailscale. Из клиентов всё сразу — Android, iOS, Windows, Mac и Ubuntu.
          +5
          Для личного пользования я предпочитаю решения, которые смогу проследить на всех уровнях, но по описанию выглядит отлично.
            0
            Да, безусловно. Код ноды в открытом доступе на github.com/tailscale/tailscale. Tailscale обеспечивает control plane, data plane реализуется на Wireguard.

            Из проблемного в теории можно включить неавторизованный клиентом узел и заставить трафик идти через него или использовать его для атаки на авторизованные узлы, но это будет заметно.
            0

            Я так понял можно только node делать на устройствах, свой сервер для обслуживания node нельзя поднять ?

          0
          Подскажите, а чем этот вариант отличается от, например, простого включения и настройки VPN на zyxel keenetic? Wireguard там как модуль тоже есть, если верно помню.
            0
            На первый взгляд все необходимые опции должны быть реализованы и на Кинетике. Сомневаюсь только насчёт простой настройки фаерволла, но необходимые правила наверняка можно задать вручную.
            +2
            >>>Безопасность: ничего не торчит наружу, можно оставить MongoDB без пароля и никто не утащит данные.

            ну-ну
              +1
              Да, китайская «умная» лампа может утащить данные из моих сервисов, я согласен на такой риск.
                0

                Заблокируйте ей доступ в сеть на шлюзе.

                  0
                  Обязательно забаню, как научусь ими управлять внутри локалки! Я на схеме нарисовал лампу для наглядности, но на самом деле поленился ими заняться и пока управляю из китайского облака.
                    0
                    В таком случае я бы запретил ей доступ к локалке)
                      0
                      Почему-то не приходила в голову эта идея. Не уверен в реализуемости, но надо попробовать, спасибо!
              0
              Подскажите, зачем использовать VPS, который увеличивает задержку, если можно поднять Wireguard на роутере с OpenWRT? Рассматривается случай, когда есть белый IP.
                0
                В таком случае незачем, можно поднимать сервер на самом роутере. Есть подозрение, что придётся ко всему явно разрешать или пробрасывать порт, но скорее всего можно обойтись средствами luci/uci.

                У меня уже есть VPS для других целей, поэтому я решил сэкономить. Белый IP у моего провайдера стоит как ещё одна VPS, задержки меня не настолько огорчают.
                  –1
                  Поднятие VPN прямо на роутере — что, кажется, умеют уже почти все более или менее нормальные роутеры прямо «из коробки», — имеет в данном случае один фатальный технический недостаток: оно не позволяет прорекламировать на Хабре услуги аренды VPS.
                  0
                  Для дела хватит даже самого нищенского VPS за 30 рублей в месяц, если вам повезёт такой урвать.

                  ioping: seek rate min/avg/max/mdev = 273.3 us / 3.33 ms / 28.8 ms / 5.90 ms
                  ioping: sequential read speed generated 48 requests in 5.03 s, 12 MiB, 9 iops, 2.39 MiB/s
                  dd: sequential write speed 1st run: 2.29 MiB/s

                    +2
                    К счастью, Wireguard совсем не требователен к IO!
                    0

                    Все как бы и хорошо, но все же — как то ограниченно.
                    К дешевым vps дают мало трафика. Как итог такое решение подходит для очень простых задач.
                    Плюс сомнительна безопасность самого vps. Не везде админы дают полный доступ к настройкам.
                    Как итог — стоит ли оно усилий, особенно при наличии белого ip дома?..

                      0
                      В RUVDS с трафиком всё отлично, на VPS за 30 рублей он безлимитный.

                      На рынке VPS из ограничений я встречал только контейнеры вместо аппаратной виртуализации или ядро загружаемое по сети, а не с диска. Обычно это означает, что вы не можете создать интерфейс, даже если повезло с наличием модуля Wireguard.

                      При наличии белого IP на OpenWRT разумно использовать последний в качестве сервера. В таком случае из минусов остаётся цена (только IP по цене полноценного VPS) и вероятное отсутствие такой услуги у вашего провайдера.
                      0
                      А вариант с ddns не рассматривали? зачем добавлять лишнее звено?
                        +4
                        Далеко не всякий провайдер выдаёт машинам динамический адрес, чаще всего клиент оказывается за NAT, либо платит за статический IP. У меня тоже не было такой опции, выбор между оставшимися я обосновал чуть выше.
                          +1

                          Кстати да — провайдеров, которые выдают клиентам динамические адреса, можно по пальцам пересчитать. Практически всегда клиенты сидят за NATом.

                        0

                        Для доступа в свою и ещё несколько локалок использую ZeroTier One. Пока это кажется намного удобнее всего, что видел раньше.

                          0

                          Кстати — для тех же задач но с гуём рекоммендую попробовать Softether VPN
                          Умеет хоть в ICMP, и соединение можно даже с серым IP устроить.

                            0
                            Спасибо, статья прям как раз, но с настройкой клиента на телефоне у меня возникли сложности, а конкретно не могу вписать ключ пира в поле Public Key, нельзя тупо копировать и вставить, вписал в ручную, но не дает поставить на конце "=".
                            Теперь думаю в чем проблема или искать другое решение.
                              0
                              Возможно, у вас в начале затесался пробел. В это поле нельзя вставить произвольный текст, оно ограничено по длине.
                                0
                                Да нет, я все в ручную набирал, пока что две мысли, косяк в оболочке MIUI либо в самом клиенте.
                                  0

                                  Можно попробовать импортировать готовый конфиг в формате wg-quick (как на сервере, с соответсвующими настройками) или сосканировать его содержимое в QR-коде.

                              0
                              Почему в настройках роутера 192.168.99.2/24, а на телефоне 192.168.99.3/32 ??
                                0

                                И правда, не заметил. В моей конфигурации это не очень важно, всё работает. Скорее всего можно и на телефона задать /24 и на роутере /32 в этом поле. В обоих случаях вся маршрутизация в эту подсеть будет подчиняться скорее настройке AllowedIPs, пакеты уйдут в интерфейс Wireguard и далее на VPS.

                                0
                                Если сравнивать с IPSec VPN — он сильно хуже?
                                  –1

                                  Судя по многочисленным отзывам, по пропускной способности не хуже, а по простоте настройки сильно выигрывает.

                                    +2
                                    не могу сказать про сложность настройки IPSec, вроде не особо сложная. Одно точно скажу, как только на роутере появляется 500й порт открытым, количество любопытных, что у меня там за файрволом резко возрастает…

                                Only users with full accounts can post comments. Log in, please.