Форум программистов, компьютерный форум, киберфорум
Наши страницы
anomal6
Войти
Регистрация
Восстановить пароль
Рейтинг: 3.00. Голосов: 2.

Защита от DoS глазами новичка или FREE защита

Запись от anomal6 размещена 11.02.2019 в 08:11

Это моя первая запись в блоге.

Небольшое отступление!
Форум очень большой. Не смог найти подходящего раздела, поэтому прошу модераторов отнестись с пониманием и в случае чего перенести тему в соответствующий раздел.
Поехали...
Больше полу года назад, работая в проектной компании, мы решили обзавестись собственным файлообменником с заказчиками. Почитав мануалы и статьи, я пришёл к выводу что будет логично развернуть собственное облако на Linux системе а именно Ubuntu 16.04.3LTS.
За основу я взял знаменитый ownCloud. Развернуть облако не составило никакого труда, всё легло как по маслу.
И наше облако начали активно использовать заказчики похлопывая в ладоши, и говоря как же это удобно.

Развернул я облако на связке Apache + PHP7.0 + MySQL. С этими "демонами" я уже встречался ранее, но как новичок, не имея плотного знакомства мне хватало справляться с поставленными задачами, да и плюс в интернете полным полно мануалов. Я говорю про (пример) изменение портов, подключение HTTPS, и т.п.

Но месяца 1,5 назад, с нашим облаком да и вообще с сетью, началась твориться магия. Облако периодически начало подвисать, то доступно то нет, сеть интернет тоже начала шалить. Первым делом я конечно же связался с провайдером, кто нас кормит интернетом. После многочисленных проверок мне сказали, мол все у вас в порядке, дело не в линии, а в вашем оборудовании. Ну ладно, пробуем методом исключений. Перезагружаем роутер, и о чудо, интернет появляется минут на 5 и снова такая вакханалия. Значит дело в другом. Посмотрев конфиги апача, ведь именно он отвечает за наше облако, я увидел что добавились какие то дополнительные конфиги. Я начал гуглить информацию, и как оказалось Apache обновился до версии 2.4.18 (видимо apt update сделал своё дело). Почитал как посмотреть ошибки
Код:
apache2 -t
и как их пофиксить. Вроде сделал, но проблема не ушла, а значит дело не в Апаче. Долго изучая конфиги, и читая статьи, понял что решать данную проблему придется изучая логи, лоооги, лоо-о-о-оги, о боже, только не их. Я в них нефига не понимаю и их так много. Но делать было нечего. Сел за изучение логов, пытаясь дойти до чего-нибудь логичного своим мозгом. Ну Вы представьте, за пол года читать логи, УЖАС!.

Но спустя N-ное количество времени я заметил подозрительную активность
Код:
[Mon Jun 18 21:25:29.021638 2018] [mpm_prefork:notice] [pid 3593] AH00163: Apache/2.4.18 (Ubuntu) configured -- resuming normal operations
[Mon Jun 18 21:25:29.021722 2018] [core:notice] [pid 3593] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jun 18 21:41:24.850827 2018] [mpm_prefork:notice] [pid 3593] AH00169: caught SIGTERM, shutting down
[Mon Jun 18 21:41:26.033616 2018] [mpm_prefork:notice] [pid 6733] AH00163: Apache/2.4.18 (Ubuntu) configured -- resuming normal operations
[Mon Jun 18 21:41:26.033694 2018] [core:notice] [pid 6733] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jun 18 21:43:17.328967 2018] [mpm_prefork:notice] [pid 6733] AH00169: caught SIGTERM, shutting down
[Mon Jun 18 21:43:18.443306 2018] [mpm_prefork:notice] [pid 7172] AH00163: Apache/2.4.18 (Ubuntu) configured -- resuming normal operations
[Mon Jun 18 21:43:18.443383 2018] [core:notice] [pid 7172] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jun 18 23:05:33.572588 2018] [:error] [pid 9356] [client 203.195.132.58:1905] script '/var/www/html/wuwu11.php' not found or unable to stat
[Mon Jun 18 23:05:34.055989 2018] [:error] [pid 9399] [client 203.195.132.58:1984] script '/var/www/html/xw.php' not found or unable to stat
[Mon Jun 18 23:05:34.570828 2018] [:error] [pid 9385] [client 203.195.132.58:2064] script '/var/www/html/xx.php' not found or unable to stat
[Mon Jun 18 23:05:35.084697 2018] [:error] [pid 8945] [client 203.195.132.58:2104] script '/var/www/html/s.php' not found or unable to stat
[Mon Jun 18 23:05:35.581628 2018] [:error] [pid 8863] [client 203.195.132.58:2210] script '/var/www/html/w.php' not found or unable to stat
[Mon Jun 18 23:05:36.048029 2018] [:error] [pid 9355] [client 203.195.132.58:2278] script '/var/www/html/db.init.php' not found or unable to stat
[Mon Jun 18 23:05:36.549565 2018] [:error] [pid 8856] [client 203.195.132.58:2452] script '/var/www/html/db_session.init.php' not found or unable to stat
[Mon Jun 18 23:05:37.046265 2018] [:error] [pid 9358] [client 203.195.132.58:2519] script '/var/www/html/sheep.php' not found or unable to stat
[Mon Jun 18 23:05:37.582546 2018] [:error] [pid 9354] [client 203.195.132.58:2629] script '/var/www/html/index.php' not found or unable to stat
[Mon Jun 18 23:05:43.230844 2018] [:error] [pid 9354] [client 203.195.132.58:2629] script '/var/www/html/mysql/index.php' not found or unable to stat
[Tue Jun 19 06:37:17.184153 2018] [:error] [pid 9400] [client 116.204.103.129:25543] script '/var/www/html/mysql/index.php' not found or unable to stat
[Tue Jun 19 11:44:15.078641 2018] [:error] [pid 8856] [client 223.105.4.250:17113] script '/var/www/html/index.php' not found or unable to stat
Вот так вот брут ищет уязвимости.
Запросил информацию по ip и удивился, ЧАЙНА.

Но так как я раньше не сталкивался с таким чудом, я создал тему на форуме, и спросил что это за активность.
Знающие гуру (СПАСИБО им больше) подтвердили мои догадки, это была DDOS АТАКА.
Дос атакой нас грузили на протяжении 1,5 месяца, заказчики нервничали, и начальство тоже, а моя пятная точка горела всё больше и больше.

Опять изучение статей. Разные попытки заглушить атаку не увенчались успехом.
Я пробовал на главной странице index.php методом геопризнака, переадресовывать клиентов не из России в попенгаген.
Страница index.php

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 include("country.php");
 $ip = $_SERVER['REMOTE_ADDR'];
 $geopoloj = strana($ip);
 switch ($geopoloj) {
  case "UA":
 $goLoc = "http://попенгаген.рф/redirect/ua.html";
 break;
  case "EU":
 $goLoc ="http://попенгаген.рф/redirect/eu.html";
 break;
  case "FR":
 $goLoc = "http://попенгаген.рф/redirect/fr.html";
 break;
 case "DE":
 $goLoc = "http://попенгаген.рф/redirect/de.html";
 break;
 case "CN":
 $goLoc = "http://попенгаген.рф/redirect/cn.html";
 break;
  case "RU":
 $goLoc = "index-verify.html";
 break;
   case "US":
 $goLoc = "http://попенгаген.рф/redirect/eu.html";
 break;
  default:
 $goLoc = "http://попенгаген.рф/redirect/eu.html";
 }
 header("location: $goLoc");
?>

А вот Инклуднутый country.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
 
function strana($ip){
    $fh = fopen(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tabgeo_country_v4.dat', 'rb');
    $iso = array('AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AW', 'AX', 'AZ',
            'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BR', 'BS',
            'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN',
            'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO', 'DZ', 'EC', 'EE',
            'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF',
            'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK', 'HM',
            'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM',
            'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC',
            'LI', 'LK', 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH', 'MK',
            'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA',
            'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG',
            'PH', 'PK', 'PL', 'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW',
            'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS',
            'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO',
            'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI',
            'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW', 'XA', 'YU', 'CS', 'AN', 'AA', 'EU', 'AP',
    );
    $tabgeo_bs = function($data_array, $ip, $step){
        $start = 0;
        $end   = count($data_array) - 1;
        while (true) {
            $mid    = floor(($start + $end) / 2);
            $unpack = $step ? unpack('Noffset/Cip/Ccc_id', "\x00$data_array[$mid]") : unpack('Cip/Ccc_id', $data_array[$mid]);
            if ($unpack['ip'] == $ip) return $unpack;
            if ($end - $start  <   0) return $ip > $unpack['ip'] ? $unpack : $unpack_prev;
            if ($unpack['ip']  > $ip) $end = $mid - 1; else $start = $mid + 1;
            $unpack_prev = $unpack;
        }
    };
 
    $ip_array = explode('.', $ip);
    fseek($fh, ($ip_array[0] * 256 + $ip_array[1]) * 4);
    $index_bin = fread($fh, 4);
    $index = unpack('Noffset/Clength', "\x00$index_bin");
    if($index['offset'] == 16777215) return $iso[$index['length']];
    fseek($fh, $index['offset'] * 5 + 262144);
    $bin = fread($fh, ($index['length'] + 1) * 5);
    $d = $tabgeo_bs(str_split($bin, 5), $ip_array[2], TRUE);
    if($d['offset'] == 16777215) return $iso[$d['cc_id']];
    if($ip_array[2] > $d['ip']) $ip_array[3] = 255;
    fseek($fh, -(($d['offset'] + 1 + $d['cc_id']) * 2), SEEK_END);
    $bin = fread($fh, ($d['cc_id'] + 1) * 2);
    $d = $tabgeo_bs(str_split($bin, 2), $ip_array[3], FALSE);
    return $iso[$d['cc_id']];
}

Но это поять же не помогло.

После долгих изучений, казался только один выход, поставить поверх Апача Nginx. Но вот только мозгов моих на это не хватит. Я новичок в этом.

Но мне попалась хорошая статься сравнений этих демонов
https://habr.com/post/267721/

И было принято решение полностью отказаться от apache.
Сделав резервную копию базы и сайта /var/www/html
Я поставил систему с нуля, и запустил на нём Nginx. Так же подключил php и mysql.
И тут началось самое интересное. Настройки

Часть 2...

После того как Nginx запущен и сделаны первоначальные настройки(они расписаны в любой статье), он никак не может распознать php.
В интернете полно статей о том как настроить конфиг.

Код:
location ~ \.php$ { 
		try_files $uri =404; 
		include /etc/nginx/fastcgi.conf;
		fastcgi_pass unix:/run/php/php7.0-fpm.sock; 

}
Данный код подключает php, но в следствии за ним ещё куча настроек, таких как время ожидания, Максимальный размер файла и прочих. Благо на ownCloud есть уже готовый пример, правда пришлось немного его править.
В итоге получил полностью рабочий конфиг который хранится в /etc/nginx/sites-avalible/default

СТРАШНЫЙ КОД КОФИГА
Код:
server {
listen 80;
server_name _;

      error_page 404 /custom_404.html;
location = /custom_404.html {
root /usr/share/nginx/html;
internal;
}

root /var/www/html;

access_log /var/log/nginx/ng.access.log;
error_log /var/log/nginx/ng.error.log;

index index.php index.html index.htm;

        error_page 403 /core/templates/403.php;
        error_page 404 /core/templates/404.php;



client_max_body_size 100M; # set max upload size
fastcgi_buffers 64 4K;

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
location / {
                # The following 2 rules are only needed with webfinger
                rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
                rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

                rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
                rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

                rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

                try_files $uri $uri/ index.php;
}
location ~ ^(.+?\.php)(/.*)?$ {
                try_files $1 =404;

                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$1;
                fastcgi_param PATH_INFO $2;
                fastcgi_keep_conn on;

                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

}


Теперь всё работает, и время распаковать ранее сохраненные бэкапы.
После того как я всё вернул на круги своя, сменив апач на нджикс, я решил оставить все как есть, проверить будет ли дос атака. И спустя время дос опять начался.

Ну раз я уже начитан, и знаю что дальше делать, я принялся менять конфиги и защищать себя от доса по геопризнаку.
Мне известно, что все наши клиенты из России, так же по логам я видел, что злоумышленник не просто караулит меня, а делает это с изыском. С помощью API сайта https://proxycheck.io/ гореть им в аду за это, я понимал, что клиентам из других стран нечего делать в нашем облаке.

А посему было принято решение на уровне демона определять страну и отсылать уже в выше упомянутою страну ПОПЕНГАГЕН.

Первым делом, вооружившись гайдам, я скачать от сюда http://www.maxmind.com/app/geolitecountry latest GeoLite Country Binary Format (это бесплатный вариант базы стран и соответствующих им блоков IP адресов).

Распаковываем архив и кидаем файл GeIP.dat в папку
Код:
/usr/local/etc/nginx/conf/geo
если такой папки нет, создайте её или их.
Далее нужно отредактировать файл /etc/nginx/nginx.conf
секцию http в любом месте секции, вписываем
Код:
geoip_country /usr/local/etc/nginx/conf/geo/GeoIP.dat; # подключаем GeIP базу
    map $geoip_country_code $bad_country { # модуль map создает переменные, значения которых зависят от других переменных, очень полезная штука
    	default 1; # значение по умолчанию
    	include /usr/local/etc/nginx/conf/geo/good_countries; # инклудим файл, его нужно будет создать чуть позже
    }
Этот блок map, означает, что все страны находящиеся в базе данных, являются запрещенными по умолчанию, а в файле good_countries, будут перечислены разрешенные страны.

Теперь в файл настроек (мой это ) /etc/nginx/sites-avalible/default вписываем после
Код:
server {
	listen       IP:80;
	server_name  testhost.com;
вот этот код
Код:
if ($bad_country){ # если данная переменная установлена, то есть если страна не перечислена в файле good_countries
		return 444; # выдаем клиенту пустой ответ ( незачем отдавать 403 ошибку или еще какую-либо )
	}
Теперь создадим "тот файл", если хотяб краем глазом смотрели что вписываете, то увидели подключаемый файл
good_countries. Создаем его в директории /usr/local/etc/nginx/conf/geo/
И вписываем значения
Код:
UZ 0;
RU 0;
То есть тем самым разрешая вход на ваш сервер Узбекам и Русским. Ограничивать, точнее разрешать можно кому угодно, страны по двум буквам можно найти в гугле.
После того как все сделали, просто перезагружаем демон nginx.
Ну и собсно проверяем, зайдём через какой-нибудь веб прокси. И о чудо! действительно! Всё работает как надо.
Плюсом в корне сайта оставил php код который тоже смотрит по геопризнаку, и моментально отправляет на страницу с информацией и JS хитрой но не надёжной капчёй + предварительно буду записывать тех кто оказался в корне сайта.

Вот мой index.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
 include("country.php"); //этот файл уже расписан выше
 $ip = $_SERVER['REMOTE_ADDR'];
 $geopoloj = strana($ip);
 switch ($geopoloj) {
  case "UA":
 $goLoc = "http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/ua.html";
 break;
  case "EU":
 $goLoc ="http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/eu.html";
 break;
  case "FR":
 $goLoc = "http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/fr.html";
 break;
 case "DE":
 $goLoc = "http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/de.html";
 break;
 case "CN":
 $goLoc = "http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/cn.html";
 break;
  case "RU":
 $goLoc = "index-verify.html"; // тут логика, если страна разрешена, моментально переадресовывем на страницу
 break;
   case "US":
 $goLoc = "http://ТУТ_МОЙ_САЙТ_РЕДИРЕКТА/redirect/eu.html";
 break;
  default:
 $goLoc = "index-verify.html"; // тут логика, если страны нет в списке, значит она разрешена, моментально переадресовывем на страницу
 }
 header("location: $goLoc");
 
 
 $user_agent = $_SERVER['HTTP_USER_AGENT'];
 
function getOS() { 
 
    global $user_agent;
 
    $os_platform  = "Unknown OS Platform";
 
    $os_array     = array(
                          '/windows nt 10/i'      =>  'Windows 10',
                          '/windows nt 6.3/i'     =>  'Windows 8.1',
                          '/windows nt 6.2/i'     =>  'Windows 8',
                          '/windows nt 6.1/i'     =>  'Windows 7',
                          '/windows nt 6.0/i'     =>  'Windows Vista',
                          '/windows nt 5.2/i'     =>  'Windows Server 2003/XP x64',
                          '/windows nt 5.1/i'     =>  'Windows XP',
                          '/windows xp/i'         =>  'Windows XP',
                          '/windows nt 5.0/i'     =>  'Windows 2000',
                          '/windows me/i'         =>  'Windows ME',
                          '/win98/i'              =>  'Windows 98',
                          '/win95/i'              =>  'Windows 95',
                          '/win16/i'              =>  'Windows 3.11',
                          '/macintosh|mac os x/i' =>  'Mac OS X',
                          '/mac_powerpc/i'        =>  'Mac OS 9',
                          '/linux/i'              =>  'Linux',
                          '/ubuntu/i'             =>  'Ubuntu',
                          '/iphone/i'             =>  'iPhone',
                          '/ipod/i'               =>  'iPod',
                          '/ipad/i'               =>  'iPad',
                          '/android/i'            =>  'Android',
                          '/blackberry/i'         =>  'BlackBerry',
                          '/webos/i'              =>  'Mobile'
                    );
 
    foreach ($os_array as $regex => $value)
        if (preg_match($regex, $user_agent))
            $os_platform = $value;
 
    return $os_platform;
}
 
function getBrowser() {
 
    global $user_agent;
 
    $browser        = "Unknown Browser";
 
    $browser_array = array(
                            '/msie/i'      => 'Internet Explorer',
                            '/firefox/i'   => 'Firefox',
                            '/safari/i'    => 'Safari',
                            '/chrome/i'    => 'Chrome',
                            '/edge/i'      => 'Edge',
                            '/opera/i'     => 'Opera',
                            '/netscape/i'  => 'Netscape',
                            '/maxthon/i'   => 'Maxthon',
                            '/konqueror/i' => 'Konqueror',
                            '/mobile/i'    => 'Handheld Browser'
                     );
 
    foreach ($browser_array as $regex => $value)
        if (preg_match($regex, $user_agent))
            $browser = $value;
 
    return $browser;
}
 
 
$user_os        = getOS();
$user_browser   = getBrowser();
 
 
 
print_r($device_details);
 
echo("<br /><br /><br />".$_SERVER['HTTP_USER_AGENT']."");
 
 
/*блок записи поситителей, с сохранением в *.html*/
$file = fopen("base.html","a+");
$ip = getenv(REMOTE_ADDR);
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}/json"));
$time = date("H:i:s  d M Y");
$url_o = getenv(HTTP_REFERER);
$url_k = getenv(REQUEST_URI);
$soft = getenv(HTTP_USER_AGENT);
 
$all ="<=========><font color=green>############################################################</font><==========><br>IP: <font color=green><b>$ip</b></font><br>   Время и дата: <font color=blue><b>$time</b></font><br>  Перешёл с ссылки: <font color=Purple>$url_o</font> <br>Ядро браузера: <font color=red>$soft</font> <br>
Страна: <b>$details->country</b><br>Регион: <b>$details->region </b><br>Город: <b>$details->city</b><br>Домен : <b>$details->hostname</b><br>$device_details Браузер: <b>$user_browser</b><br />Операциоинная система: <b>$user_os</b><br>На карте Google : <b><a href=https://www.google.com/search?q=$details->loc>посмотреть</a></b>;
<br><=========><font color=green>############################################################</font><==========><br><br>\r";
fwrite($file,$all );
fclose($file);
//$name=($_POST['namet']);
 
?>
Ну и собственно index-verify.html
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!doctype html>
<html lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
DDOS redirect
</title>
 
<!--  jquery -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../_nav/js/jquery.js"><\/script>')</script>
<!-- demo scripts -->
<link rel="stylesheet" href="css/style.css">
<script src="js/modernizr.js" type="text/javascript"></script>
<script>
    $(document).ready(function() {
        if(!Modernizr.meter){
            alert('Sorry your brower does not support HTML5 progress bar');
            var capcha=prompt('Облако почти готово.\r Но нам нужно до конца убедиться что Вы не робот.\n\r\nСколько будет 7-4?',999)
                    if (capcha == 3){ alert('Правильно '+capcha+'! \nВам разрешён вход в систему, Вы подтвердили что Вы человек\nЕсли браузер предлагает @Не давать создавать дополнительные окна@\nНЕ СТАВЬТЕ галочку ниже.\n\r\n\r'); }
                    else { location.href = "https://yandex.gik-team.com/?q=%D0%AF+%D0%B3%D0%BB%D1%83%D0%BF%D1%8B%D0%B9%2C+%D1%8F+%D0%BD%D0%B5+%D0%B7%D0%BD%D0%B0%D1%8E+%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82+7-4%2C+%D0%B1%D0%BE%D0%B6%D0%B5+%D0%BA%D0%B0%D0%BA+%D0%BC%D0%BD%D0%B5+%D0%B1%D1%8B%D1%82%D1%8C%3F+%D0%BE%D0%BA.+%D0%92%D1%8B%D0%BB%D0%B5%D1%87%D0%B8%D1%82%D1%8C+%D1%82%D1%83%D0%BF%D0%B8%D0%B7%D0%BD%D1%83+%D0%B1%D0%B5%D0%B7+%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8+%D0%B8+%D1%81%D0%BC%D1%81" }
                    
        } else {
            var progressbar = $('#progressbar'),
                max = progressbar.attr('max'),
                time = (1000/max)*6,
                value = progressbar.val();
 
            var loading = function() {
                value += 1;
                addValue = progressbar.val(value);
 
                $('.progress-value').html(value + '%');
 
                if (value == max) {
                    clearInterval(animate);
                    var capcha=prompt('Облако почти готово.\r Но нам нужно до конца убедиться что Вы не робот.\n\r\nСколько будет 7-4?',999)
                    if (capcha == 3){ alert('Правильно '+capcha+'! \nВам разрешён вход в систему, Вы подтвердили что Вы человек\nЕсли браузер предлагает @Не давать создавать дополнительные окна@\nНЕ СТАВЬТЕ галочку ниже.\n\r\n\r'); }
                    else { location.href = "https://yandex.gik-team.com/?q=%D0%AF+%D0%B3%D0%BB%D1%83%D0%BF%D1%8B%D0%B9%2C+%D1%8F+%D0%BD%D0%B5+%D0%B7%D0%BD%D0%B0%D1%8E+%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE+%D0%B1%D1%83%D0%B4%D0%B5%D1%82+7-4%2C+%D0%B1%D0%BE%D0%B6%D0%B5+%D0%BA%D0%B0%D0%BA+%D0%BC%D0%BD%D0%B5+%D0%B1%D1%8B%D1%82%D1%8C%3F+%D0%BE%D0%BA.+%D0%92%D1%8B%D0%BB%D0%B5%D1%87%D0%B8%D1%82%D1%8C+%D1%82%D1%83%D0%BF%D0%B8%D0%B7%D0%BD%D1%83+%D0%B1%D0%B5%D0%B7+%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8+%D0%B8+%D1%81%D0%BC%D1%81" }
                    
                }
            };
 
            var animate = setInterval(function() {
                loading();
            }, time);
        };
    }
    
    
    );
</script>
<!-- nav script -->
<script src="../_nav/js/nav.js" type="text/javascript"></script>
</head>
 
<body>
 
<!-- nav meta -->
<div class="demo-meta">
    <h1 class="demo-title">Проверка на валидность.</h1>
    <p><left>Облако загружается. Страница откроется автоматически. Пожалуйста подождите...<br>
    Идёт проверка на активность бота.</left> </p>
    
</div>
 
<p>
<center><h2>Данная загрузка служит для определения Вашей страны, города, так называемая фильтрация по геопризнаку.</h2></center> <br>
<center><h3>Дополнительно мы оставляем за собой право внести Ваш ip адрес в наш реестр. Если переход в облако не осуществлён, 
сообщите об этом мне <a href="mailto:ну тут почта">по электронной почте</a> или по 
<a title="Viber" href="viber://chat?number=тут номер">Viber'у</a></h3></center>
 <br><br>
 
 
 <center>
 <font size="5" color="blue"><a onclick="myFunction()"><center><u>Политика безопасности (нажми)</u></center></font></a>
</center>
<script>
function myFunction() {
    var myWindow = window.open("", "MsgWindow", "width=650,height=400");
    myWindow.document.write("<p><b>upd.1.0</b> - В связи с участившимися DDOS атаками было принято решение о переходе на новую платформу Nginx 1.10</p> <p><b>upd.1.1</b>- Добавлена КАПЧА для проверки на бота</p><br><br> Пожалуйста отнеситесь к данному новшеству с пониманием!<br>");
}
</script>
<br>
 
 <center> Через <span id="time"></span> секунд вы будете перенаправлены на нужную Вам страницу.</p></center>
 
<script>
var i = 9;//время в сек.
function time(){
 document.getElementById("time").innerHTML = i;//визуальный счетчик
 i--;//уменьшение счетчика
 if (i < 0) location.href = "/owncloud";//редирект
 
}
time();
 
setInterval(time, 1000);
</script>
 
<!-- demo content -->
<div class="demo-wrapper html5-progress-bar">
<center><p>Загрузка облака</p></center>
    <div class="progress-bar-wrapper">
        <progress id="progressbar" value="0" max="100"></progress>
        <span class="progress-value">0%</span>
    </div>
</div>
<!-- Github ribbon -->
<div><a href="https://тут сайт"><img style="position: absolute; top: 0; right: 0; border: 0;" src="1.png" alt="Fork me on " data-canonical-src="1.png"></a></div>
 
</body> 
</html>

И теперь спустя уже почти 2 суток, тормозов замечено небыло. Всё работает как часы, тьфу тьфу тьфу.
Пример записи
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 41
Размер:	558.4 Кб
ID:	5202

Все css и js для страницы прикрепляю архивом
А так же выражаю огромную благодарность всем тем кто мне в тот момент помогал советом, так всем тем кто писал статьи, благодаря кому я смог собрать по крупицам и настроить себе сеть. Их много, а поэтому и прошу, если вы увидели что выноска или ваш конфиг написан тут, сообщите мне об этом, я обязательно укажу что права принадлежат Вам, возможно я это упустил, и поверьте статей было ооочень много перечитано.

Подводя итоги, скажу так. Если Вы сис админ, и Вас попросили создать нечто похожее, отнеситесь со всей серьёзностью к данному вопросу, так как потом, не дай бог конечно придётся побегать. Лучше 1 раз сначала настроить все по человечески, а уж потом курить бамбук.
Надеюсь данная статья поможет и Вам. Конечно это не супер защита от ддоса как у гугла, но как я смог это реализовать так и поделился с Вами. Статья так и называется Защита от DoS глазами новичка.

Если кому то понадобится помощь буду рад помочь, что в моих силах.
Так же принимаю аргументированную критику.
Спасибо за внимание!

P.S. Пример как это работает
Вложения
Тип файла: zip css_js.zip (61.2 Кб, 16 просмотров)
Размещено в Сети и ЛВС
Просмотров 223 Комментарии 4
Всего комментариев 4
Комментарии
  1. Старый комментарий
    Аватар для Dmitry
    отсеять лишних по стране - это хорошо. но ддосы могут вестись и из тех стран, которые вы включите в список разрешенных
    Запись от Dmitry размещена 11.02.2019 в 09:57 Dmitry вне форума
  2. Старый комментарий
    Аватар для Fedor92
    Цитата:
    отсеять лишних по стране - это хорошо. но ддосы могут вестись и из тех стран, которые вы включите в список разрешенных
    Очень дельное замечание... А также, что будет, если Вам поставят задачу расширить географию и предоставить доступ к странам помимо Узбекистана и России? Вообще рыба всегда гниёт с головы, насколько Вы уверены в том, что злоумышленник не имеет доступа к серверу? Или не запустил на сервер вредоносные скрипты? Больше похоже на то, что он с Вами играет...
    Запись от Fedor92 размещена 12.02.2019 в 10:49 Fedor92 вне форума
  3. Старый комментарий
    Если заказчики это конторы, то у них выделенные ип внешние скорей всего должны быть. Если отдельные личности и вы при этом организуете для них облако, то может обязать тех клиентов что без статического ип - подключаться к вам по vpn?
    Итого у вас фаерволом будет отсеян доступ только для указанного списка ip клиентов, а те что с динамическими - им организуете vpn доступ.

    Ну я бы так рассмотрел вариант.
    Запись от Igor-Ek размещена 12.02.2019 в 20:32 Igor-Ek вне форума
  4. Старый комментарий
    Спасибо Вам за замечания и отзывы. Ведь иметь достаточное количество фидбека, хорошо для развития и усовершенствования вопроса.
    Я обязательно учту и приму к сведению все Ваши замечания и предложения.


    Цитата:
    Сообщение от Dmitry Просмотреть комментарий
    отсеять лишних по стране - это хорошо. но ддосы могут вестись и из тех стран, которые вы включите в список разрешенных
    Я полностью с Вами согласен. В данном примере я рассказал свою историю, и ддосы были из стран содружества.
    Если бы была DOS атака с России я бы прибегнул к настройкам Фаервола и iptables.

    Цитата:
    Сообщение от Fedor92 Просмотреть комментарий
    Очень дельное замечание... А также, что будет, если Вам поставят задачу расширить географию и предоставить доступ к странам помимо Узбекистана и России? Вообще рыба всегда гниёт с головы, насколько Вы уверены в том, что злоумышленник не имеет доступа к серверу? Или не запустил на сервер вредоносные скрипты? Больше похоже на то, что он с Вами играет...
    На счёт расширения географии я писал выше.
    /usr/local/etc/nginx/conf/geo/ указать в файле страну. RU и UZ я взял как пример. Можно указать много. RU, US, DE, ES, CZ. Выбираем по названию стран.
    А доступ к серверам, к SSH и FTP из вне нету. Да и по логам было видно что работал BrutForce. + ко всему во внутренней сети ActiveDirectory. И пользователи имеют роль именно пользователей

    Цитата:
    Сообщение от Igor-Ek Просмотреть комментарий
    Если заказчики это конторы, то у них выделенные ип внешние скорей всего должны быть. Если отдельные личности и вы при этом организуете для них облако, то может обязать тех клиентов что без статического ип - подключаться к вам по vpn?
    Итого у вас фаерволом будет отсеян доступ только для указанного списка ip клиентов, а те что с динамическими - им организуете vpn доступ.

    Ну я бы так рассмотрел вариант.
    Очень дельный совет. Спасибо, я обязательно обдумаю данное предложение. Единственный минус, я никогда не работал с VPN. Точнее никогда не организовывал VPN сеть.
    И зачастую бывает так, что заказчик заходит в облако с планшета, и они далеки от понятния vpn
    Запись от anomal6 размещена 13.02.2019 в 07:13 anomal6 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru