Видаліть ланцюжок iptables з усіма своїми правилами


31

У мене додається ланцюжок з багатьма правилами, такими як:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

коли я намагаюся видалити цю ланцюжок за допомогою:

iptables -X XXXX

але сталася помилка на кшталт (спробував iptables -F XXXXX раніше):

iptables: Занадто багато посилань.

Чи є простий спосіб видалити ланцюжок одноразовою командою?


2
Я не бачив таких iptables barf раніше, коли намагався промити.
Том О'Коннор

Просто цікаво ... скільки правил "багато"?
Ladadadada

1
2 багато - це багато :) якщо я спробую спочатку видалити правила, сподобається вводити багато разів: iptables -D OUTPUT -d XXX / 32 -j i_XXXXX_i
тимчасовий

3
Спробуйте це:iptables-save | grep -v i_XXXXX_i | iptables-restore
Стівен, понеділок,

@StevenMonday чому б не написати як відповідь, це найкорисніший варіант (альтернативно це зробити через файл та редагувати файл). Єдине, чого він не видаляє, - це повні таблиці ("сировини" все одно)
nhed

Відповіді:


38

Ви не можете видалити ланцюги, коли правила з '-j CHAINTODELETE' посилаються на них. З’ясуйте, на що посилається ваш ланцюг (посилання), і видаліть його. Крім того, промийте потім вбийте.

-F, - промити [ланцюжок]

Промийте вибраний ланцюг (усі ланцюги в таблиці, якщо такі не вказані). Це еквівалентно видаленню всіх правил по одному.

-X, --захист ланцюга [ланцюг]

Видаліть необов'язковий вказаний користувачем ланцюжок. Не повинно бути посилань на ланцюг. Якщо такі є, ви повинні видалити або замінити посилаються правила, перш ніж ланцюг можна буде видалити. Ланцюжок повинен бути порожнім, тобто не містити жодних правил. Якщо аргумент не наводиться, він спробує видалити кожну невбудовану ланцюжок у таблиці.


Я просто хочу знайти спосіб видалити ланцюжок (має багато правил "-j CHAINTODELETE" ref) безпосередньо, але з вашої відповіді це здається неможливим :(
тимчасовий

1
Коментар @timy StevenMonday однозначно видалить усі посилання на ланцюжок. Можливо, не ідеально, але прокляте близько.
Джефф Ферланд

12

Це потенційно поза темою, але це те, що я зробив після того, як знайшов цю посаду! У деяких випадках використання може бути корисним варіант iptables -D. Оскільки це дозволяє очистити посилаються на правила, додані програмно за допомогою -A (якщо ви точно знаєте, як ви їх додали).

Напр

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

можна обернути за допомогою

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

Вам потрібно два кроки, але це робиться в одній команді.

Створіть файл і помістіть його до нього.

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

Збережіть файл як "чіткі всі правила". Тепер виконайте цю команду:

iptables-restore < clear-all-rules

Тепер ви можете очистити його будь-коли лише за допомогою однієї команди.


1
+1 Це насправді найшвидший спосіб почати з чистої конфігурації fw.
dr01

6

Ось альтернативний план. Він передбачає три команди, не одну, але, якщо везе, це має працювати.

Скиньте iptablesнабір правил у файл:

iptables-save > /tmp/iptables.txt

Видаліть ВСІ використання (та посилання на них) ланцюжка порушень:

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

Потім перезавантажте набір правил:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

Щось у цих рядках змусить усіх їх в один рядок, не знімаючи iptables жодним чином.

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

У файлі man iptables є параметр -S

S, --list-правила [ланцюг] Роздрукуйте всі правила у вибраному ланцюжку. Якщо ланцюг не вибраний, всі ланцюги друкуються як iptables-save. Як і будь-яка інша команда iptables, вона застосовується до вказаної таблиці (за замовчуванням використовується фільтр).

За допомогою iptables -S | grep <CHAINNAMEHERE>. Наприклад:

root @ root: ~ # iptables -S | греп TRAFFICLOG

-Н ТРАФІКЛОГ

-А ВПЕРЕД, -i eth0 -j ТРАФІКЛОГ

потім можна побачити, які правила блокують видалення ланцюжка з таблиці. Пройдіть кожне правило (за винятком iptables -N <CHAINNAMEHERE>і видаліть правило, скориставшись -Dопцією

-D, - видалити правила ланцюга Вилучити одне або більше правил із вибраного ланцюга. Існує дві версії цієї команди: правило можна вказати як число у ланцюжку (починаючи з 1 для першого правила) або як правило, яке відповідає.

Наприклад iptables -D FORWARD -i eth0 -j TRAFFICLOG. Після того, як ви видалили кожне правило для вашої ланцюга очистить ланцюжок з -Fопцією iptables -F <CHAINNAMEHERE>.

-F, --flush [ланцюг] Промийте вибраний ланцюг (усі ланцюги в таблиці, якщо такі не вказані). Це еквівалентно видаленню всіх правил по одному.

Потім видаліть ланцюжок за допомогою -Xпараметра,iptables -X <CHAINNAMEHERE>

-X, --delete-ланцюг [ланцюг] Видаліть необов'язковий визначений користувачем ланцюжок. Не повинно бути посилань на ланцюг. Якщо такі є, ви повинні видалити або замінити посилаються правила, перш ніж ланцюг можна буде видалити. Ланцюжок повинен бути порожнім, тобто не містити ніяких правил. Якщо аргумент не наводиться, він спробує видалити кожну невбудовану ланцюжок у таблиці.

Iptables - це складний набір інструментів, тому потрібен ідеальний підручник. Ви можете спробувати його на www.iptables.info


0

Це виплюне ланцюги та видалить їх

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

Я виявив, що ви можете видалити правила та ланцюжок, відредагувавши файл правил у /etc/iptables/rules.v4. Якщо ви видалите непотрібний ланцюжок з цього файлу і потім перезавантажите iptables, вам більше не слід бачити ланцюжок під час iptables -L.


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