Эта статья - продолжение Настройка маршрутизации в сети с неподконтрольным роутером. Итак имеем домашнюю локальную сеть, роутер от провайдера без возможности прошивки и почти без возможности настройки. Ставим в локальной сети сервер. Настраиваем на сервере Wireguard VPN и связываем две локальные сети. Другая локальная сеть - маршрутизатор Xiaomi Mi Router 3G с прошивкой Padavan и установленным Entware.

В принципе инструкций по настройке Wireguard - масса. Но меня долго смущал дополнительный частный диапазон адресов для wireguard. Лично я долго не мог понять, да и сейчас не понимаю, зачем нужно каждому wg устройству назначать адрес из частного диапазона. Могу понять зачем это нужно для одного клиента - ему же нужен какой-то адрес. Но зачем это нужно для связывания двух разных сети - непонятно. У специалистов настройка wireguard вообще не вызывает никаких проблем, но я не они. Кстати мне больше всего понравилась инструкция на сайте keenetic - по ней я все и делал. Возможно данная статья кому-то поможет.

Параметры

  • Локальная сеть - 192.168.2.0/24

  • Роутер - 192.168.2.1

  • Сервер в локальной сети - 192.168.2.4, ethernet интерфейс - enp1s0

  • Другая локальная сеть (за xiaomi mi router) - 192.168.3.0/24

  • wireguard device network (частный диапазон IP адресов из которого назначаются адреса wireguard интерфейсам) - 10.253.1.0/24

    • сервер wireguard address - 10.253.1.2

    • android клиент - 10.253.1.10

    • xiaomi mi router wireguard address - 10.253.1.3

Dnsmasq

Чтобы все работало в локальной сети необходимо добавить два новых маршрута, которые мы анонсируем через DHCP, чтобы трафик в другую локальную сеть и wireguard device network шел через наш сервер: /etc/dnsmasq.d/dhcp.conf

На клиенте, который использует DHCP для получения IP адреса и конфигурации это должно выглядеть так:

# ip route
default via 192.168.2.1 dev enp3s0 proto dhcp metric 100
10.252.0.0/14 via 192.168.2.4 dev enp3s0 proto dhcp metric 100
192.168.2.0/24 dev enp3s0 proto kernel scope link src 192.168.2.30 metric 100
192.168.3.0/24 via 192.168.2.4 dev enp3s0 proto dhcp metric 100

Для Windows клиента таблицу маршрутизации можно посмотреть командой route print.

Видим, что трафик для соседней LAN (192.168.3.0/24) и wg private interace (10.252.0.0/14) маршрутизируется через наш сервер (192.168.2.4). Строго говоря wg private interace у меня 10.253.1.0/24, но подсеть 10.254.0.0/16 используется для других нужд и тоже маршрутизируется через сервер, поэтому я написал одно более общее правило вместо двух.

Wireguard сервер

Ставим на сервер пакет wireguard: sudo apt install wireguard.

Генерируем пару ключей (открытый + закрытый) для сервера:

cd /etc/wireguard
wg genkey > private-key
wg pubkey > public-key < private-key

Создаем конфигурацию /etc/wireguard/wg0.conf

Запускаем wireguard sudo systemctl start wg-quick@wg0.service.

Включаем автозапуск для wireguard sudo systemctl enable wg-quick@wg0.service.

В ubuntu все работает - создается интерфейс wg0, создаются маршруты.

Проверить статус можно командой `wg showconf wg0`, `wg show`, маршруты командой `ip route`.

В настройках роутера пробрасываем wireguard порт до нашего сервера.

Android client

Нет смысла еще раз писать то, что уже неплохо написано до нас. Генерируем ключи на Android клиенте, публичный ключ с клиента добавляем в соответствующую секцию конфигурации wireguard сервера.

Padavan + Entware

Файлы настроек:

/opt/etc/wireguard/wg0.conf

/opt/etc/init.d/S50wireguard

Для работы Entware на прошивке Padavan нужна USB флешка. Как ставить entware написано в padavan wiki.

Ставим пакет wireguard-go: `opkg install wireguard-go`. Теоретически можно использовать утилиту `wg-quick` для настройки интерфейса и маршрутизатора, но у меня оно почему-то правильно не заработало. В принципе wg-quick - это простой bash скрипт, можно было и разобраться что именно не работает, но разбираться я не стал.

Итак настраиваем wireguard вручную как написано на официальном сайте. Создаем файл конфигурации /opt/etc/wireguard/wg0.conf. Я закоментировал строчку "Address=..." конфигурации wg0.conf из секции [Interfaces]. Это потому что по какой-то причине `wg setconf` ее не принял, ну и ладно, настроим адрес вручную (командой ip address add dev wg0 10.253.1.3/24).

Выполняем

wireguard-go wg0
ip address add dev wg0 10.253.1.3/24
wg setconf wg0 /opt/etc/wireguard/wg0.conf
ip link set up dev wg0
ip route add 192.168.2.0/24 dev wg0 src 192.168.3.1
iptables -t filter -A INPUT -i wg0 -j ACCEPT
iptables -t filter -A FORWARD -i wg0 -j ACCEPT

Примечание:

Маршрут `ip route add 10.253.1.0/24 dev wg0 src 10.253.1.3` добавился сам, поэтому ручками добавляем только маршрут для 192.168.2.0/24.

Переопределяем iptables policy по умолчанию для цепочек INPUT, FORWARD таблицы filter - у меня значения по-умолчанию были DROP, с ними маршрутизация из локальной сети 192.168.2.0/24 в 192.168.3.0/24 (в мою локальную сеть) не работала.

Все эти команды для запуска и остановки wireguard сохраняем в /opt/etc/init.d/S50wireguard - теперь должно автоматически запускаться при старте маршрутизатора.

Настройка iptables

После некоторых обновлений конфигурации маршрутизатора (например обновление правил белых/черных списков по mac адресу - web интерфейс маршрутизатора -> Advanced settings -> Firewall -> MAC Filter) маршрутизатор с прошивкой padavan сбрасывает правила iptables. Чтобы все продолжало работать в прошивке есть файлик `/opt/etc/init.d/S10iptables` (softlinkg) -> `/opt/bin/update_iptables.sh`, который запускается после обновления конфигурации. В него заносим все правила iptables - у меня там правила для wireguard и правила, которые я настроил для прозрачного использования tor в локальной сети, который настроил по этой инструкции.

Доступ к роутеру из VPN

Поскольку на неподконтрольном роутере нашей основной сети таблицу маршрутизации мы настроить не можем, то не можем и получить к нему доступ из VPN напрямую. Чтобы получить web доступ к роутеру можно добавить nginx reverse proxy configuration. Можно поставить на любой хост из основной локальной сети - но логично поставить на сервер. Например на порту 8081. Ссылку на файл конфигурации надо добавить в директорию /etc/nginx/sites-enabled - обычно сам файл настроек помещают в /etc/nginx/sites-available/ а в sites-enabled создают символическую ссылку`ln -s /etc/nginx/sites-available/local ./`.

Перезагружаем конфигурацию nginx на сервере: `sudo systemctl reload nginx`.

Теперь роутер доступен по адресу `http://192.168.2.4:8081`.

Комментарии (14)


  1. BigD
    09.01.2022 16:14

    Скоро буду связывать домашнюю сеть на Кинетике через wireguard и IPSec с бесплатными серверами Oracle - вот где весело будет...


    1. Silvarum
      10.01.2022 15:35

      А зачем сразу и wireguard и IPSec?
      Кстати, у них в бесплатном тарифе вроде доступен Site-to-Site VPN (на IPSec). В целом, Site-to-Site VPN плюс маршрутизация по BGP через их Dynamic Routing Gateway — решение более правильное (ну или кроваво-энтерпрайзное), чем связывать роутер напрямую с серверами.

      P.S. Не забудьте настроить Security List в VCN.


      1. BigD
        10.01.2022 16:06

        IPsec для полноценного site to site в первую очередь

        Wireguard для подключения с Мобил (хорошо он, зараза, подключение держит, и вообще шустрый)


        1. telobezumnoe
          10.01.2022 23:47

          как то не замечал минусов openvpn как клиента на android, так же через vps oracle пользуюсь, хотя может не столь часто, но всё же, в чем приемущество wireguard?


          1. BigD
            11.01.2022 00:20

            Из плюсов постоянный коннект, моментальное соединение, минимальные задержки и максимальная скорость. И простота конфигурации. Ну и ещё много чего. Например, не роняет соединение при смене IP клиента (роуминг).

            Из минусов - только UDP. И маршруты сервер на клиент пушить не умеет.


            1. telobezumnoe
              11.01.2022 00:44

              надо попробовать, в принципе и опенvpn тоже весьма быстро настраивается вот таким образом wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh, но да, вам переходах отваливается


            1. Silvarum
              11.01.2022 12:37

              Из минусов — только UDP.
              Почему минус? TCP для туннеля ведь так себе, разве что для маскировки под HTTPS (но и OpenVPN, кстати, через DPI легко идентифицируется, даже wireshark определяет — там хендшейк специфический).
              И маршруты сервер на клиент пушить не умеет.
              А если в AllowedIP прописать подсети, то разве Андроид не будет заворачивать их в туннель? Правда это не пуш, конфиг ведь статично лежит на клиенте. Ну или тогда брать тоже IPSec для мобильных клиентов, он через политики точно умеет пушить.


      1. BigD
        10.01.2022 16:25

        P.S. BGP нет, но их DRG вроде и для простого статического маршрута подойдёт.


  1. happy-cat
    10.01.2022 02:40
    +1

    Попробуйте Zerotier https://zerotier.com/

    классная штука


    1. GamePad64
      10.01.2022 06:53
      +1

      Только в самом простом варианте он зависит от центрального координационного сервера. То есть, это облачное решение, по факту.


      1. Silvarum
        11.01.2022 13:07

        То есть, это облачное решение, по факту.
        Есть и Self-Hosted вариант этого координационного сервера, не обязательно в их облака.


  1. ABATAPA
    10.01.2022 07:24

    Надо пойти ещё дальше и написать, как найти VPS за 45 рублей в месяц, поставить минимальный сервер и WireGuard в ядре, связать несколько сетей за NAT провайдеров, сделать доступными заблокированные ресурсы, выборочно заворачивая трафик через сервер, настроить DoT на роутерах, поставить клиент WireGuard на Android...

    Хорошо, что всё это у меня давно уже есть и работает. :)


    1. BigD
      10.01.2022 12:46

      Расскажите про VPS такой :) Хотя бесплатный от Oracle меня пока устраивает, хоть и не в РФ


      1. ABATAPA
        10.01.2022 15:17

        HostSailor. Я брал (и до сих пор имею) $1/m, но потом появились суперэкономичные $6.60/y. Я пробовал его, для VPN хватает вполне.
        Но сейчас ВСЕ их тарифы "Out of Stock". Вероятно, готовят какие-то изменения.