Обходим блокировки при помощи WireGuard и BGP на роутере Mikrotik
Настраиваем WireGuard сервер⌗
WARP⌗
Самый простой способ это воспользоваться готовым конфигом для сервиса WARP (aka 1.1.1.1) от Cloudflare. Конфиг можно взять тут.
Свой сервер⌗
Для запуска своего сервера, например на Debian, нам понадобятся пакеты: wireguard и wireguard-tools. Теперь надо сгенерировать приватный и публчиные ключи
$ sudo -i
cd /etc/wireguard/
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
После того как ключи сгенерированы можно переходит к файлу настроек сервера
$ sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 172.0.0.1/24 # адрес сервера внутри VPN
ListenPort = 51820 # порт который "слушает" сервер
PrivateKey = # содержимое файла /etc/wireguard/privatekey
# Правила iptables отвечающие за роутинг из wg0 во внешний интернет (интерфейс с внешним IP, в данном случае eth0, найти свой можно командой ip addr)
# Добавляем правила после запуска сервера
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Удяляем правила после остановки
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Включаем скрипт автозапуска сервера и стартуем
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
Если все прошло успешно, то команда ip link
покажет интерфейс wg0
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420
Кроме настроек WireGuard на сервере надо разрешить транзит трафика. Для этого выполним следующие команды
$ sudo sysctl -w net.ipv4.ip_forward=1
$ sudo sysctl -w net.ipv6.conf.all.forwarding=1
$ sysctl -p /etc/sysctl.conf
Настройки клиента⌗
Добавление ключей на сервер⌗
Для WARP просто копируем из секции Interface значения PublicKey и PrivateKey.
Для собственного сервера надо сгенерировать ключи для клиента
$ sudo -i
mkdir /etc/wireguard/router-client/ && cd /etc/wireguard/router-client/
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
Теперь добавляем публичный ключ клиента и его IP внутри VPN в настройки сервера
$ sudo nano /etc/wireguard/wg0.conf
...
# travel router
[Peer]
PublicKey = # данные из файла /etc/wireguard/router-client/pubkey/ или WARP PublickKey
AllowedIPs = 172.0.0.2/32 # IP из подсети сервера
После этого надо перезагрузить Wireguard-сервер и можно приступать к настройкам на роутере
$ sudo systemctl restart wg-quick@wg0
Настройка Wireguard на Mikrotik⌗
Все настройки будут на примере Mikrotik hAP ac^2, с прошивкой v7.1.1 (stable).
Заходим в меню WebFig -> WireGuard -> Вкладка WireGuard -> Add new.
Указываем name: wireguard1.
ListenPort сгенерируется автоматически.
PrivateKey берем из
- Конфиг WARP: секция Interface -> копируем PrivateKey
- Свой сервер: данные из файла /etc/wireguard/router-client/privatekey
Проверяем, что cгенерировался Public Key и соответствует тому, что добавляли в конфиг сервера выше.
Переходим во вкладку Peers и добавляем настройки для сервера к которому подключаемся
- Interface: wireguard1
- PublicKey:
- Для WARP берем PublicKey из раздела Peer конфига
- Для собственного сервера из файла /etc/wireguard/pubkey
- Endpoint:
- Для WARP копируем Endpoint (там где IP, без порта) из раздела Peer конфига
- Для собственного сервера указываем IP VPSки
- Ednpoint port:
- Для WARP копируем порт из Endpoint из раздела Peer конфига
- Для собственного сервера копируем порт из настроек сервера (51820)
- Allowed Address: 0.0.0.0/0 - чтобы разрешить трафик на любой адрес, в том числе за пределами VPN
- Persistent Keepalive: 00:05:00
В меню IP/Addresses добавляем клиентский адрес wireguard
- Comment: Wireguard net
- Address: 172.0.0.2/32
- Network: 172.0.0.0
- Interface: wireguard1
После этих настроек должно установиться подключение с сервером WireGuard. Чтобы убедиться в этом, достаточно на самом сервере выполнить команду wg show
Получение маршрутов через BGP⌗
Так как нам не надо маршрутизировать вообще весь трафик через WireGuard, а только некоторые подсети, удобнее всего этот список получить от сервиса antifilter.download через BGP. О том, что такое BGP и как он работает, можно почитать на Хабре. Быстрее всего добавить настройки BGP через консоль (Terminal) микротика.
/routing/bgp/connection/add as=64512 disabled=no hold-time=4m input.filter=bgp_in local.address=172.0.0.2 .role=ibgp name=antifilter_bgp remote.address=45.154.73.71/32 keepalive-time=5m routing-table=main router-id=<внешний ip-адрес роутера>
И добавим правило для роутинга через полученные маршруты
/routing/filter/rule/add chain=bgp_in disabled=no rule="set gw %wireguard1; accept"
После этого трафик в заблокированые сети должен пойти через WireGuard
Настраиваем DoH⌗
Несмотря на настройки роутинга некоторые сервисы все еще могут быть недоступны по доменному имени. Чтобы это исправить надо переключиться на DNS over HTTPS, это защищенная версия запросов DNS через шифрованное соединение.
Для начала отключим получение DNS от провайдера. В консоли микротика выполним
/ip/dhcp-client/set use-peer-dns=no
Так же, для проверки подлинности DoH-сервера нам нужны корневые сертификаты. Скачиваем их
/tool fetch url=https://curl.se/ca/cacert.pem
и импортируем
/certificate import file-name=cacert.pem
Возвращаемся в WebFig и там переходим в IP -> DNS.
- servers прописываем 1.1.1.1 и 8.8.8.8;
- use doh server: https://1.1.1.1/dns-query ;
- verify DoH certificate: true ;
- allow remote request: true ;
Сохраняем/применяем настройки и теперь все ранее недоступные ресурсы должны открываться :)
Подпишись на мой канал в Телеграм!