Как сделать так, чтобы правила iptables истекали?

18

Кто-то сказал мне, что это возможно, но я не могу найти ничего на страницах Google или man.

Мне нужно заблокировать IP-адреса на определенное время, а затем автоматически разблокировать.

HappyDeveloper
источник

Ответы:

18

Если вы хотите, чтобы iptables полностью удалил правило, вы не сможете это сделать, насколько я знаю. Какова цель этого? Если вам нужен какой-то автоматический временный бан, стандартное решение - fail2ban .

В качестве альтернативы вы можете использовать задание cron, чтобы удалить добавляемое правило, или, лучше, если вы хотите сделать это в интерактивном режиме, atзадание:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Также взгляните на recentмодуль iptables. Это с его --secondsопцией может помочь, в зависимости от ваших реальных потребностей. man iptablesЧтобы получить больше информации.

Эдуардо Иванец
источник
Ух ты, "на" работа выглядит великолепно. Могу ли я совместить это с nohup и &? Как?
HappyDeveloper
Нет необходимости использовать nohup - задание at выполняется независимо от терминала, который вы использовали для его создания. Это означает, что он запускается в оболочке, которая, кстати, не наследует переменные среды, и это /bin/shпо умолчанию. Но это, вероятно, не будет проблемой в этом случае.
Эдуардо Иванец
9

Добавьте в правила комментарий с отметкой времени (вероятно, секунды с начала эпохи). Периодически сканируйте просроченные правила.

Обратите внимание, что самое последнее ядро ​​Linux поддерживает динамическую загрузку IP-адресов в кэш, к которому применяются правила iptable вместо прямых правил iptables.

Пример:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Вы можете, конечно, iptables -D INPUT $1вместо печати команды.

Сет Робертсон
источник
отличная идея. Хотя я не уверен, как это сделать, я подумаю ...
HappyDeveloper
+1 Очень хорошая идея, может быть, не самая простая, но определенно аккуратная.
Кайл Смит
1
@HappyDeveloper: Приведенный пример для добавления / развертки
Сет Робертсон
1
Ха-ха, я просто должен был сделать это, я использовал awk для своей очистки: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'где правила сделаны как:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Кайл Смит
Мои 2 цента в Perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
Туомассало
5

В iptables есть метод автоматического добавления IP-адресов в список, если выполняются определенные пользователем условия. Я использую следующее, чтобы избежать автоматических попыток взлома моего порта ssh:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Это помогает ограничить автоматические попытки получить доступ к серверу, ограничивая попытки подключения с одного и того же IP-адреса каждые 60 секунд.

Если вы хотите разрешить заданное количество попыток за определенный промежуток времени, например 4 за 5 минут, а в случае сбоя затем занести их в черный список на более длительный период, например, 24 часа, вы можете сделать что-то вроде:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

Выше мы создаем 2 цепочки; "ssh" и "black" и 2 списка; «таймер» и «черный список».

Кратко; последняя цепь, показанная выше, является «дверным проемом» в цепи ssh.

  • Правило 1 в цепочке ssh проверяет, находится ли исходный IP в списке «черный список». Если это так, соединение разрывается и 24-часовой таймер черного списка перезапускается. Если правило 1 ложно, то мы переходим к правилу 2.
  • Правило 2 в цепочке ssh проверяет, не сделал ли исходный IP более 4 попыток подключения за 5 минут. Если это так, он отправляет пакет в цепочку «черный», где он добавляется в список «черный список». Цепочка «черная», затем УДАЛЯЕТ соединение, и все готово.
  • Правило 3 в цепочке "ssh" достигается только в том случае, если правила 1 и 2 ложные. Если это так, пакет ПРИНЯТ и IP-адрес источника добавляется в список «таймер», чтобы мы могли отслеживать частоту попыток подключения.

Параметр «--reap» указывает ядру выполнить поиск в списке и очистить все элементы, которые старше установленного ограничения по времени; 5 минут для списка «таймер» и 24 часа для списка «черный список».

примечание: дополнительные пробелы предназначены для удобства чтения и являются необязательными в вашем сценарии оболочки.

лощина
источник
3

IPTables имеет функцию, специально предназначенную для этого: IP Set. Вы делаете правило один раз, и оно сохраняется как обычно, но оно проверяет набор ips (или портов) на совпадения. Круто то, что этот набор можно динамически и эффективно обновлять, не мешая остальной части брандмауэра.

Основной сайт , примеры .

Таким образом, чтобы использовать его, вам все равно придется использовать atили cronзапланировать удаление.

Аллен
источник
2

Вы можете использовать fail2ban, чтобы запретить IP-адреса и настроить время, за которое адрес будет заблокирован.

user9517 поддерживаемый GoFundMonica
источник
2

Как кто-то уже сказал: вы должны использовать ipset для этой функции.

ipset может добавить IP-адрес со значением времени ожидания. По истечении времени ожидания запись будет автоматически удалена из ipset.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Это предпочтительный способ контролировать это поведение.

Navern
источник
0

Мне нужно заблокировать IP-адреса на определенное время, а затем автоматически разблокировать.

Вы можете попробовать следующий

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
источник