Дополнительные настройки. hooks. Хуки. Свои правила в firewall

Skip to end of metadata
Go to start of metadata

Назначение скриптов hooks

Скрипты hooks позволяют выполнять какие-либо действия при запуске и остановке служб (демонов в терминологии Unix).
Например, таким образом можно добавить собственные правила IPTABLES.

Добавление правил

Скрипт hooks написан на языке Bash. Изменения вносятся в середину скрипта, первую и последнюю строки оставьте неизменными. В общем виде скрипт должен выглядеть так:

#!/bin/bash


if [ "$1" = 'Имя_службы' -a "$2" = 'Параметр' ]; then

    #Ваши изменения здесь

fi

exit 0

Первый параметр - служба, второй 'start' или 'stop', третий параметр - код возврата от службы.

Например, разрешим доступ на порты пассивного режима ftp-сервера биллинга:

#!/bin/bash

if [   "$1"   =   "/etc/init.d/firewall" -a "$2" = start  ]; then

     iptables -I asr_billing_input -p tcp --destination-port 10090:10100 -j ACCEPT 

fi
exit 0

После редактирования скрипта нужно перезапустить соответствующий контейнер:

Например:

/app/base/service restart

Что для чего

При изменении кастомных цепочек asr_billing_input правила необходимо добавлять в hook контейнера asr_billing, если цепочка asr_cabinet_input - добавлять в hooks asr_cabinet и т.п. Изменение *базовых * цепочек (INPUT,OUTPUT,PREROUTING и т.д.) гарантированно нарушит связь контейнеров, а следовательно всей системы.

Необходимые правила IPTABLES и прочие действия необходимо описывать в хуках соответствующих контейнеров

auth

Базовый интерфейс авторизации в платформе, других функций нет.
Скрипт /app/base/cfg/hooks
iptables-цепочки: auth_input и auth_output

base

Отображает интерфейс перехода в другие контейнеры, к настройкам других контейнеров и настройки доступа к серверу в целом.
Скрипт /app/base/cfg/hooks
iptables-цепочки: base_input и base_output
Обычно используется для предоставления доступа к к веб-интерфейсу управления, но правильнее использовать соответствующее поле в веб-интерфейсе

asr_billing

Управлениие абонентами и тарифами.
Скрипт /app/asr_billing/cfg/hooks
iptables-цепочки: asr_billing_input и asr_billing_output

asr_cabinet

Содержит локальный сайт и личный кабинет.
Скрипт /app/asr_cabinet/cfg/hooks
iptables-цепочки: asr_cabinet_input и asr_cabinet_output
Обычно используется для предоставления доступа к локальному сайту и личному кабинету. По умолчанию доступ предоставлен всем.

asr_fiscal

Содержит модули взаимодействия с платежными системами.
Скрипт /app/asr_fiscal/cfg/hooks
iptables-цепочки: asr_fiscal_input и asr_fiscal_output
Обычно используется для предоставления доступа платежных систем к биллингу, но правильнее использовать соответствующее поле в веб-интерфейсе Шаг 4

collector

Система сбора статистики (Netflow) и DHCP-сервер.
Скрипт /app/collector/cfg/hooks
iptables-цепочки: collector_input и collector_output

monitoring

Система мониторинга Zabbix.
Скрипт /app/monitoring/cfg/hooks
iptables-цепочки: monitoring_input и monitoring_output
Обычно используется для предоставления доступа к ZABBIX.

Использование скрипта hooks по расписанию

Ничто не мешает использовать hooks с помощью cron. Таким образом вы можете выполнять некие команды не при наступлении какого-то события, а в нужное вам время.

Для этого нужно использовать в качестве имени службы:

  • cron.10min - для того чтобы выполнять что-то каждые 10 минут
  • cron.daily - для того чтобы выполнять что-то каждый день
  • cron.hourly - для того чтобы выполнять что-то каждый час
  • cron.monthly - для того чтобы выполнять что-то каждый месяц
  • cron.weekly - для того чтобы выполнять что-то каждую неделю

Либо /etc/crontab, если вам нужно указать специфичное время, но в таком случае указать в вызове в качестве имени службы что-то уникальное, например

10 */2 * * *  root /cfg/hooks /etc/init.d/networkd start 1>/dev/null 2>/dev/null

Отладка добавления правил IPTABLES

  1. Проверьте что правило добавляется из командной строки до того как добавлять его в скрипт hooks
  2. Если произошла ошибка добавления правила, информацию о ней можно попробовать найти в логе /var/log/messages (или выполнив команду dmesg)

При запуске системы, вижу ошибку выполнения скрипта, что делать?

Например:

[root@vm185-120 ~]# /app/xge/service start
/app/xge start
/cfg/hooks: line 8: syntax error near unexpected token `fi'
/cfg/hooks: line 8: `fi'

Ошибка 2 при запуске hook файла: /cfg/hooks /genconfig crond start
Необходимо исправить hook файл!

Копирую модули XGE
 (pid  6001) is running...
Reloading Base Web Server:                                 [  OK  ]

# /app/xge/service start:                                  [FAILED]

Попробуйте отладить скрипт, максимально его сократив, убрав все команды и операторы, добавляйте их постепенно. Например, у Вас есть скрипт:

#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen
    
    iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dest-port 10000 -j DNAT --to-destination 10.100.0.11:10000

    ip route add 10.0.0.2 dev Eeth2
    ip route add 0/0 via 10.0.0.2

fi
exit 0

Сделайте следующее:

Не обязательно постоянно для проверки перезапускать контейнер командой /app/<app>/service restart, можно передать параметры напрямую скрипту:
bash -x /app/xge/cfg/hooks /etc/init.d/firewall start

bash -x - это выполнение скрипта с отладкой.

  1. Попробуйте удалить все строки в условии и оставьте там пустой оператор, приведите скрипт к такому виду:
    #!/bin/bash
    if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen
    
    :
    
    fi
    exit 0

    Данный пример все равно завершится ошибкой, в скрипте опечатка: вместо "then" написано "tnen"

  2. Когда разобрались с синтаксисом, возвращайте все что было в условии постепенно, начните с правила iptables:
    #!/bin/bash
    if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen
        
        iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dest-port 10000 -j DNAT --to-destination 10.100.0.11:10000
        
    fi
    exit 0

    Скрипт так же завершитсяс ошибкой. Вы выоде скрипта мы увидем что она заключается в некорректном формировании правила:

    # /app/xge/cfg/hooks /etc/init.d/firewall start
    iptables v1.4.7: unknown option `--dest-port'
    Try `iptables -h' or 'iptables --help' for more information.

    После изучения документации по фаерволу "--dest-port" заменили на "--dport" и команда выполнилась успешно.

  3. Далее вернули настройку маррутизации и снова попроловали выполнить:
    Скрипт
    #!/bin/bash
    if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; then
        
        iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000
    
        ip route add 10.0.0.2 dev Eeth2
        ip route add 0/0 via 10.0.0.2
    
    fi
    exit 0
    Результат выполнения
    # /app/xge/cfg/hooks /etc/init.d/firewall start
    Cannot find device "Eeth2"
    RTNETLINK answers: File exists

    Мы получили ошибку того что устройство "Eeth2" не найдено. Все верно - у нас нет устройства с таким именем. Проверив настройки сети имена интерфейсов приходим к выводу что настроить нужно интерфейс eth2:
    было "ip route add 10.0.0.2 dev Eeth2", стало "ip route add 10.0.0.2 dev eth2"

  4. Выполняем исправленный скрипт
    Скрипт
    #!/bin/bash
    if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; then
        
        iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000
    
        ip route add 10.0.0.2 dev eth2
        ip route add 0/0 via 10.0.0.2
    
    fi
    exit 0
    Результат выполнения
    # /app/xge/cfg/hooks /etc/init.d/firewall start
    RTNETLINK answers: File exists
    

    Воспользовавшись поиском Google можно найти информацию по ошибке.
    Так же можно выполнить скрипт с повышенным логированием:

    # bash -x /app/xge/cfg/hooks /etc/init.d/firewall start
    + '[' /etc/init.d/firewall = /etc/init.d/firewall -a start = start ']'
    + iptables -t nat -I xge_pre -d 10.0.0.2 -p tcp --dport 10000 -j DNAT --to-destination 10.100.0.11:10000
    + ip route add 10.0.0.2 dev eth2
    RTNETLINK answers: File exists
    + ip route add 0/0 via 10.0.0.2
    RTNETLINK answers: File exists
    + exit 0

    Теперь ошибка повторяется дважды.
    В данно случае проблемы не было: ядро по-сути сообщало что такое правило уже существует, первый раз так как команда "ip route add 0/0 via 10.0.0.2" все-таки выполнилась на одной из предыдущих итераций; второй раз - так как на предпоследней интерации проверки выполнилась и команда "ip route add 10.0.0.2 dev eth2"

Надеемся это поможем Вам отлаживать скрипты запуска. Общий принцип - если сразу не понятно где ошибка, максимально сократите и полняйте постепенно исправляя ошибки и добавляя слеующие пункты конечного скрипта.

Метки

Введите метки, чтобы добавить к этой странице:
Please wait 
Ищите метку? просто начните печатать.