Блог Обходим блокировки РКН с помощью самого РКН

Вернуться обратно в Блог

Сегодня мы будем автоматизировать обход блокировок РКН с помощью современных технологий и самого РКН, как источника дынных. Приправим это все щипоткой доброй лени и украсим ломтиком цинизма.

Суть и цель всех описаных манипуляций заключается в том, что РКН блокирует ресурсы веерно, не разбираясь, что еще может пострадать. А в итоге законопослушные граждане лишаются, в том числе, и легитимных ресурсов, а иногда и рабочих инструментов. Для меня это github, PSN, некоторые корпоративные ресурсы и коммерческие инструменты. Поиск IP-адресов таких ресурсов, настройка маршрутизации до них - дело долгое и неблагодарное, а значит весь этот процесс подлежит автоматизации

Предполагается, что ты знаком с основами маршрутизации, имеешь представление о том как работает туннелирование, и тебе не нужно объяснять где и как заиметь Linux-сервер для этого. Ну и настроить его ты тоже сможешь самостоятельно. В этой статье я лишь дам руководство по настройке решения с испольтзованием протокола динамической маршрутизации BGP (eBGP)

Для приготовления эликсира нам понадобится:

  1. Маршрутизатор с поддержкой протокла BGP,
  2. Linux-сервер с поддержкой BGP (BIRD) за пределами РФ,
  3. VPN-туннель между маршрутизатором и Linux-сервером,
  4. Прямые руки и холодная голова.

...

0. Начало

Идем к ближайшему облачному провайдеру и заказываем у него VPS с поддержкой IPSec, или без него, если вы не планируете шифровать траффик. В данном примере рассмотрен вариант с EC2-micro на просторах AWS и Ubuntu 18.04LTS и маршрутизатора Cisco 28xx серии. Сгодится и Mikrotik, так как он тоже поддерживает протокол BGP.

После развертывания виртуальной машины и обновления всех пакетов приступаем настройке BGP и автоматизации получения префиксов подсетей.

1. Поднимаем BGP на Linux

Все просто и стандартно. Ставим пакет.

apt install bird

Отключаем bird для IPv6 и оставляем только для IPv4.

systemctl stop bird6
systemctl disable bird6
systemctl stop bird

Сохраняем файл /etc/bird/bird.conf со следующим содержимым:

log syslog all;
router id 192.168.1.1;

protocol kernel {
        scan time 60;
        import none;
        export none;
}

protocol device {
        scan time 60;
}

protocol static static_bgp {
    include "subnet.txt";
    include "ipsum.txt";
}

protocol bgp HomeRouter {
        description "Our Router";
        neighbor 192.168.1.2 as 64999;
        import none;
        export where proto = "static_bgp";
        next hop self;
        local as 64998;
        source address 192.168.1.1;
        passive off;
}

Подразумевается, что адрес туннельного интерфейса на Linux-сервере 192.168.1.1 (AS64998), а на клиенте (вашем роутере) 192.168.1.2 (AS64999)

2. Качаем префиксы

Хорошие люди на ресурсе https://antifilter.download/ заботливо делятся с нами данными, содержащимися в реестре РКН и предоставляются непосредственно Роскомнадзором в соответствии с Постановлением Правительства Российской Федерации от 26 октября 2012 г. № 1101. Нам лишь нужно их получить и регулярно обновлять.

Создаем папку /root/blacklist и подпапку list в ней

mkdir -p /root/blacklist/list
cd /root/blacklist

Создаем файл /root/blacklist/chklist со следующим содержимым:

#!/bin/bash
cd /root/blacklist/list
wget -N https://antifilter.download/list/ipsum.lst https://antifilter.download/list/subnet.lst
old=$(cat /root/blacklist/md5.txt);
new=$(cat /root/blacklist/list/*.lst | md5sum | head -c 32);
if [ "$old" != "$new" ]
then
cat /root/blacklist/list/ipsum.lst | sed 's_.*_route & reject;_' > /etc/bird/ipsum.txt
cat /root/blacklist/list/subnet.lst | sed 's_.*_route & reject;_' > /etc/bird/subnet.txt
/usr/sbin/birdc configure;
logger "RKN list reconfigured";
echo $new > /root/blacklist/md5.txt;
fi

Добавляем через "crontab -e" выполнение файла раз в полчаса

*/30 * * * * bash /root/blacklist/chklist

3. L2TP/IPSec СЕРВЕР (Ubuntu)

Так как я существо ленивое, то и решение будет на 1 минуту, так как с нуля конфигурировать ppp/xl2tp/swan/ipsec/iptables в тысячный раз нет ни какого желания, то просто берем скрипт для автоматического развертывания и запускаем его, следуя инструкции. По завершении получим уже рабочий сервер. EASY!

4. L2TP/IPSec КЛИЕНТ (Cisco)

Здесь я лишь приведу пример того, как настроить маршрутизатор Cisco в качестве L2TP/IPSec клиента для нашего сервера.

!
crypto isakmp policy 10
 encr 3des
 authentication pre-share
 group 2
 lifetime 4000
!
! Криптоключ для криптосессии
! 1.2.3.4 заменить адрес вашего Linux-сервера
crypto isakmp key *какойтотамключсгенеренныйвами* address 1.2.3.4
!
crypto ipsec transform-set ESP-AES256-SHA1 esp-aes 256 esp-sha-hmac
 mode transport
!
! Crypto-map которая будет выбирать L2TP трафик объявленный в L2TP_TRAFFIC ACL.
!
crypto map L2TP_VPN 10 ipsec-isakmp
 set peer 1.2.3.4
 set transform-set ESP-AES256-SHA1
 match address L2TP_TRAFFIC
!
! Матчим L2TP трафик.
!
ip access-list extended L2TP_TRAFFIC
 permit udp host *IP внешнего интерфейса* eq 1701 host 1.2.3.4 eq 1701
!
! Применить crypto map на внешнем интерфейсе. 
!
interface FastEthernet0/0
 ip address 100.200.150.250 255.255.255.0
 crypto map L2TP_VPN
!
! объявляем psuedowire который свяжет L2TP и исходящий интерфейс. 
!
pseudowire-class L2TP_PW
 encapsulation l2tpv2
 ip local interface FastEthernet0/0
!
! Создаем интерфейс Virtual-PPP для назначения на него psuedowire. 
!
interface Virtual-PPP1
 description L2TP Tunnel
 ip address negotiated
 ppp chap hostname *User Name*
 ppp chap password *Password*
 ppp ipcp address accept
 pseudowire 1.2.3.4 1 pw-class L2TP_PW

5. BGP на Cisco

В данном случае мы используем eBGP, так как сессия устанавливается только между двумя роутерами.

router bgp 64999
 bgp log-neighbor-changes
 neighbor 192.168.1.1 remote-as 64998
 neighbor 192.168.1.1 ebgp-multihop 250
 neighbor 192.168.1.1 route-map BGP_NEXT_HOP in
!
!
route-map BGP_NEXT_HOP permit 10
 set ip next-hop 192.168.42.1

6. Финал

Если туннель поднялся, и с вашего маршрутизатора доступен туннельный ин терфейс Linux-сервера (ping 192.168.1.1) то можно поднять маршрутизацию на VPS

Запускаем BIRD на линуксе

systemctl start bird

Проверяем статус BGP

birdc show protocol

Ну и на маршрутизаторе проверим, что маршруты прилетели

show ip route bgp

Возможно придется еще настроить NAT на туннельном интерфейсе, или смаршрутизировать вашу сеть в туннель и настроить NAT на стороне Linux-сервера в iptables, но тут все зависит от ваших желаний и топологии.

За сим позвольте закончить. Решение рабочее, проверенное. Комментарии и предложения приветствуются.

UPD1:

Если твой роутер маршрутизирует более двух подсетей или ты маршрутизируешь свою сеть в туннель и натишь уже там, а VPN канал иногда рвется, то каждый раз прописывать маршрут на свою сеть со стороны Linux-сервера то еще удовольствие. Здесь нам опять поможет BGP. Можно анонсировать свою сеть на Linux-сервер, на котором, в свою очередь, эеспортировать маршрут в ядро. Дополним наш конфиг на маршрутизаторе:

Анонсируем нужную подсеть (Cisco)

router bgp 64999
 bgp log-neighbor-changes
 neighbor 192.168.1.1 remote-as 64998
 neighbor 192.168.1.1 ebgp-multihop 250
 !
 address-family ipv4
  redistribute connected
  neighbor 192.168.1.1 activate
  neighbor 192.168.1.1 route-map BGP_NEXT_HOP in
 exit-address-family

Экспортируем маршрут в ядро Linux-сервера, на котором запущен Bird /etc/bird/bird.conf Но чтобы экспортировать не все маршруты, а только нужные, мы можем воспользоваться фильтром (в нашем случае имя фильтра "home")

log syslog all;
router id 192.168.1.1;

filter home {
    if net = 10.10.10.0/24 then accept;
}

protocol kernel {
        scan time 60;
        import none;
        export filter home;
}

protocol device {
        scan time 60;
}

protocol static static_bgp {
    include "subnet.txt";
    include "ipsum.txt";
}

protocol bgp HomeRouter {
        description "Our Router";
        neighbor  192.168.1.10 as 64999;
        import all;
        export where proto = "static_bgp";
        next hop self;
        local as 64998;
        source address 192.168.1.1;
        passive off;
}

** Если по какой-то причине сеть назначения находится за пределами твоей сети, и доступна через маршрут по умолчанию, и ни как не фигурирует на твоем роутере, то необходимо прописать статический маршрут в "никуда", в противном случае маршрут не анонсируется протоколом на Linux-сервер.

ip route 10.10.10.0 255.255.255.0 Null 0

Теперь анонс улетит на пира

Posted in #япочинил, Инфраструктура, Полезности on фев 04, 2019.

Вернуться Наверх
Закрыть Увеличить