Кто-то сказал мне, что это возможно, но я ничего не могу найти в Google или на страницах руководства.
Мне нужно заблокировать IP-адреса на определенное время, а затем автоматически разблокировать.
Если вы хотите, чтобы 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
Чтобы получить больше информации.
Поместите комментарий с отметкой времени (возможно, секунды с начала эпохи) в правилах. Периодически проверяйте просроченные правила.
Обратите внимание, что самое последнее ядро 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
вместо печати команды.
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» и «черный» и 2 списка; «таймер» и «черный список».
Вкратце; последняя показанная выше цепочка является «дверным проемом» в цепочку ssh.
Параметр «--reap» указывает ядру выполнить поиск по списку и удалить все элементы, которые старше установленного ограничения по времени; 5 минут для списка «таймер» и 24 часа для списка «черный список».
примечание: дополнительные пробелы предназначены для удобства чтения и не являются обязательными в вашем сценарии оболочки.
IPTables имеет особенность, созданную специально для этого: IP Set. Вы создаете правило один раз, и оно сохраняется, как обычно, но проверяет набор IP-адресов (или портов) на совпадения. Замечательно то, что этот набор можно динамически и эффективно обновлять, не мешая остальной части брандмауэра.
Главный интернет сайт, Примеры.
Итак, чтобы использовать его, вам все равно придется использовать at
или cron
чтобы запланировать удаление.
Ты можешь использовать fail2ban для запрета IP-адресов и настройки продолжительности блокировки адреса.
Как кто-то уже сказал: для этой функции вы должны использовать 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
Это предпочтительный способ контролировать такое поведение.
Мне нужно заблокировать IP-адреса на определенное время, а затем автоматически разблокировать.
Вы можете попробовать следующий
# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
В зависимости от того, что именно вы хотите выполнить, либо сетевой фильтр недавний или для этого можно использовать временные модули.
Оба задокументированы в страница руководства iptables.