Просмотр Исходного

{toc}


h1. Перед тем как начать

Проверьте, что хук работает:

{code}
tail -f /var/log/reductor/reductor.log
{code}

Если есть ошибки соединения с сервером или другие проблемы - сперва решите их.

h1. {color:#000000}{*}Хук для Quagga (BGP)*{color}

Проверить что используется quagga:
{code}
ps aux | grep bgpd
{code}

Хук позволяет настроить анонсирование IP адресов подсетями, появление крупных префиксов в реестре не будет приводить к зависаниям маршрутизаторов.

Для включения нужно:

Бэкапим старый хук:
Для Carbon Reductor 7:
{code}
cp -a /usr/local/Reductor/userinfo/hooks/events.sh /root/events.sh.$(date +%s)
{code}

Для Carbon Reductor 8:
{code}
cp -a /app/reductor/cfg/userinfo/hooks/events.sh /root/events.sh.$(date +%s)
{code}
Заменить хук приведённым ниже примером, с поддержкой подсетей.

{code}
#!/bin/bash

# этот хук поддерживает отправку только подсетями
# предполагается, что синхронизируемый список содержит
# только подсети уже с маской и в ответ мы получаем
# именно IP адреса с маской

commit() {
echo "wr m" | vtysh
}

# отправить на оборудование команду на блокирование ip адреса
ip_block_full_add() {
local ip="$1"
read SEQ < $TMPDIR/blockseq
SEQ=${SEQ:-0}
let SEQ+=5
echo $SEQ > $TMPDIR/blockseq
echo $SEQ
{
echo "conf t"
echo "ip prefix-list BLACKHOLE seq $SEQ permit $ip"
echo "ip route $ip Null0"
echo "end"
echo "clear ip bgp * soft"
} | vtysh
}

# отправить на оборудование команду на снятие блокировки ip адреса
ip_block_full_del() {
local ip="$1"
{
echo "conf t"
echo "no ip prefix-list BLACKHOLE permit $ip"
echo "no ip route $ip Null0"
echo "end"
echo "clear ip bgp * soft"
} | vtysh
}

# получить список заблокированных ip адресов
ip_block_full_get() {
echo -ne "show ip route static" | vtysh > $HOOKDIR/ip_route.txt
egrep -o "$ipmask_regex" $HOOKDIR/ip_route.txt | tee $HOOKDIR/ip.txt
}
{code}

Включить опцию menu \-> "Настройки алгоритма фильтрации" \-> "Синхронизировать IP-адреса подсетями"

Очистить конфиги quagga от маршрутов и перезаполнить их:
{code}
/etc/init.d/crond stop
killall events.sh
grep -v '^ip prefix-list' /etc/quagga/bgpd.conf > /etc/quagga/bgpd.conf.no_ip
cat /etc/quagga/bgpd.conf.no_ip > /etc/quagga/bgpd.conf
egrep -v '^(ip prefix-list|ip route)' /etc/quagga/zebra.conf > /etc/quagga/zebra.conf.no_ip
cat /etc/quagga/zebra.conf.no_ip > /etc/quagga/zebra.conf
/etc/init.d/zebra restart
/etc/init.d/bgpd restart
/etc/init.d/crond start
/usr/local/Reductor/bin/events.sh
{code}

Если используется другой способ синхронизации (ssh, telnet, web api), лучше сперва вручную очистить маршруты перед синхронизацией.

Удаление ≈40-60 тысяч маршрутов по одному может занять много времени.

h1. Хук для Mikrotik

Очистка address-list:

{code}
echo '/ip firewal address-list remove [find list~"reductor_ip_block_list"]' | /usr/bin/ssh -T admin@10.0.0.1
{code}

Сам хук

{code}
#!/bin/bash

SSH="/usr/bin/ssh -T admin@10.0.0.1"

# отсекаем лишнее из вывода /print
__only_ip() {
egrep -o "$ip_or_ipmask_regex" | sed -E "s|^$ip_regex$|&/32|g"
}

# Отправляем на оборудование команду на блокирование ip адреса
ip_block_full_add() {
local ip="$1"
echo "/ip firewall address-list add list=reductor_ip_block_list address=$ip comment=${ip}_reductor_ip_block" | $SSH
}
# Отправляем на оборудование команду на снятие блокировки ip адреса
ip_block_full_del() {
local ip="$1"
echo "/ip firewall address-list remove [find comment=${ip}_reductor_ip_block]" | $SSH
}

mikrotik_firewall_prepare() {
echo "/ip firewall filter add chain=reductor_forward comment=reductor_ip_block dst-address-list=reductor_ip_block_list action=drop" | $SSH
echo "/ip firewall filter add chain=forward action=jump jump-target=reductor_forward place-before=0" | $SSH
}

# Получаем список заблокированных IP
ip_block_full_get() {
# mikrotik_firewall_prepare
echo "/ip firewall address-list print where list=reductor_ip_block_list" | $SSH | __only_ip
}
{code}

h1. Хук для Linux-роутеров

Предполагаем, что ipset hash type = hash:net. В случае с hash:ip надо пересоздавать ipset, рестартить iptables итд.

Чтобы пересоздать ipset нужно удалить все правила в iptables, которые его используют.

Быстрая очистка ipset:

{code}
ipset flush rkn
{code}

Хук:

{code}
#!/bin/bash

SSH="/usr/bin/ssh -T root@10.0.0.1 bash"
SET_RKN=rkn

# отсекаем лишнее из вывода ipset
__only_ip() {
grep add | egrep -o "$ip_or_ipmask_regex" | sed -E "s|^$ip_regex$|&/32|g"
}

# отправить на оборудование команду на блокирование ip адреса
ip_block_full_add() {
local ip="$1"
echo "/sbin/ipset add $SET_RKN $ip" | $SSH
}

# отправить на оборудование команду на снятие блокировки ip адреса
ip_block_full_del() {
local ip="$1"
echo "/sbin/ipset del $SET_RKN $ip" | $SSH
}

# получить список заблокированных ip адресов
ip_block_full_get() {
echo "/sbin/ipset save $SET_RKN" | $SSH | __only_ip
}
{code}