Вернуться обратно в Блог
Сегодня мы будем автоматизировать обход блокировок РКН с помощью современных технологий и самого РКН, как источника дынных. Приправим это все щипоткой доброй лени и украсим ломтиком цинизма.
Суть и цель всех описаных манипуляций заключается в том, что РКН блокирует ресурсы веерно, не разбираясь, что еще может пострадать. А в итоге законопослушные граждане лишаются, в том числе, и легитимных ресурсов, а иногда и рабочих инструментов. Для меня это github, PSN, некоторые корпоративные ресурсы и коммерческие инструменты. Поиск IP-адресов таких ресурсов, настройка маршрутизации до них - дело долгое и неблагодарное, а значит весь этот процесс подлежит автоматизации
Предполагается, что ты знаком с основами маршрутизации, имеешь представление о том как работает туннелирование, и тебе не нужно объяснять где и как заиметь Linux-сервер для этого. Ну и настроить его ты тоже сможешь самостоятельно. В этой статье я лишь дам руководство по настройке решения с испольтзованием протокола динамической маршрутизации BGP (eBGP)
Для приготовления эликсира нам понадобится:
- Маршрутизатор с поддержкой протокла BGP,
- Linux-сервер с поддержкой BGP (BIRD) за пределами РФ,
- VPN-туннель между маршрутизатором и Linux-сервером,
- Прямые руки и холодная голова.
...
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.