Назад | Перейти на главную страницу

Медленное изменение правил netfilter

У меня есть сценарий, поддерживающий туннели gre и правила брандмауэра с использованием инструментов «ip» и «iptables». Настройка сотен туннелей и адресов на интерфейс работает нормально. Занимает менее 0,1 секунды на интерфейс, однако, когда я пытаюсь выполнить правила брандмауэра, все замедляет расходы> 0,5 на вставку.

Почему он так медленно работает? Что я могу сделать, чтобы увеличить скорость?

Похоже, я мог бы вместо этого попробовать ipset, но я действительно чувствую, что что-то не так с ядром или чем-то еще. Интересно то, что первые 10 правил работает быстро, потом тормозит ..

mybox(root) foo# iptables -V
iptables v1.3.5
mybox(root) foo# uname -a 
Linux foo 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
mybox(root) foo# cat test.sh
#!/bin/sh

for n in {1..100}
do
  /sbin/iptables -A OUTPUT -s ${n} -j ACCEPT
  /sbin/iptables -D OUTPUT -s ${n} -j ACCEPT
done
mybox(root) foo# time ./test.sh

real    1m38.839s
user    0m0.100s
sys     1m38.724s

Приветствую любую помощь. Ура!

Номер один: Ваше ядро очень устаревший. И твой тоже iptables.

Номер два: «Проблема» в том, что для каждый призыв iptables, что произошло:

  1. iptables вытягивает всю таблицу из ядра в пространство пользователя
  2. iptables изменяет таблицу в пользовательском пространстве
  3. iptables отодвигает таблицу в пространство ядра

Скорее настройте свой iptables набор правил так, как вы хотите, а затем сохраните его, используя iptables-save > some_file_name. В все набор правил будет восстановлен одним махом с помощью команды iptables-restore < some_file_name.

(Конечно, заменить some_file_name там с именем файла, в котором вы хотите сохранить набор правил.)