Несколько хуков
Для начала нужно создать в файл /usr/local/Reductor/userinfo/hooks/events.sh.hooks в котором перечислены пути к дополнительным хукам, например:
/usr/local/Reductor/userinfo/hooks/events.https.sh /usr/local/Reductor/userinfo/hooks/events.https_plus.sh
Что описывать в хуках
Всё то же самое, что и раньше:
- Получение списка IP
- Добавление IP адреса для блокировки
- Прекращение блокировки IP адреса
Примечания
- Внимательно проверьте что то, что вы получаете на выходе из функции "получение списка IP" совпадает по формату с содержимым синхронизируемого списка.
- Частая ошибка - синхронизация не работает из-за того что с маршрутизатора получаются подсети вида x.x.x.x/32, а в списке x.x.x.x или наоборот.
- Ещё один момент - ipset в Linux (по крайней мере в CentOS 6) имеет смешанный формат - маски /32 скрываются, а все остальные остаются. Это тоже может приводить к проблемам при фильтрации.
- Для использования подсетей используйте тип ipset hash:net
Пример - фильтрация ip_https и ip_subnet_block на Linux роутере
Вводные данные
- На роутере фильтрация производится с помощью ipset.
- Создание ipset при старте обеспечивается его настройками, а не скриптом синхронизации
- Создание фильтрующих правил для iptables обеспечивается его настройками, а не скриптом синхронизации
Настройки на Carbon Reductor
1. Подготавливаем окружение к работе
Управление роутером будет осуществляться по SSH в автоматическом режиме. Для этого нужно избавиться от необходимости вводить пароль. Можно сделать это несколькими способами:
- обмен ssh-ключами
- использование sshpass
- использование ssh + tcl/expect (не знаю зачем)
Рассматриваем первый вариант - SSH-ключи.
Для упрощения рассматриваем вариант работы под рутом, без sudo и настройки TTY. Это не очень секьюрно, но секьюрность можно настроить потом, когда заработает основная функциональность.
Если SSH-ключей нет - создайте их:
ssh-keygen
Обменяйтесь ключами с роутером. Считаем, что IP роутера - 10.50.140.73.
ssh-copy-id root@10.50.140.73
Создаём ipset (нужно это автоматизировать иначе после перезагрузки роутера это перестанет работать).
ipset create ip_https hash:net
2. Создаём список дополнительных хуков:
/usr/local/Reductor/userinfo/hooks.events_https.sh
3. Смотрим на формат синхронизируемых списков:
- ip_https.load - x.x.x.x/yy
- ip_subnet_block.load - x.x.x.x/yy
Нам везёт и хуки будут почти идентичными.
Поскольку происходит синхронизация подсетей в конфиге, в настройках алгоритма фильтрации включаем опцию:
[x] Синхронизировать IP-адреса подсетями
В противном случае синхронизация будет зацикливаться и будет то удалять, то добавлять элементы.
4. Хук для ip_https.load
Хук должен быть исполнимым файлом, иначе он будет пропускаться.
touch /usr/local/Reductor/userinfo/hooks/events.https.sh chmod a+x /usr/local/Reductor/userinfo/hooks/events.https.sh
#!/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" }
5. Аналогично для ip_block.load
touch /usr/local/Reductor/userinfo/hooks/events.sh chmod a+x /usr/local/Reductor/userinfo/hooks/events.sh
#!/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" }