Як я можу перевірити, чи існує правило iptables?


41

Мені потрібно додати правило до iptables, щоб заблокувати з'єднання до порту tcp з Інтернету.

Оскільки мій скрипт може викликатися кілька разів, і немає сценарію для видалення правила, я хочу перевірити, чи існує правило iptables перед тим, як вставити його - інакше буде багато правил дублювання у ланцюзі INPUT.

Як я можу перевірити, чи існує правило iptables?


Крім того, використовуйте цю обгортку, яка забезпечує взаємодію iptables з ідентичною можливістю
sampablokuper

Відповіді:


44

В -C --checkостанніх версіях iptables є нова опція.

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
iptables: Bad rule (does a matching rule exist in that chain?).
# echo $?
1

# iptables -A INPUT -p tcp --dport 8080 --jump ACCEPT

# iptables -C INPUT -p tcp --dport 8080 --jump ACCEPT
# echo $?
0

Для старих версій iptables я б використовував пропозицію Garrett:

# iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"

12

Новий -Cваріант не є задовільним, оскільки він відкритий для перегонів час перевірки до часу використання (TOCTTOU). Якщо два процеси намагаються додати одне і те ж правило приблизно в один і той же час, -Cце не захистить їх від додавання його двічі.

Отже, це насправді не краще grepрішення. Точне завдання обробки тексту над висновком файлу iptables-saveможе працювати так само надійно -C, оскільки цей вихід є надійним оглядом стану таблиць.

Необхідний --ensureваріант, який атомно перевіряє та додає правило, лише якщо воно ще не існує. Більше того, було б непогано, якби правило було переміщено до правильної позиції, куди було б вставлено нове правило, якщо воно ще не існувало ( --ensure-move). Наприклад, якщо iptables -I 1воно використовується для створення правила на чолі ланцюга, але це правило існує вже в сьомому положенні, тоді існуюче правило повинне перейти до першого положення.

Без цих особливостей я думаю, що можливим вирішенням є написання циклу сценарію оболонки на основі цього псевдокоду:

while true ; do
  # delete all copies of the rule first

  while copies_of_rule_exist ; do
    iptables -D $RULE
  done

  # now try to add the rule

  iptables -A $RULE # or -I 

  # At this point there may be duplicates due to races.
  # Bail out of loop if there is exactly one, otherwise
  # start again.
  if exactly_one_copy_of_rule_exists ; then
    break;
  fi
done

Цей код може крутитися навколо; це не гарантує, що два або більше гонщиків вийдуть за фіксовану кількість ітерацій. Щоб допомогти в цьому, можна додати кілька випадкових сплячих показників.


1
Чи можу додати, що ця команда є досить незадовільною з тієї простої причини, що вам потрібно точно вказати спосіб додавання вашого правила. Я зробив тест зі своїм налаштуванням, і він не зміг знайти правило, тому що я не вказав точні ключові слова та значення ...
Фабієн Хаддаді,

Якщо ви тимчасово видалите правило, ви можете щось порушити ...
Мехрдад

5

Це може здатися трохи назад, але це працює для мене. Спробуйте спочатку видалити правило.

iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;

Ви повинні отримати повідомлення, подібне до:

iptables: Неправильне правило (чи існує відповідне правило у цьому ланцюжку?)

Потім просто додайте своє правило як звичайне:

iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;


1
Відкриття небажаного отвору у вашому брандмауері просто для імітації ідентичної команди, можливо, не чудова ідея. Звичайно, отвір призначене бути тимчасовим, але воно все одно покращує шанси нападника. І якщо щось перериває додавання правила заміни, то отвір може зберігатися нескінченно.
sampablokuper

Хороший момент @sampablokuper: ця стратегія, ймовірно, підходить тільки для правил ACCEPT, а не для DROP, з міркувань безпеки
lucaferrario

Я закінчила робити те саме!
warhansen

4

Просто перерахуйте та шукайте його?

iptables --list | grep $ip

... або, проте, у вас вказане правило. Якщо ви користуєтесь grep -qцим, нічого не виведе, і ви можете просто перевірити значення повернення за допомогою$?


3
Я б запропонував iptables-save|grep $ipнатомість, оскільки це формат, що легко розбирається, особливо в сценарії. Ви також можете перевірити точний синтаксис команди, якщо хочете.
Гаррет

1
Жоден із них насправді не дає відповіді на це запитання, оскільки iptables-save|grep $ipміг би дуже добре відповідати численним правилам. Можливо, iptables-saveможна було б перевірити повну специфікацію правила, але це все-таки трохи зламано: формат, що повертається, iptables-saveможе не відповідати точно правилу в сценарії. iptables-saveможе генерувати параметри в іншому порядку, додавати речі (наприклад -m tcp) тощо.
larsks

Майте на увазі, що iptables --listспробують вирішити відомі порти. Тому переконайтесь у цьому перед тим, як приступити до порту.
Фаб'єн Хаддаді


0

Щоб уникнути дублювання правил зі свого сценарію, додайте нижче рядка.

iptables -C -INPUT -p tcp --dport 8080 --jump ACCEPT || iptables -A -INPUT -p tcp --dport 8080 --jump ACCEPT

Перший раз, коли виконується команда вище, ми спостерігаємо нижче повідомлення

iptables: Неправильне правило (чи існує відповідне правило у цьому ланцюжку?).

Це лише для інформації. Але друга половина команди забезпечить додавання правила.

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