Почему постоянный сервис Iptables не сохраняет мои изменения?

18

Я следовал этому руководству, чтобы настроить правила IP в Ubuntu 12.04. При настройке все работало нормально, но теперь я внес изменения в брандмауэр, которые не сохраняются после перезагрузки. Я не понимаю, почему это так. Вот демонстрация того, как я использую iptables-persistent. Что я делаю неправильно?

$ sudo service iptables-persistent start
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...   

$ sudo iptables -L   //shows a certain rule
$ iptables -D INPUT ... //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

 $ sudo service iptables-persistent restart
 * Loading iptables rules...                                                                                             *  IPv4...                                                                                                              *  IPv6...                                                                                                      [ OK ] 
 $ sudo iptables -L  //rule is back
bernie2436
источник
Я заметил, что iptables -D INPUTправило не в том sudo, вы уверены, что на самом деле он сообщает об успехе? Меняется ли поведение, если вы запускаете его внутри sudo?
Братчли

Ответы:

41

iptables-persistentне работает таким образом. Перезапуск iptables-persistent«службы» не фиксирует текущее состояние iptables и не сохраняет его; все, что он делает, это восстанавливает правила iptables, которые были сохранены, когда пакет был последний раз настроен.

Для настройки iptables-persistentвам нужно рассказать о вашем текущем наборе правил iptables.

Один из способов сделать это заключается в следующем:

iptables-save >/etc/iptables/rules.v4
ip6tables-save >/etc/iptables/rules.v6

Или, что эквивалентно, iptables-persistentпакет также предоставляет следующее:

dpkg-reconfigure iptables-persistent

(Вам нужно будет ответить «да» на вопросы о том, сохранять ли правила.)

После этого при следующем iptables-persistentзапуске / перезапуске ожидаемые наборы правил iptables будут загружены.

Стивен Понедельник
источник
9

Очень простой способ сохранить текущие правила iptables - использовать команду:

sudo service netfilter-persistent save

Используя вышеприведенное, которое работает, по крайней мере, в Ubuntu после установки пакета netfilter-persistentiptables-persistent), нет необходимости вручную запускать команды iptables или перенастраивать пакет (как это предлагается даже в принятом ответе выше).

OpenITeX
источник
Это sudo service netfilter-persistent saveили sudo service netfilter-persistent save .? (Точка в конце.)
Спасибо, что обратили внимание, правильная команда без точки в конце строки. Исправил ответ соответственно.
OpenITeX
3
$ iptables ... DROP //command successfully drops the rule
$ sudo iptables -L   //shows rule has been deleted

Это не то, что DROPзначит или делает. От man iptables:

... специальные значения ACCEPT, DROP, QUEUE или RETURN. ПРИНЯТЬ означает пропустить пакет. DROP означает сбросить пакет на пол. QUEUE означает ...

Итак, что вы сделали, это добавили новое правило. Он может эффективно заменить любое количество других правил, но эти правила все еще существуют.

Проверяя подобные вещи (ваш iptables -Lвывод), я бы их кормил, grep "string unique to this rule"а не использовал ваши глаза. Это проще и быстрее, и меньше подвержено ошибкам.

iptables -L | grep "some unique string"

Если вы хотите удалить правило, используйте -Dпереключатель; Страница man описывает две формы этого:

-D, - Удалить правило цепочки-спецификация

-D, - удалить цепочку рулен

Удалить одно или несколько правил из выбранной цепочки. Существует две версии этой команды: правило может быть указано как число в цепочке (начиная с 1 для первого правила) или как правило для сопоставления.

лютик золотистый
источник
извините, что было неясно. Я использую опцию -D для удаления правила. Смотрите изменения выше
bernie2436
3
-Dозначает «удалить», а не «DROP». Использование термина «DROP» для обозначения чего-либо, кроме цели прыжка, когда речь идет о iptablesчём-то путающем.
Братчли
1

Как объясняет @ steven-monday , вы можете самостоятельно сохранить набор правил в соответствующем каталоге (а именно :)/etc/iptables/rules.v{4,6} .

Однако @OpenITeX прав: лучше вызывать saveдействие service netfilter-persistent.

На сегодняшний день (в 18.10), Iptables-спасбросках встроенный, но iptables-persistentэто не установлен. Следовательно, каталог подключаемого модуля service netfilter-persistentпуст, и служба распечатывает, что набор правил был сохранен, тогда как это не так.

TLDR: установите iptables-persistentи убедитесь, что каталог /usr/share/netfilter-persistent/plugins.dплагинов содержит плагины.


Вот как я это понял:

$ cat /etc/init.d/netfilter-persistent 
...
case "$1" in
...
save)
    log_action_begin_msg "Saving netfilter rules"
    /usr/sbin/netfilter-persistent save
    log_action_end_msg $?
    ;;

Затем проверьте /usr/sbin/netfilter-persistentскрипт, обратите внимание, что он вызывает внешние скрипты:

$ cat /usr/sbin/netfilter-persistent
...
PLUGINS=/usr/share/netfilter-persistent/plugins.d
...
run_plugins () {
    if [ -d ${PLUGINS} ]; then
        run-parts -v -a ${1} ${PLUGINS}
    fi
}

case $1 in
start|save|flush)
    run_plugins ${1}
    ;;

Потом я заметил, что это /usr/share/netfilter-persistent/plugins.dбыло пусто.

Aif
источник
1

Установите iptables-persistent:

sudo apt install iptables-persistent

сохранить правила после внесения желаемых изменений:

sudo netfilter-persistent save
Зак А
источник