Гайд по роутингу клиентов Mikrotik в wireguard туннель
В последние месяцы и годы растет интерес широкой публики к вопросу настройки роутинга и ВПН на роутерах, а не на оконечных устройствах. Данный гайд, я надеюсь, будет полезен для обладателей устройств Mikrotik или людей только присматривающихся к их покупке, чтобы они примерно оценили усилия требуемые для того чтобы централизованно, через интерфейс роутера, перенаправлять трафик устройств(например smart tv) в wireguard tunnel.
Гайд не претендует на полноту, и устойчивость ко всем экстремумам конфигураций, написан на основе собственного опыта, зарекомендовал себя как рабочий и позволяет регулировать доступ не трогая физически телефоны мам, бабушек, телевизоры, умные пылесосы и всего остального что есть у вас в локальной сети.
Что считаем уже есть и что текущий гайд не покрывает
Я рассчитываю что у вас есть роутер Микротик версии 7.20+, и на нем настроен основной канал выхода в интернет. Так же, желательно чтобы роутер выступал dhcp сервером для домашней сети (раздает адреса клиентам).
На роутере уже настроен wireguard интерфейс (wg1), пир до удаленного подключения (peer1), и у интерфейса есть ip address. Вы можете пинговать с микротика удаленный сервер через wg туннель, а на удаленном сервере настроен forward/MASQUERADE.
Возможно, было бы неплохо добавить эту часть в гайд и назвать его гайд с нуля, но это определенно задача для лучшей версии меня.
Wireguard server config example
# пример конфига для wireguard server на ubuntu/debian с ufw
[Interface]
Address = 10.10.10.1/24 # (или любой другой)
ListenPort = 51820 # (или любой другой, не забудьте разрешить входящие соединения на этом порту)
PrivateKey = <ServerPrivateKey>
DNS = 8.8.8.8 # (или любой другой)
PostUp = ufw route allow in on wg0 out on eth0 # (или как называется ваш интерфейс для выхода в интернет на сервере )
PostUp = iptables -t nat -A POSTROUTING -o eth0 -s 10.10.10.0/24 -j MASQUERADE
PostUp = iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
PreDown = iptables -t mangle -D FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
PostDown = iptables -t nat -D POSTROUTING -o eth0 -s 10.10.10.0/24 -j MASQUERADE
PostDown = ufw route delete allow in on wg0 out on eth0
# Mikrotik router
[Peer]
PublicKey = <MikrotikWireguardInterfacePublicKey>
AllowedIPs = 10.10.10.10/32, 192.168.100.0/24 # (ваша домашняя сеть с маской, опционально если настраивать NAT на микротике)Для кого же эта статья
На этом этапе я крепко задумался, кто же целевая аудитория этого гайда? Ребята что могут поднять и настроить wireguard сервер, но испытывают сложности в настройке микротиков, эта статья для вас!
Что мы настраиваем и получим в конце
Мы настроим новую таблицу маршрутизации (routing table), добавим маршрут в интернет через wireguard туннель для этой таблицы, будем отмечать клиентов (по ip) из нашей домашней сети чтобы они использовали эту таблицу маршрутизации через добавление их ip в список адресов (address list).
После этого весь трафик устройства пойдет через туннель и, к примеру, получится исправить замедление сервисов которые замедляются или открывать те, которые не открываются без туннеля.
Будут картинки и команды для терминала. Приступим.
Гайд
(Routing / Tables) Добавляем routing table

routing/table/add name=wg-tunnel fib( IP / Routes) Добавляем маршрут в интернет через для этой таблицы

ip/route/add dst-address=0.0.0.0/0 routing-table=wg-tunnel gateway=wg1(ip/routes) (Опционально, но крайне желательно) Добавляем путь до домашней сети в таблицу маршрутизации, чтобы клиенты были все также видимы/доступны/могли достучаться с других устройств в той же сети. Например если телевизор у нас ходит в интернет через туннель, это не помешает нам делать airplay/miracast с других устроств на него в домашней сети.

ip/route/add dst-address=192.168.100.0/24 routing-table=wg-tunnel gateway=bridge( ip/firewall/mangle) Маркируем соединения (добавляем метку) из списка адресов (его может пока и не быть!) чтобы завернуть в туннель. Первый неочевидный момент - dst. address нужно поставить не равным домашней сети, чтобы не отправлять пакеты где телевизор ищет dhcp или dns в туннеле где их, разумеется, нет. src. address list - название нашего списка (address list). Как в него добавлять клиентов расскажу ниже. Passthrough обязательно ставим в yes. Connection mark ставите любую, она потребуется на следующем шаге.


ip/firewall/mangle/ add chain=prerouting dst-address=!192.168.100.0/24 src-address-list=via-wg1 action=mark-connection new-conne
ction-mark=conn-wg1 passthrough=yes(ip/firewall/mangle) Заворачиваем соединения с меткой из предыдущего шага в нашу таблицу маршрутизации из первого шага. Здесь connection mark можно выбрать из выпадающего списка, равно как и таблицу на вкладке Action. Passthrough откликиваем, обработку дополнительных правил хотим прекратить, пусть пакет идет уже в туннель.


ip/firewall/mangle/add chain=prerouting connection-mark=conn-wg1 action=mark-routing new-routing-mark=wg-tunnel passthrough=no(ip/firewall/nat) На вкладке NAT делаем MASQEURADE чтобы наш wireguard сервер не попехнулся адресами из нашей домашней сети, ну или вы можете конфиг сервера доработать чтобы он такие допуска адреса и пропустить этот пункт (см. образец конфига сервера в начале гайда)


ip/firewall/nat add chain=srcnat action=masquerade out-interface=wg1(ip/firewall) Важно! Если у вас включен fasttrack, то нужно как-то наши mangle action отфильтровать, и самый чистый способ который мне пришел в голову - разрешить fasttrack только для соединений без метки. Иначе какие-то соединения уйдут в туннель, какие-то нет и вы будете гадать почему все так грустно. Я вот долго гадал и грустил, а как справился, решил написать этот гайд.

ip/firewall/filter/set [find action=fasttrack-connection] connection-mark=no-mark(ip/dhcp-server/leases) Добавляем клиентов в список чтобы они выходили в интернет через wireguard tunnel (наконец-то!). Для простоты считаем что устройства которые вы хотите управлять имеют статические адреса. Для динамических - могу предложить самостоятельно написать Lease script для dhcp, или добавить в список целую подсеть. Кода для этого пункта не будет.

Profit! Вы великолепны и смотрите уже все что хотели посмотреть с устройства. А чтобы убрать доступ - убираем из списка.
(Bonus) (ip/firewall/address-list) Всех клиентов подсети отправляем в туннель (включая роутер, так что будьте аккуратны с этим), а если добавим timeout то доступ пропадёт через введенный интервал. (Инстаграм жене на час, м? :)


можно отфильтровать и смотреть кто у нас уже, а кто ещё нет
Послесловие
Многих вещей я коснулся лишь вскользь и поверхностно, намеренно не углубляясь в пучины автоматизации, скриптописания, clamp-to-pmtu. Две вещи хотел донести - исключать домашную сеть от отправки в туннель и не использовать fasttrack для наших mangle правил.
Надеюсь, гайд поможет кому-то вернуть доступ к тому что было замедлено/заблокировано.