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

{toc}

h2. Несколько хуков

Для начала нужно создать в файл /usr/local/Reductor/userinfo/hooks/events.sh.hooks в котором перечислены пути к дополнительным хукам, например:

{code}
/usr/local/Reductor/userinfo/hooks/events.https.sh
/usr/local/Reductor/userinfo/hooks/events.https_plus.sh
{code}

h2. Что описывать в хуках

Всё то же самое, что и раньше:

* Получение списка IP
* Добавление IP адреса для блокировки
* Прекращение блокировки IP адреса

h2. Примечания

* Внимательно проверьте что то, что вы получаете на выходе из функции "получение списка IP" совпадает по формату с содержимым синхронизируемого списка.
* Частая ошибка - синхронизация не работает из-за того что с маршрутизатора получаются подсети вида x.x.x.x/32, а в списке x.x.x.x или наоборот.
* Ещё один момент - ipset в Linux (по крайней мере в CentOS 6) имеет смешанный формат - маски /32 скрываются, а все остальные остаются. Это тоже может приводить к проблемам при фильтрации.
* Для использования подсетей используйте тип ipset hash:net

h2. Пример - фильтрация ip_https и ip_subnet_block на Linux роутере

h3. Вводные данные

* На роутере фильтрация производится с помощью ipset.
* Создание ipset при старте обеспечивается его настройками, а не скриптом синхронизации
* Создание фильтрующих правил для iptables обеспечивается его настройками, а не скриптом синхронизации

h3. Настройки на Carbon Reductor

1. Подготавливаем окружение к работе

Управление роутером будет осуществляться по SSH в автоматическом режиме. Для этого нужно избавиться от необходимости вводить пароль. Можно сделать это несколькими способами:

* обмен ssh-ключами
* использование sshpass
* использование ssh + tcl/expect (не знаю зачем)

Рассматриваем первый вариант - SSH-ключи.
Для упрощения рассматриваем вариант работы под рутом, без sudo и настройки TTY. Это не очень секьюрно, но секьюрность можно настроить потом, когда заработает основная функциональность.

Если SSH-ключей нет - создайте их:

{code}
ssh-keygen
{code}

Обменяйтесь ключами с роутером. Считаем, что IP роутера - 10.50.140.73.

{code}
ssh-copy-id root@10.50.140.73
{code}

Создаём ipset (нужно это автоматизировать иначе после перезагрузки роутера это перестанет работать).

{code}
ipset create ip_https hash:net
{code}

2. Создаём список дополнительных хуков:

{code}
/usr/local/Reductor/userinfo/hooks.events_https.sh
{code}

3. Смотрим на формат синхронизируемых списков:

* ip_https.load - x.x.x.x/yy
* ip_subnet_block.load - x.x.x.x/yy

Нам везёт и хуки будут почти идентичными.
Поскольку происходит синхронизация подсетей в конфиге, в настройках алгоритма фильтрации включаем опцию:

{panel}
\[x\] Синхронизировать IP-адреса подсетями
{panel}

В противном случае синхронизация будет зацикливаться и будет то удалять, то добавлять элементы.

4. Хук для ip_https.load

Хук должен быть исполнимым файлом, иначе он будет пропускаться.

{code}
touch /usr/local/Reductor/userinfo/hooks/events.https.sh
chmod a+x /usr/local/Reductor/userinfo/hooks/events.https.sh
{code}

{code}
#!/bin/bash

IPSET=ip_https
SSH="ssh -T root@10.50.140.73"
IP_BLOCK_FULL_LIST="$LISTDIR/load/ip_https.load"

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

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

# получить список уже заблокированных IP адресов, нужно для вычисления дельты
ip_block_full_get() {
echo ipset save $IPSET | $SSH | egrep -o "$ip_or_ipmask_regex"
}
{code}

5. Аналогично для ip_block.load

{code}
touch /usr/local/Reductor/userinfo/hooks/events.sh
chmod a+x /usr/local/Reductor/userinfo/hooks/events.sh
{code}

{code}
#!/bin/bash

IPSET=ip_block
SSH="ssh -T root@10.50.140.73"

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

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

# получить список уже заблокированных IP адресов, нужно для вычисления дельты
ip_block_full_get() {
echo ipset save $IPSET | $SSH | egrep -o "$ip_or_ipmask_regex"
}
{code}