Подтвердить что ты не робот

Как я могу программно управлять правилами iptables на лету?

Мне нужно запросить существующие правила, а также легко добавлять и удалять правила. Я не нашел API для этого. Есть что-то, что мне не хватает?

Ближе всего я пришел к решению, используя iptables-save | iptables-xml для запроса и ручного вызова самой команды iptables для добавления/удаления правил. Другое решение, которое я рассмотрел, - это просто регенерировать весь набор правил из моей базы данных приложений и очистить всю цепочку, а затем снова применить ее. Но я хочу избежать этого, так как я не хочу отказываться от каких-либо пакетов - если нет способа атомизировать это. Мне интересно, есть ли лучший способ.

API в C будет отличным; однако, поскольку я планирую построить это в автономной suid-программе, библиотеки, которые делают это на ЛЮБОЙ язык, тоже прекрасны.

4b9b3361

Ответ 1

Из часто задаваемые вопросы по сетевому фильтру:

Ответ, к сожалению, есть: Нет.

Теперь вы можете подумать: "а как насчет libiptc?". Как неоднократно отмечалось в списке рассылки, libiptc NEVER предназначался для использования в качестве открытого интерфейса. Мы не гарантируем стабильный интерфейс, и его планируется удалить в следующем воплощении фильтрации пакетов linux. libiptc слишком низкоуровневый, чтобы использовать его в любом случае.

Мы хорошо знаем, что для такого API существует фундаментальный недостаток, и мы работаем над улучшением этой ситуации. До тех пор рекомендуется либо использовать system(), либо открыть трубу в stdin iptables-restore. Последний даст вам лучшую производительность.

Ответ 2

Использование iptables-save и iptables-restore для запроса и регенерации правил - это самый эффективный способ сделать это. Они когда-то были сценариями оболочки, но теперь они являются программами C, которые работают очень эффективно.

Однако я должен отметить, что есть инструмент, который вы можете использовать, что упростит обслуживание iptables. Большинство динамических наборов правил - это одно и то же правило, повторяющееся много раз, например:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT

Вместо того, чтобы заменять эти правила каждый раз, когда вы хотите изменить, какие порты могут получить доступ к порту 22 (полезно, например, для детонации порта), вы можете использовать ipsets. Viz:

ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24

Наборы могут содержать IP-адреса, сети, порты, MAC-адреса и иметь тайм-ауты в своих записях. (Когда-либо хотелось добавить что-то на час?).

Существует даже атомный способ обмена одним набором с другим, поэтому обновление означает создание нового временного набора, а затем заменяет его как имя существующего набора.

Ответ 3

Вы можете использовать rfw, который является REST API для iptables. Он сериализует команды iptables из разных потенциально параллельных источников и удаленно запускает iptables на лету.

rfw предназначен для распределенных систем, которые пытаются обновить правила брандмауэра на нескольких блоках, но могут также запускаться на одной машине на локальном интерфейсе. Затем это позволяет избежать использования SSL и аутентификации, поскольку в этом случае он может выполняться в обычном HTTP-протоколе.

Пример команды:

PUT /drop/input/eth0/11.22.33.44

что соответствует:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP

Вы можете вставлять и удалять правила, а также запрашивать текущий статус, чтобы получить существующие правила в формате JSON:

GET /list/input

Отказ от ответственности: я начал этот проект. Это открытый источник по лицензии MIT.

Ответ 4

Насколько я понимаю (хотя ссылка не упоминает), iptables-restore является атомарным. В конце, когда строка COMMIT считывается, iptables вызывает iptc_commit в libiptc (который во внутреннем интерфейсе вы не должны использовать), который затем вызывает setsockopt(SO_SET_REPLACE) с вашими новыми наборами правил.

Это звучит так же атомно, как вы можете: с одним вызовом ядра. Однако более осведомленным сторонам предлагается оспаривать это.: -)

Изменить: Я могу подтвердить, что ваше описание верное. iptables-restore выполняется как атомная операция в ядре.

Чтобы быть более конкретным, операция "только" является атомарной для каждого процессора. Поскольку мы сохраняем весь блок правил на каждый процессор (из-за оптимизации кэширования).

Ответ 5

Умышленно нет API для управления этими правилами. Вы не должны этого делать. Или что-то.

Если вам нужны правила, которые достаточно динамичны, вы заботитесь о производительности выполнения /sbin/iptables, есть и другие способы сделать это:

  • Используя что-то вроде "недавнего" соответствия или соответствия ip-набора, вы можете добавлять/удалять IP-адреса из черно-белых списков без изменения набора правил.
  • Вы можете передавать пакеты в пользовательское пространство для фильтрации с помощью NFQUEUE

Ответ 6

Сегодня утром я проснулся, обнаружив, что получил нападение "Отказ в обслуживании" (DOS) из России. Они ударили меня из десятков блоков IP. У них должен быть либо большой пул IP-адресов, либо какой-то список/служба прокси. Каждый раз, когда я блокировал IP-адрес, появился еще один. Наконец, я искал script и нашел, что мне нужно написать собственное решение. Ниже приведена небольшая агрессия, но они выполняли мой TOP LOAD LEVEL до 200.

Вот быстрый script, который я написал, чтобы блокировать DOS в реальном времени.

cat  **"output of the logs"** | php ipchains.php **"something unique in the logs"**

== > PHP Script:

<?php

$ip_arr = array();

while(1)
{
   $line = trim(fgets(STDIN)); // reads one line from STDIN
   $ip = trim( strtok( $line, " ") );

   if( !array_key_exists( $ip, $ip_arr ) )
      $ip_arr[$ip] = 0;

   $regex = sprintf( "/%s/", $argv[1] );

   $cnt = preg_match_all( $regex, $line );

   if( $cnt < 1 ) continue;

   $ip_arr[$ip] += 1;

   if( $ip_arr[$ip] == 1  )
     {
//     printf( "%s\n", $argv[1] );
//     printf( "%d\n", $cnt );
//     printf( "%s\n", $line );

       printf( "-A BLOCK1 -s %s/24 -j DROP\n", $ip );

       $cmd = sprintf( "/sbin/iptables  -I BLOCK1  -d %s/24 -j DROP", $ip );
       system( $cmd );
     }
}

?>

Предположения:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output.

Ответ 7

Это пример использования bash и iptables для динамического блокирования хакеров, злоупотребляющих sshd на CentOS. В этом случае я настроил sshd для запрета ввода пароля (позволяет ключи). Я смотрю в /var/log/secure для записей "Bye Bye", что sshd вежливый способ сказать f-off...

IP=$(awk '/Bye Bye/{print $9}' /var/log/secure |
     sed 's/://g' |sort -u | head -n 1)

[[ "$IP" < "123" ]] || {

  echo "Found $IP - blocking it..." >> /var/log/hacker.log

  /sbin/iptables -A INPUT -s $IP -j DROP

  service iptables save

  sed -i "/$IP/d" /var/log/secure

}

Я запускаю это в цикле каждую секунду, или минуту, или то, что делает меня счастливым. Я проверяю значение $IP, чтобы проверить, что оно найдено полезное значение, поэтому я вызываю iptables, чтобы его удалить, и я использую sed для очистки файла журнала $IP, поэтому запись не добавляется снова.

Я делаю небольшую предварительную обработку (не показан) в белый список некоторых важных IP-адресов, которые всегда действительны и которые могут иметь проблемы с подключением (из-за ошибки пользователя).

Время от времени я сортирую список фильтров iptables и создаю IP-диапазоны из них (используя другой script - и, когда они проверяются, они обычно относятся к диапазонам IP из Индии, Китая и России). Таким образом, мой общий набор правил фильтрации iptables составляет от 50 до 500 записей; ipset на самом деле не сильно улучшает список, короткий.

Ответ 8

MarkR вправо, вы не должны это делать. Самый простой способ - вызвать iptables из script или написать конфигурацию iptables и "восстановить" ее.

Тем не менее, если вы хотите, прочитайте источник iptables. iptables использует совпадения и таблицы как общие объекты. Вы можете использовать источник или их.

В Linux netfilter также есть некоторые включенные файлы в /usr/include/netfilter *. Это несколько низкоуровневые функции. Это то, что использует iptables. Это похоже на API, так как можно получить без iptables.

Но этот API "грязный". Имейте в виду, что он предназначен для использования только с помощью iptables. Это не очень хорошо документировано, вы можете столкнуться с очень специфическими проблемами, API может довольно быстро измениться без каких-либо предупреждений, поэтому обновление будет разорвать ваш код и т.д.