Агент пользователя блока IPTABLES

Я получаю DDoS БОТНЕТОМ Уведомления о ссылке на блог Wordpress, теперь я хочу заблокировать весь клиент, кто содержит Wordpress там Useragents. Например:

WordPress/4.0; http://vk.lokos.net; verifying pingback from 107.158.239.82

Я должен заблокироваться и для порта HTTP 80 и для порта HTTPS 443. Как я могу сделать это?

1
задан 10 May 2015 в 04:01
2 ответа

Первый: Вы не хотите делать это таким способом , как я описываю ниже.

Во-вторых: здесь ответ на очень похожую проблему http://spamcleaner.org/en/misc/w00tw00t.html . Передаю их решение именно на ваш вопрос. Существует модуль iptables string , который вы можете использовать для сопоставления с агентом браузера. Однако затем iptables будет проверять каждый пакет ... мы можем оптимизировать это с помощью модуля connmark . Я не пробовал, поэтому мой ответ - это только толчок в правильном направлении:

<other rules>
iptables -t mangle -A PREROUTING -m connmark --mark 0xBAD1 -j DROP
iptables -t mangle -A PREROUTING -m connmark --mark 0xBAD0 -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m string --string "User-Agent: " -j CHECK_UAGENT
iptables -t mangle -A CHECK_UAGENT -m string --string "User-Agent: WordPress/4.0" -j CATCH
iptables -t mangle -A CHECK_UAGENT -j CONNMARK --set-xmark 0xBAD0
<otherrules>
iptables -t mangle -N CATCH 
iptables -t mangle -A CATCH -j LOG --log-level alert --log-prefix "WordPress attack "
iptables -t mangle -A CATCH -j CONNMARK --set-xmark 0xBAD1
iptables -t mangle -A CATCH -j DROP

Вот идея. Модуль connmark и связанная с ним цель пометят пакет по вашему желанию, и любые последующие пакеты в этом потоке подключения будут помечены аналогичным образом. Итак, мы ищем пакеты, направляющиеся к порту 80 и имеющие строку «User Agent». Если у них есть нежелательный пользовательский агент, мы отмечаем его как 0xBAD1 - убирая его. Затем мы регистрируем это и бросаем. В противном случае, как только мы видим «Пользовательский агент», но не нежелательный, он попадает в белый список с 0xBAD0. Добавляя его в белый список, мы уменьшаем нагрузку на инспектор пакетов (это этап оптимизации). В противном случае мы будем искать в каждом пакете каждого загруженного изображения - бессмысленная трата.

** Почему вышеперечисленное - плохая идея ** Первое: HTTPS не может быть декодирован на уровне пакетного фильтра. Два: потому что возможна DDOS-атака с указанным выше. Соединение запускается, открывает соединение на вашем веб-сервере, затем исчезает (с точки зрения вашего веб-сервера). Он будет ждать долгое время, прежде чем откажется от клиента, которому больше не разрешено проходить пакеты. Между тем будет еще больше попыток. В конце концов, у HTTP закончатся ресурсы, и запросы не пройдут. (Один из способов решить эту проблему - использовать модуль недавний . Более тщательный способ - это настроить процесс, отслеживающий файл журнала на предмет «атаки WordPress», запоминая удаленный IP-адрес и порт, либо принудительно соединение, которое должно быть закрыто с помощью резака , или перекрестная ссылка на это соединение с связанным с ним PID сервера и затем прекращение этого процесса.)

аналогичный вопрос был задан и дан ответ with: использовать обратный прокси. Это лучший вариант, но он требует большой переконфигурации и, возможно, промежуточного сервера.

Вместо этого сделайте это так. Используйте mod_rewrite (в Apache / * ngnx) для сопоставления строки User-Agent, установите переменную среды для ведения журнала и верните статус ошибки 403. Это закрывает удаленную сторону. Теперь, чтобы сделать его более постоянным, создайте отдельный процесс, отслеживающий этот файл журнала для таких сброшенных подключений, и добавьте удаленный IP-адрес в таблицу недавний , из которой iptables будет отбрасывать новые подключения в течение следующих 5 минут. Итак ...

# Apache config
RewriteCond %{HTTP_USER_AGENT}  ^WordPress/4\.0
RewriteRule - [L,R=403,E=WordPress]
LogFormat "%t\t%a\t%{remote}p\t%{User-Agent}i"
CustomLog wordpress wordpress.log env=WordPress

Пользовательский формат журнала упрощает декодирование нашим внешним процессом. В IPtables - это всего лишь одно правило:

iptables -A INPUT --syn -m recent --name WordPress --rcheck --seconds 300 -j DROP

и внешний процесс (работающий как root) выглядит так:

#!perl 
open(STDIN,"tail -f /var/log/http/wordpress.log|")
while (<>) {
   my ($time,$ip,$port,$useragent)=split('\t');
   open(RECENT,"> /proc/net/xt_recent/WordPress")
   print RECENT "+$ip\n"
   close RECENT
}

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

4
ответ дан 3 December 2019 в 17:05

Выполнение следующих команд блокирует эту конкретную атаку:

iptables -N Wordpress-PingVerify
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /' -j Wordpress-PingVerify
iptables -A Wordpress-PingVerify -p tcp --dport 80 -m string --to 80 --algo bm ! --string 'User-Agent: WordPress/' -j RETURN
iptables -A Wordpress-PingVerify -p tcp --dport 80 -m string --to 300 --algo bm --string 'verifying pingback from' -j DROP
iptables -A Wordpress-PingVerify -j RETURN

Приведенные выше правила предполагают, что атака предназначена на HTTP (порт 80).

В качестве альтернативы вы можете использовать эти правила для блокировки ВСЕХ запросов pingback WordPress - это заблокирует не только проверки pingback, но также pingbacks:

iptables -N Wordpress-PingBacks
iptables -I INPUT -p tcp --dport 80 -m string --to 70 --algo bm --string 'GET /' -j Wordpress-PingBacks
iptables -A Wordpress-PingBacks -p tcp --dport 80 -m string --to 80 --algo bm ! --string 'User-Agent: WordPress/' -j RETURN
iptables -A Wordpress-PingBacks -p tcp --dport 80 -j DROP
iptables -A Wordpress-PingBacks -j RETURN

Источник: https: / /sysadminblog.net/2016/05/blocking-wordpress-pingback-verification-ddos/[1212 impression

1
ответ дан 3 December 2019 в 17:05

Теги

Похожие вопросы