Чому постійний сервіс Iptables не зберігає мої зміни?


18

Я дотримувався цього підручника, щоб налаштувати правила IP для ubuntu 12.04. У налаштуваннях все працювало нормально - але тепер я змінив брандмауер, які не зберігаються при перезавантаженні. Я не розумію, чому це так. Ось демонстрація того, як я використовую стійкий iptables. Що я роблю неправильно?

$ 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

Я помічаю, що це 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 або перенастроювати пакет (як це запропоновано навіть прийнятим Відповіддом вище).


Це 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. ACCEPT означає пропустити пакет через. ДРОП означає скинути пакет на підлогу. ЧИТА означає ...

Тож, що ви зробили, - це додати нове правило. Це може фактично замінити будь-яку кількість інших правил, але ці правила все ще існують.

Перевіряючи подібні речі (ваш 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це порожньо.


1

Встановіть стійкі iptables:

sudo apt install iptables-persistent

зберегти правила після внесення бажаних змін:

sudo netfilter-persistent save
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.