Эта статья - продолжение Настройка маршрутизации в сети с неподконтрольным роутером. Итак имеем домашнюю локальную сеть, роутер от провайдера без возможности прошивки и почти без возможности настройки. Ставим в локальной сети сервер. Настраиваем на сервере 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
Файлы настроек:
Для работы 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)
happy-cat
10.01.2022 02:40+1Попробуйте Zerotier https://zerotier.com/
классная штука
GamePad64
10.01.2022 06:53+1Только в самом простом варианте он зависит от центрального координационного сервера. То есть, это облачное решение, по факту.
Silvarum
11.01.2022 13:07То есть, это облачное решение, по факту.
Есть и Self-Hosted вариант этого координационного сервера, не обязательно в их облака.
ABATAPA
10.01.2022 07:24Надо пойти ещё дальше и написать, как найти VPS за 45 рублей в месяц, поставить минимальный сервер и WireGuard в ядре, связать несколько сетей за NAT провайдеров, сделать доступными заблокированные ресурсы, выборочно заворачивая трафик через сервер, настроить DoT на роутерах, поставить клиент WireGuard на Android...
Хорошо, что всё это у меня давно уже есть и работает. :)BigD
10.01.2022 12:46Расскажите про VPS такой :) Хотя бесплатный от Oracle меня пока устраивает, хоть и не в РФ
ABATAPA
10.01.2022 15:17HostSailor. Я брал (и до сих пор имею) $1/m, но потом появились суперэкономичные $6.60/y. Я пробовал его, для VPN хватает вполне.
Но сейчас ВСЕ их тарифы "Out of Stock". Вероятно, готовят какие-то изменения.
BigD
Скоро буду связывать домашнюю сеть на Кинетике через wireguard и IPSec с бесплатными серверами Oracle - вот где весело будет...
Silvarum
А зачем сразу и wireguard и IPSec?
Кстати, у них в бесплатном тарифе вроде доступен Site-to-Site VPN (на IPSec). В целом, Site-to-Site VPN плюс маршрутизация по BGP через их Dynamic Routing Gateway — решение более правильное (ну или кроваво-энтерпрайзное), чем связывать роутер напрямую с серверами.
P.S. Не забудьте настроить Security List в VCN.
BigD
IPsec для полноценного site to site в первую очередь
Wireguard для подключения с Мобил (хорошо он, зараза, подключение держит, и вообще шустрый)
telobezumnoe
как то не замечал минусов openvpn как клиента на android, так же через vps oracle пользуюсь, хотя может не столь часто, но всё же, в чем приемущество wireguard?
BigD
Из плюсов постоянный коннект, моментальное соединение, минимальные задержки и максимальная скорость. И простота конфигурации. Ну и ещё много чего. Например, не роняет соединение при смене IP клиента (роуминг).
Из минусов - только UDP. И маршруты сервер на клиент пушить не умеет.
telobezumnoe
надо попробовать, в принципе и опенvpn тоже весьма быстро настраивается вот таким образом wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh, но да, вам переходах отваливается
Silvarum
А если в AllowedIP прописать подсети, то разве Андроид не будет заворачивать их в туннель? Правда это не пуш, конфиг ведь статично лежит на клиенте. Ну или тогда брать тоже IPSec для мобильных клиентов, он через политики точно умеет пушить.
BigD
P.S. BGP нет, но их DRG вроде и для простого статического маршрута подойдёт.