IPTABLES 阻止用户代理

use*_*461 2 iptables ddos flooding

我通过 Wordpress Pingback BOTNET 受到 DDoS,现在我想阻止Wordpress其中包含用户代理的所有客户端。例如:

WordPress/4.0; http://vk.lokos.net; verifying pingback from 107.158.239.82
Run Code Online (Sandbox Code Playgroud)

我需要阻止 HTTP 端口 80 和 HTTPS 端口 443。我该如何执行此操作?

Oth*_*eus 5

第一:你不想这样做,正如我在下面描述的那样。

第二:这里回答了一个非常类似的问题http://spamcleaner.org/en/misc/w00tw00t.html。我正在转达他们对您的具体问题的解决方案。有一个 iptablesstring模块,您可以使用它来匹配浏览器代理。然而,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
Run Code Online (Sandbox Code Playgroud)

这是我的想法。模块connmark和关联的目标将根据您的意愿标记数据包,并且该连接流中的任何后续数据包都将被类似地标记。因此,我们寻找前往端口 80 并具有“用户代理”字符串的数据包。如果他们有不需要的用户代理,我们将其标记为 0xBAD1——将其列入黑名单。然后我们记录它并删除它。否则,一旦我们看到“用户代理”但不是不需要的用户代理,它就会被列入白名单,并带有 0xBAD0。通过将其列入白名单,我们减少了数据包检查器的负载(这是一个优化步骤)。否则,我们将在每张上传图片的每个数据包中进行搜索——这是毫无意义的浪费。

** 为什么上述是一个坏主意** 一:HTTPS 无法在数据包过滤器级别进行解码。二:因为上述的DDOS攻击是可能的。连接开始,在您的网络服务器上打开一个连接,然后消失(从您的网络服务器的角度来看)。它会等待很长时间,然后放弃不再允许再接收任何数据包的客户端。与此同时,还会有更多的尝试。最终,HTTP 将耗尽资源并且没有请求通过。(解决该问题的一种方法是使用该模块。更彻底的方法是让一个进程监视“WordPress 攻击”的日志文件,让它记下远程 IP 和端口,然后使用cuterrecent强制关闭连接,或交叉引用该连接与与其关联的服务器 PID,然后终止该进程。)

提出了类似的问题并回答了:使用反向代理。这是最好的选择,但需要大量的重新配置,可能还需要一个干预服务器。

使用mod_rewrite(在 Apache/*ngnx 中)来匹配 User-Agent 字符串,设置用于日志记录的环境变量,并返回 403 错误状态。这会关闭远程端。现在,为了使其更持久,有一个单独的进程监视该日志文件以查找此类已删除的连接,并将远程 IP 添加到表中recent,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
Run Code Online (Sandbox Code Playgroud)

自定义日志格式使我们的外部进程更容易解​​码。IPtables 只是一条规则:

iptables -A INPUT --syn -m recent --name WordPress --rcheck --seconds 300 -j DROP
Run Code Online (Sandbox Code Playgroud)

外部进程(以 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
}
Run Code Online (Sandbox Code Playgroud)

时间戳和用户代理字符串只是为了让您可以验证事情是否按您的预期工作/不工作。我要补充的是,通过 mod-rewrite 的处理方式,您可以更灵活地拒绝/禁止哪些内容。