LINUX.ORG.RU
ФорумAdmin

Скрипты ip-up.d и ip-down.d


0

1

Доброго времени суток! Есть ppp сессии. При поднятии и опускании интерфейса выполняются скрипты с папок ip-up.d и ip-down.d

В ip-up.d есть файлик с:

      if [ "$numb_isp1" -ge "$numb_isp3" ]
         then
             iptables -t mangle -A PREROUTING -s $5 -j balance_isp3
         else
             iptables -t mangle -A PREROUTING -s $5 -j balance_isp1
         fi

   fi
А ip-down.d есть файлик с:
iptables -t mangle -D PREROUTING -s $5 -j $(iptables-save | awk '/'$5'/{print $6}')

Есть проблема, иногда некоторые правила не удаляются с фаервола, видимо из-за повисших сессий которые закрываются по таймауту. Так как при поднятии правила успешно добавляются и если корректно завершить то удаляются так же успешно. Но через время правил становится больше чем сессий. Как заставить ppp корректно удалять правила?

Заранее спасибо.


Папки в винде.

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

То, что ppp может «вывалиться» и не запустить скрипты это нормально, поэтому должен быть ещё один скрипт, который приводит в соответствие правила iptables с открытыми сессиями и дёргать его, допустим, из crond или из ip-up.d.

mky ★★★★★
()

уменьшить таймауты, чтоб сессии отваливались скорее, или участить keep-alive'ы, чтоб не отваливались

в скрипты добавить проверку наличия висящих сессий, сессии идентифицировать по ipparam, намеренно внесённому в конфиги

anonymous
()
Ответ на: комментарий от mky

Спасибо. Сделаю скриптик который будет парсить нужные правила с ip в iptables и искать сессии по ним, иначе удалять правила.

fet4
() автор топика
Ответ на: комментарий от fet4

Советую в этом скрипте сначала сохранять список правил iptables в файл/массив, потом ждать 1-2 секунды, и потом сверять список ip-адресов с этим сохранённым списком правил, так как при работе скрипта могут происходить подключения клиентов и изменения правил iptables.

Ещё советую в скрипте в ip-up.d сделать поиск и удаление правила ″-t mangle -A PREROUTING -s $5 -j ...″, если оно вдруг осталось от предыдущей сессии, чтобы не возникло двух правил с одинаковым src-ip, иначе ваша конструкция ″-D PREROUTING -s $5 -j $(iptables-save | awk '/'$5'/{print $6}')″ сломается.

Ещё, если нагрузка на сервер не большая, можно сделать немного другую структуру правил iptables — заводить под каждый src-ip свою цепочку, а уже в ней ″-j balance_isp3″. Это не оптимально с точки зрения кол-ва правил, зато проще удалять правила. То есть:

iptables -t mangle -N I-$5  # Имя цепочки I-192.168.1.2

iptables -t mangle -F I-$5   # Очистка правил
while iptables -t mangle -D PREROUTING -s $5 ; do : ; done

iptables -t mangle -A PREROUTING -s $5 -j I-$5
iptables -t mangle -A I-$5 -j balance_isp3

mky ★★★★★
()
Ответ на: комментарий от mky

Я думаю можно даже раз в сутки подчищать правила ipt ночью когда активность авторизаций невелика.

Ещё советую в скрипте в ip-up.d сделать поиск и удаление правила ″-t mangle -A PREROUTING -s $5 -j ...″, если оно вдруг осталось от предыдущей сессии, чтобы не возникло двух правил с одинаковым src-ip, иначе ваша конструкция ″-D PREROUTING -s $5 -j $(iptables-save | awk '/'$5'/{print $6}')″ сломается.

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

fet4
() автор топика
Ответ на: комментарий от user_id_68054

Надо же, запилили в середине прошлого года эту опцию. Мне её сильно не хватало в 2002 году, пришлось патчить iptables, только lock делался не на сокете, а на чём-то другом, уже не помню.

Если я правильно понял, то опция -w появилась с версии 1.4.20, пойду, попробую поискать её для CentOS.

mky ★★★★★
()
Ответ на: комментарий от mky

Надо же, запилили в середине прошлого года эту опцию. Мне её сильно не хватало в 2002 году

запилили они...

а по-умолчанию это поведение запилить — они не догадались. пффффффф...

есть же различные программы где используются вызовы iptables , например «rp-pppoe» . и в этих программах — нет ключа "-w" (например, я пытался списаться через лист-рассылки с разработчиками «rp-pppoe», но меня проигнорировали) .

то есть либо эти программу будут конфликтовать с кастумными скриптами, либо кастумные скрипты будут конфликтовать с этими программами (либо и те и те — друг с другом :)).

борьба за обладание iptables. ТФУ БЛИН! всего-лишь из-за того что не сделали поведение "-w" по умолчанию в «iptables»..

уточнение: судя по всему ключь "-w" не способен работать на старенькой версии ядра Linux. быть может именно поэтому его поведение и не сделали по умолчанию.

--------------------------------------------------

а в скриптах думаю ты можешь использовать хак:

if iptables -w -nL >/dev/null 2>&1
then
  iptables_wrap () {
    iptables -w "$@"
  }
else
  touch /run/iptables.lock
  iptables_wrap () {
    flock -x /run/iptables.lock iptables "$@"
  }
fi

# далее вызываем везде iptables_wrap вместо iptables

iptables_wrap ...
iptables_wrap ...
iptables_wrap ...
...
user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 2)
Ответ на: комментарий от user_id_68054

уточнение: судя по всему ключь "-w" не способен работать на старенькой версии

Если говорить про этот патч: http://git.netfilter.org/iptables/commit/?id=93587a04d0f2511e108bbc4d87a8b9d2... , то он основан на абстрактных unix-сокетах (не требующих создание файла), которые появились в ядре 2.2.0. Если iptables способны работать с ядром, то и этот патч будет работать.

Почему блокировку сделали не по умолчанию, а придумали опцию для меня тоже загадка. ИМХО, патч не очень, бесконечный цикл до успешной блокировки с попытками раз в секунду. Я бы сделал 10-50 попыток с интервалами 0,1 секунда. И ещё, может я не правильно понял, но судя по алгоритму, LOCK создаётся перед инициализацией соединения iptables с ядром, и исчезает при завершении процесса iptables. И получается, что если на хосте со 100500 правилами запущу команду ″iptables -L″ и выполняться она (из-за DNS) будет медленно, то всё это время остальные iptables будут ждать, хотя лок нужен только на время работы с ядром. Может по-этому сделана опция ″-w″.

mky ★★★★★
()
Ответ на: комментарий от mky

У меня 1.4.14, я так понял опции этой у меня нет? По крайней мере в манах ее не видно у меня. Поставить свежую версию и должно заработать?
То есть во всех скриптах где успользуются правила iptables просто использовать с ключом -w?

fet4
() автор топика
Ответ на: комментарий от fet4

Да, поновее (>= 1.4.20) и опция должна появиться. В скриптах её использовать, но скрипт, подчищающий правила раз в сутки, всё одно желателен.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.