рдХреНрд▓рд╛рд╕рд┐рдХ HTTP DDoS рд╕реЗ рдмрдЪрд╛рд╡ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛

рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдмреЙрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдХрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рдмреЙрдЯ рдкреЗрдЬ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП habrahabr.ru/search ред рдмреЙрдЯ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреЗрдЬ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ, рд▓рд┐рдкрд┐рдпреЛрдВ, рд╕реАрдПрд╕рдПрд╕, рдЖрджрд┐ рдХреЛ рдХреИрд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд▓реЙрдЧ / рдФрд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд / рдЦреЛрдЬ / рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдХреЛрдИ рдЬреАрд╡рд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ habrahabr.ru/search рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ / рдЦреЛрдЬ / рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЪрд┐рддреНрд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╕реАрдПрд╕рдПрд╕, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред

рд╕рдорд╛рдпреЛрдЬрди


mysql


/etc/my.cnf
[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; 

sysctl


рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде sysctl.conf рд╡рд┐рд╕реНрддрд╛рд░ (рд▓рд┐рдирдХреНрд╕)

рд░рд╛рдо рдбреНрд░рд╛рдЗрд╡


рдирдЧреАрди рд▓реЙрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдо рдбреНрд░рд╛рдЗрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдлрд╝рд╛рдЗрд▓ / etc / fstab рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 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 


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо



1. рдЯреНрд░реИрдк рдЪрдпрди


рдЬрдм рдЖрдк рд╕реНрдкреАрдХрд░ рдХреЗ рдХрд┐рд╕реА рднреА рдкреГрд╖реНрда рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░ рдФрд░ рд╡рд┐рдиреАрдд рдлрд╝рд╛рдЗрд▓ (рдЪрд┐рддреНрд░, css, js, рдЖрджрд┐) рдХреЛ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП habrahabr.ru/styles/fontello/css/habr.css
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЧреИрд░-рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд <? php echo '/styles/fontello/css/habr.css?? рд░реИрдВрдб (99999999)?> рдЬреИрд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝реЗрдВред
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдУрдкреЗрд░рд╛ 1 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдХреИрд╢ рдореЗрдВ рдЪрд┐рддреНрд░ рдбрд╛рд▓рддрд╛ рд╣реИ, 5 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдПрд╕ / рдЬреЗрдПрд╕ред

2. рд╣рдо nginx рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ


 #      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; } 


3. рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ


рдЗрдВрдЬрди = рдореЗрдореЛрд░реА - рдЗрд╕реЗ рддреЗрдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
 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 


4. рдореБрдЦреНрдп рд▓рд┐рдкрд┐


рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдпрд╣ php рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рд▓рдЧрднрдЧ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИред рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдПред

 //    $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 


5. рдЕрдирдмрди


 $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 


рдмрд╕, рдмреЙрдЯреНрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ:


upd

рдЦреЛрдЬ рдмреЙрдЯ рдХрд╛ рдЖрдИрдкреА рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ?


  1. рд╣рдо рд╡рд╛рдВрдЫрд┐рдд рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдПрдПрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ: bgp.potaroo.net/cidr/autnums.html
  2. AS рдХреЗ рд▓рд┐рдП IP рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛: stat.ripe.net/data/annulate-prefixes/data.json?resource=AS15169

рдПрдПрд╕ рдФрд░ рдЖрдИрдкреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдкрдбреЗрдЯ 2

OS: FreeBSD 8.3
CPU: E5-2620 2.00GHz

рдкрд░реАрдХреНрд╖рдг 1


рдкрдВрдХреНрддрд┐рдпрд╛рдБ (dinamic_log): 100,000 (100,000 HTTP-рдЕрдиреБрд░реЛрдз рд╕рд╛рдЗрдЯ рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреЗ рд▓рд┐рдП 3 рд╕реЗрдХрдВрдб рдореЗрдВ)
рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рд╣реБрдХ_рд▓реЙрдЧ): 1000 (3 рд╕реЗрдХрдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ 1000 рд╡реИрдз рдЕрдиреБрд░реЛрдз)

# php /root/scripts/php/imgtest/ddos_hook.php/tmp/d20.log/tmp/h20.log 5 300 3
рд▓реЛрдб рдбреЗрдЯрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛: 0.29 рд╕реЗрдХрдВрдбред
рд▓реЛрдб рдбреЗрдЯрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛: 0.003 рд╕реЗрдХрдВрдбред
рдЪрдпрдирд┐рдд рд╕рдордп рдмреАрдд рдЧрдпрд╛: 0.017 рд╕реЗрдХрдВрдбред
рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рдкреНрд░рддрд┐рдмрдВрдз): рез 1800режреж
рдкреВрд░реНрдг рдкреБрдЯреА рд╕рдордп рдмреАрдд рдЧрдпрд╛: 0.313 рд╕реЗрдХрдВрдбред

рдкрд░реАрдХреНрд╖рдг реи


рдкрдВрдХреНрддрд┐рдпрд╛рдБ (dinamic_log): 1,000,000 (3 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреЗ рд▓рд┐рдП 1 рдорд┐рд▓рд┐рдпрди http-request)
рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рд╣реБрдХ_рд▓реЙрдЧ): 10,000 (3 рд╕реЗрдХрдВрдб рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ 10,000 рд╡реИрдз рдЕрдиреБрд░реЛрдз)

# php /root/scripts/php/imgtest/ddos_hook.php/tmp/d2.log/tmp/h2.log 5 300 3
рд▓реЛрдб рдбреЗрдЯрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛: 2.878 рд╕реЗрдХрдВрдбред
рд▓реЛрдб рдбреЗрдЯрд╛ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛: 0.023 рд╕реЗрдХрдВрдбред
рдЪрдпрдирд┐рдд рд╕рдордп рдмреАрдд рдЧрдпрд╛: 0.501 рд╕реЗрдХрдВрдбред
рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рдкреНрд░рддрд┐рдмрдВрдз): 12402
рдкреВрд░реНрдг рдкреБрдЯреА рд╕рдордп рдмреАрдд рдЧрдпрд╛: 3.54 рд╕реЗрдХрдВрдбред

рдкреБрдирд╢реНрдЪ
рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИред рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

Source: https://habr.com/ru/post/In151420/


All Articles