今天早上我醒来发现这是来自俄罗斯的拒绝服务 (DOS) 攻击。他们从几十个 IP 块中攻击我。他们必须拥有大量 IP 或某种代理列表/服务。每次我屏蔽一个IP,就会弹出另一个IP。最后,我寻找了一个脚本,发现我需要编写自己的解决方案。以下内容有点激进,但他们将我的 TOP LOAD LEVEL 运行到 200 以上。
这是我编写的用于实时阻止 DOS 的快速脚本。
cat **"output of the logs"** | php ipchains.php **"something unique in the logs"**
==> PHP 脚本:
<?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.