Skip to content

Instantly share code, notes, and snippets.

@furdarius
Last active January 10, 2024 19:08
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save furdarius/ccb61a7bf8e747d43be5e908cc36dd92 to your computer and use it in GitHub Desktop.
Save furdarius/ccb61a7bf8e747d43be5e908cc36dd92 to your computer and use it in GitHub Desktop.
Настройка обхода РКН на роутере

По мотивам статьи: https://habr.com/ru/post/354282/

VPS

Сервер, естественно, должен иметь IP, не входящий в заблокированные РКН подсети. Лучше — стоять вне РФ.

Желательно обеспечить базовый уровень безопасности: https://www.linode.com/docs/security/securing-your-server/

Или заморочиться: https://www.cisecurity.org/cis-benchmarks/

OpenVPN Setup

Server

Автоматическая установка OpenVPN сервера: https://github.com/Nyr/openvpn-install/blob/master/openvpn-install.sh Дополнительно про установку смотреть тут: https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-debian-9

Mikrotik не поддерживает для OpenVPN использование UDP, TLS Auth и SHA256/512: https://wiki.mikrotik.com/wiki/OpenVPN#Unsupported

После использования скрипта авто-установки, чтобы OpenVPN Client в RouterOS сработал, нужно в файле /etc/openvpn/server/server.conf выставить:

  • proto tcp
  • auth SHA1
  • закомментировать ;tls-auth

Порт для OpenVPN сервера (1194) должен быть открыт наружу.

На выходе, в домашней директории (на VPS) вы получаете файл ~/$CLIENT.ovpn. Оттуда нужно вытащить содержимое сертификатов и разложить в отдельные файлы:

  • <ca></ca> -> ca.crt
  • <cert></cert> -> client.crt
  • <key></key> -> client.key

Эти файлы нужно скачать с VPS и загрузить на роутер:

# 192.168.88.1 - IP роуетра внутри локальной сети
scp ca.crt admin@192.168.88.1:/
scp client.crt admin@192.168.88.1:/
scp client.key admin@192.168.88.1:/

И уже на роутере импортировать их.

/certificate import file-name=ca.crt passphrase=""
/certificate import file-name=client.crt passphrase=""
/certificate import file-name=client.key passphrase=""

Client

Запуск OpenVPN Client на Mikrotik:

/ppp profile add change-tcp-mss=yes name=ovpn only-one=yes use-compression=default use-encryption=required
/interface ovpn-client add name="ovpn-out1" connect-to=<VPN_SERVER_IP> port=<VPN_SERVER_PORT> mode=ip user="username" password="password" profile=ovpn certificate=client.crt_0 cipher=aes256 add-default-route=no

Note: Можно попробовать использовать готовые скрипты: https://github.com/missinglink/mikrotik-openvpn-client

Отправка трафика в VPN

Варианта два:

  • Прямо на роутере скачивать файлы с заблокированными подсетями (https://antifilter.download/) и формировать таблицу маршрутизаци
  • Настроить BGP для анонса заблокированных подсетей с VPS на роутер.

Вариант 1: Формируем таблицу маршрутизации на роутере

Статья о маркировке трафика, для отправки его в VPN: https://wiki.mikrotik.com/wiki/Policy_Base_Routing

Формируем списки (address-list) для подсетей, трафик на которые будем гнать через VPN:

# 178.62.9.171/24 - заблокированная подсеть
/ip firewall address-list add list=rkn address=178.62.9.171/24

Вместо формирования руками, готовые списки можно выкачивать с https://antifilter.download

Настраиваем правила роутинга

/ip firewall mangle add disabled=no action=mark-routing chain=prerouting dst-address-list=rkn new-routing-mark=rkn passthrough=yes src-address=192.168.88.2-192.168.88.254
/ip route add disabled=no dst-address=0.0.0.0/0 type=unicast gateway=ovpn-out routing-mark=rkn scope=30 target-scope=10
/ip firewall nat add chain=srcnat src-address=192.168.88.0/24 out-interface=ovpn-out action=masquerade

Вариант 2: BGP для получения списка адресов.

10.8.0.1 - IP VPS внутри VPN-туннеля 10.8.0.2 - IP роутера внутри VPN-туннеля

Устанавливаем BGP-соседство с VPS (10.8.0.1):

/routing bgp instance set default as=64999 ignore-as-path-len=yes router-id=10.8.0.2
/routing bgp peer add name=VPS remote-address=10.8.0.1 remote-as=64999 ttl=default in-filter=bgp-in
/routing filter add action=accept chain=bgp-in protocol=bgp set-in-nexthop-direct=ovpn-out

Проверяем, что подсети подтянулись используя /routing bgp peer print status или ip route print count-only

Поднимаем NAT

ip firewall nat add chain=srcnat out-interface=ovpn-out action=masquerade

Debug

Если что-то не по плану, проверяем:

  • /ip route print — все подсети должны быть активны и gateway для каждой должен иметь значение ovpn-out1
  • /ip route pr detail — все подсети должны быть активны и gateway иметь статус reachable
  • /ip route print where dst-address in 178.62.9.171/32 — можно попробовать найти конкретный IP в таблице маршрутизации

Возможно ответ есть в документации: https://wiki.mikrotik.com/wiki/Manual:BGP_HowTo_%26_FAQ

@Rpsl
Copy link

Rpsl commented Sep 5, 2019

Тоже решал эту задачу, только решил не использовать BGP, а формировал листы прямо в роутере.
В конечном счете отказался от выгрузки всего РКН листа, отставив только интересующие меня сети.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment