пятница, 25 марта 2016 г.

MIKROTIK+BGP = Динамическое блокирование IP адресов

Задача: блокировать ресурсы по IP по требованию соответствующих органов.
Решение: Mikrotik+Hotspot+Script+BGP Blackhole
Общая схема работы системы.
·         Администратор заводит в модуле HOTSPOT/WALEED GARDEN IP LIST, URL которые необходимо заблокировать
·         Маршрутизатор делает DNS Lookup для URL внесенных в базу данных и помещает IP адреса в базу WALLED GARDEN.
·         На маршрутизаторе по расписанию работает скрипт проходящий по базе данных IP, а также по записям статических маршрутов для этих адресов и ищет их соответствие. Если для какого-либо IP не находится запись в RIB, эта запись добавляется. Соответственно и наоборот, если есть запись в RIB для конкретного IP, но его самого нет в базе WALLED GARDEN, то удаляется маршрут, чтобы он перестал анонсироваться BGP Peer-ам.
·         Время запуска скрипта – каждые 5 минут или меньше.
·         Скрипт при добавлении нового URL можно запустить вручную.



Рисунок 1. Логика работы аппликации.

Routerboard OS стоит в виде VM, поверх ESXi. Он выполняет такие функции как:
·         Ведение листов Walled Garden List модуля HOTSPOT
·         Обеспечение динамического преобразования URL в IP (DNS LOOKUP)
·         Ведение базы данных IP адресов для заданных URL
·         Динамическое создание статических маршрутов на каждый IP адрес полученный в процессе DNS LOOKUP с префиксом /32, в локальной базе RIB, а также установление дополнительных параметров на эти маршруты, например такие как BGP Community=XXXX:666, Type=Blackhole.
·         Рассылка BGP UPDATE всем iBGP Peer для статических маршрутов
·         Обеспечение актуальности базы данных IP адресов и соответствующих им статических маршрутов для перераспределения.
Рисунок 3. Логическая схема аппликации

1.   Предварительные требования:
·         Mikrotik Loopback X.X.X.X
·         На всех Border Router необходимо настроить фильтрацию для приема только префиксов /32 от BGP PEER X.X.X.X c установленным BGP Community XXXX:666
·         На всех Border Router необходимо настроить фильтрацию для исходящих маршрутов в сторону BGP PEER X.X.X.X
·         Настроить PBR с директивой NEXT-HOP для полученных префиксов в адрес 172.16.31.254 (адрес BLACKHOLE)
·         Настроить маршрут в NULL для адреса NEXT-HOP
2.   CHANGE IN CONFIGURATION
#################################################################
--------------------------------------------------------------------FILTER SECTION-------------
ip route 172.16.31.254 255.255.255.255 Null0 name ROUTE-FOR-BLACKHOLING
ip community-list standard BLACKHOLE permit XXXX:666
ip prefix-list MIKROTIK-IN description ALLOW-PREFIX/32
ip prefix-list MIKROTIK-IN seq 5 permit 0.0.0.0/0 ge 32

ip prefix-list MIKROTIK-OUT description NO-ANNOUNCE-ANY-ROUTES
ip prefix-list MIKROTIK-OUT seq 5 deny 0.0.0.0/0 le 32

route-map MIKROTIK-IN permit 10
 match ip address prefix-list MIKROTIK-IN
 match community BLACKHOLE
 set ip next-hop 172.16.31.254
 set community no-export additive
------------------------FILTER SECTION----------------


---------------------------BGP SECTION-----------------

router bgp XXXX

neighbor X.X.X.X remote-as XZXZ
 neighbor X.X.X.X description MIKROTIK-BLACKHOLE
 neighbor X.X.X.X ebgp-multihop 2
 neighbor X.X.X.X password xxxxxxxxxxx
  address-family ipv4

 neighbor X.X.X.X activate
 neighbor X.X.X.X soft-reconfiguration inbound
 neighbor X.X.X.X prefix-list MIKROTIK-IN in
 neighbor X.X.X.X prefix-list MIKROTIK-OUT out
 neighbor X.X.X.X route-map MIKROTIK-IN in
 neighbor X.X.X.X maximum-prefix 1000
--------------------------------------BGP SECTION-----------------
#################################################################

------------------------------SCRIPT SOURCE-----------------
{:log info "START";
:foreach i in=[/ip hotspot walled-garden ip find] do={
  :local dsthost [/ip hotspot walled-garden ip get $i dst-host];
  :log info "==================================="
  :log info $dsthost;
#*******************************************************************************************
  :log info "================ ADDING ==================="
  :foreach i2 in=[/ip hotspot walled-garden find comment="$dsthost"] do={
    :local dstip [/ip hotspot walled-garden get $i2 dst-address];
    :log info "--------"
    :log info $dstip;

    if ([/ip route find dst-address="$dstip/32"]="") do={       
        :log info "added entry: $dstip/32 DOMAIN $dsthost"
        /ip route add dst-address=$dstip comment="$dsthost_BLACKHOLE" type=blackhole bgp-communities=XXXX:666 ;
    }
  }
#*******************************************************************************************
  :log info "================ REMOVING ==================="
  :foreach i2 in=[/ip route find comment="$dsthost_BLACKHOLE"] do={
    :local routeip2 [/ip route get $i2 dst-address];
    :local routeip [:pick $routeip2 0 [:find $routeip2 "/32"]];
    :log info "--------"
    :log info $routeip;

    if ([/ip hotspot walled-garden find dst-address="$routeip"]="") do={
        :log info "deleted entry: $routeip2 DOMAIN $dsthost"
        /ip route remove [/ip route find dst-address="$routeip2"];
    }
  }
#*******************************************************************************************
}
#*******************************************************************************************
:foreach i in=[/ip route find bgp-communities="XXXX:666"] do={
  :local dsthost2 [/ip route get $i comment];
  :local dsthost [:pick $dsthost2 0 [:find $dsthost2 "_BLACKHOLE"]];
  :log info "==================================="
  :log info $dsthost;
  :log info "================ REMOVING ROUTES FOR DELETED HOSTS ==================="
  if ([/ip hotspot walled-garden ip find dst-host="$dsthost"]="") do={
    :log info "deleted all entries for DOMAIN $dsthost"
    /ip route remove [/ip route find comment="$dsthost2"];
  }
}
}
---------------------------------------SCRIPT SOURCE-----------------



Комментариев нет:

Отправить комментарий