[mysqld] local-infile=1 # load data # : max_heap_table_size=1024M tmp_table_size=1024M
UPDATE `mysql`.`user` SET `File_priv` = 'Y' WHERE `user`.`Host` = 'localhost' AND `user`.`User` = '__'; flush privileges;
tmpfs /var/log/ram_disk tmpfs size=1024m 0 0
mkdir /var/log/ram_disk mount -t tmpfs -o size=1024m tmpfs /var/log/ram_disk
# log_format ddos_log '$remote_addr\t$msec\t$status'; # location =/styles/1347283218/highlight.css { access_log /var/log/ram_disk/hook_access.log ddos_log; } # location ~* ^.+\.(class|htc|bmp|cur|jpg|jpeg|gif|png|svg|xls|doc|xhtml|js|css|mp3|ogg|mpe?g|avi|flv|zip|gz|bz2?|rar|ico|txt|jar|swf)$ { access_log off; } # location / { access_log /var/log/ram_disk/dynamic_access.log ddos_log; }
CREATE TABLE `dinamic_log` ( `inc` bigint(20) NOT NULL AUTO_INCREMENT, `remote_addr` varchar(20) NOT NULL DEFAULT '0', `time_local` int(20) NOT NULL DEFAULT '0', `status` int(4) NOT NULL DEFAULT '0', PRIMARY KEY (`inc`), KEY `remote_addr` (`remote_addr`), KEY `time_local` (`time_local`) ) ENGINE=MEMORY AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
CREATE TABLE `hook_log` ( `inc` bigint(20) NOT NULL AUTO_INCREMENT, `remote_addr` varchar(20) NOT NULL DEFAULT '0', `time_local` int(20) NOT NULL DEFAULT '0', `status` int(4) NOT NULL DEFAULT '0', PRIMARY KEY (`inc`), KEY `remote_addr` (`remote_addr`), KEY `time_local` (`time_local`) ) ENGINE=MEMORY AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
CREATE TABLE `white` ( `remote_addr` bigint(20) NOT NULL, PRIMARY KEY (`remote_addr`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE `black` ( `remote_addr` bigint(20) NOT NULL, `time_local` int(20) NOT NULL DEFAULT '0', PRIMARY KEY (`remote_addr`), KEY `time_local` (`time_local`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
// $dinamic_log = $argv[1]; // $hook_log = $argv[2]; // - , . $r_stop = $argv[3]; // ( ) $load_time = $argv[4]; // $wait_sec = $argv[5]; function load_log($log, $table) { $tmp = '/var/log/ram_disk/tmp_ddos_file'; // copy ($log, $tmp); // file_put_contents($log, "", LOCK_EX); // mysql_query('LOAD DATA CONCURRENT INFILE "'.$tmp.'" IGNORE INTO TABLE '.$table.' FIELDS TERMINATED BY \'\t\' (`remote_addr`, `time_local`, `status`) SET `remote_addr` = INET_ATON(`remote_addr`)'); // unlink($tmp); } // while (true) { // load_log($dinamic_log, 'dinamic_log'); // load_log($hook_log, 'hook_log'); // . nginx $status, 200 304 . $res = mysql_query('SELECT dinamic_log.remote_addr FROM `dinamic_log` WHERE (`status` = 200 OR `status` = 304) AND`remote_addr` NOT IN (SELECT `remote_addr` FROM `hook_log`) AND`remote_addr` NOT IN (SELECT `remote_addr` FROM `white`) GROUP BY `remote_addr` HAVING count(inc)>'.$r_stop); while ($row = mysql_fetch_array($res)) { // ip mysql_query('INSERT INTO black(`remote_addr`) VALUES ('.$row['remote_addr'].')'); // ip switch (PHP_OS) { case "FreeBSD": system('/sbin/route add -host '.$row['remote_addr'].' 127.0.0.1 -blackhole'); break; case "Linux": system('/sbin/ip route add blackhole '.long2ip($row['remote_addr'])); break; } } // mysql_query('DELETE FROM `log` WHERE `time_local` < (UNIX_TIMESTAMP() - '.$load_time.')'); // sleep($wait_sec); }
php ddoshook.php /var/log/ram_disk/dynamic_access.log /var/log/ram_disk/hook_access.log 5 300 3
$block_time = $argv[1]; // ip. $res = mysql_query('SELECT `remote_addr` FROM black WHERE time_local < (UNIX_TIMESTAMP() - '.$block_time.')'); while ($row = mysql_fetch_array($res)) { // ip switch (PHP_OS) { case "FreeBSD": system('/sbin/route delete '.$row['remote_addr']); break; case "Linux": system('/sbin/ip route delete '.long2ip($row['remote_addr'])); break; } }
* * * * * /usr/bin/php unban.php 86400
Source: https://habr.com/ru/post/151420/
All Articles