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

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (1)

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

h1. При запуске системы, вижу ошибку выполнения скрипта, что делать?
Например:
{code}
[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]
{code}
Попробуйте отладить скрипт, максимально его сократив, убрав все команды и операторы, добавляйте их постепенно. Например, у Вас есть скрипт:
{code}
#!/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
{code}
Сделайте следующее:
{info}Не обязательно постоянно для проверки перезапускать контейнер командой _/app/<app>/service restart_, можно передать параметры напрямую скрипту:
{code}bash -x /app/xge/cfg/hooks /etc/init.d/firewall start{code}{info}
*bash -x* - это выполнение скрипта с отладкой.
# Попробуйте удалить все строки в условии и оставьте там пустой оператор, приведите скрипт к такому виду:
{code}#!/bin/bash
if [ "$1" = "/etc/init.d/firewall" -a "$2" = "start" ]; tnen

:

fi
exit 0{code}
Данный пример все равно завершится ошибкой, в скрипте опечатка: вместо "*t{color:blue}h{color}en*" написано "*t{color:red}n{color}en*"
# Когда разобрались с синтаксисом, возвращайте все что было в условии постепенно, начните с правила iptables:
{code}#!/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{code}
Скрипт так же завершитсяс ошибкой. Вы выоде скрипта мы увидем что она заключается в некорректном формировании правила:
{code}# /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.{code}
После изучения документации по фаерволу "*\-\-d{color:red}est-{color}port*" заменили на "*--dport*" и команда выполнилась успешно.
# Далее вернули настройку маррутизации и снова попроловали выполнить:
{code:title=Скрипт}#!/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{code}
{code:title=Результат выполнения}# /app/xge/cfg/hooks /etc/init.d/firewall start
Cannot find device "Eeth2"
RTNETLINK answers: File exists{code}
Мы получили ошибку того что устройство "Eeth2" не найдено. Все верно - у нас нет устройства с таким именем. Проверив настройки сети имена интерфейсов приходим к выводу что настроить нужно интерфейс eth2:
было "*ip route add 10.0.0.2 dev {color:red}E{color}eth2*", стало "*ip route add 10.0.0.2 dev eth2*"
# Выполняем исправленный скрипт
{code:title=Скрипт}#!/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{code}
{code:title=Результат выполнения}# /app/xge/cfg/hooks /etc/init.d/firewall start
RTNETLINK answers: File exists
{code}
Воспользовавшись [поиском Google|https://www.google.com/search?client=ubuntu&channel=fs&q=RTNETLINK+answers%3A+File+exists&ie=utf-8&oe=utf-8] можно найти информацию по ошибке.
Так же можно выполнить скрипт с повышенным логированием:
{code}# 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{code}
Теперь ошибка повторяется дважды.
В данно случае проблемы не было: ядро по-сути сообщало что такое правило уже существует, первый раз так как команда "ip route add 0/0 via 10.0.0.2" все-таки выполнилась на одной из предыдущих итераций; второй раз - так как на предпоследней интерации проверки выполнилась и команда "ip route add 10.0.0.2 dev eth2"

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