LINUX.ORG.RU
ФорумAdmin

Атака на сервер: падает backend


0

1

Доброго времени суток. На сервере (debian) стоит nginx, за ним стоит apache. Вся статика передается непосредственно nginx-ом. Сервер часто атакуют, в основном это обычный http-флуд, который рубится nginx-ом с помощью limit_req и limit_conn, а особо активных скрипт (парсит логи ошибок nginx) банит по iptables. Долгое время я так успешно отбивался от небольших атак. Но вчера перед очередной атакой случилось следующее: apache перестал отвечать nginx-у. Сам nginx работал, успешно отдавал статику, но при попытке запросить страницу, генерирующуюся апачем, выдавал 502. В логах ошибок nginx по этому поводу были строчки:

connect() failed (111: Connection refused) while connecting to upstream
В логах же самого апача не было вообще никакой подозрительной активности. Как-будто просто лег полежать. Количество предшествующих падению запросов было 10-20 в минуту (обычная моя нагрузка).

Пока апач лежал, я зашел по ssh, посмотрел статистику загруженности ресурсов - процессор простаивал, размер занятой оперативной памяти был не увеличен. Забанил один ip, с которого было больше всего коннектов (~40) и апач начал откликаться. После этого в лог апача посыпалось множество запросов тяжелой страницы с разных ip, штук по 30 в секунду. Это апач легко выдержал. Я не успел посмотреть tcpdump пока апач лежал, netstat же выдавал множество соединений между apache и nginx со статусом TIME_WAIT.

Если вкратце описать ситуацию: nginx работает, сервер не нагружен, но apache, стоящий за nginx-ом, почему-то ложится. Что это может быть и как от этого защититься?

Апач на 8080 порту наверно, из интернета виден? Если да, то плохо. Я например всегда ддосю такие проекты сразу на 8080 порт, обычно всегда проканывает ибо все как овечки юзают ISPManager. Вылаживай /etc/nginx/nginx.conf, не здоровое поведение в корне.

Seraph ()
Ответ на: комментарий от Seraph

Конфиг Nginx:

user www-data;
worker_processes  8;
worker_rlimit_nofile 80000;


error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  50000;
    # multi_accept on;
    #use epoll;
}

http {
    include /etc/nginx/mime.types;

    access_log /var/www/def-www/log/nginx.xconf.access.log;
    error_log /var/www/def-www/log/nginx.xconf.error.log;

    client_header_timeout 30;
    client_body_timeout 30;
    send_timeout 30;

    client_body_buffer_size 64k;
    client_body_in_file_only clean;

    server_tokens off;
    reset_timedout_connection on;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_requests 1;

    keepalive_timeout  0;
    tcp_nodelay        on;

    gzip  on;
    gzip_min_length 1100;
    gzip_buffers 64 8k;
    gzip_comp_level 3;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain application/xml application/x-javascript text/css;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    upstream backend {
        server 127.0.0.1:3547;
    }

    limit_req_zone $binary_remote_addr zone=reqip:20m rate=2r/s;
    limit_zone conip $binary_remote_addr 20m;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

Конфиг домена:

server {

	listen   80;
	server_name  www.domain.ru domain.ru www.domain.ru;
	rewrite ^/(.*) http://domain.ru/$1 permanent;
}



server {

	listen 80;

	server_name  domain.ru;

	access_log  /var/www/domain.ru/log/nginx.access.log;
	error_log /var/www/domain.ru/log/nginx.error.log;

	client_max_body_size 20M;

	location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ {
		root /var/www/domain.ru/public/www;
	}

	location = / {
		rewrite ^/$ /index.html last;
	}
	location = /index.html {
		root /var/www/domain.ru/public/www;
	}

	location ~ /\.ht {
		deny  all;
	}
	location /lib/ {
		deny all;
	}
	location /tpls/ {
	    deny all;
	}

	location ~* \.html {
		root /var/www/domain.ru/public/www;
		error_page 404 = @fallback;
		error_log /var/www/domain.ru/log/nginx.error404html.log;
		expires -1;
		add_header Cache-Control "no-cache";
		add_header Last-Modified "";
		add_header Expires "Mon, 21 Sep 2009 04:52:34 GMT";
		add_header Pragma "no-cache";
	}

	location @fallback {
		limit_req zone=reqip burst=1 nodelay;
		limit_conn conip 1;
		proxy_pass http://backend;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_connect_timeout 120;
		proxy_send_timeout    120;
		proxy_read_timeout    180;
	}

	location /  {
		limit_req zone=reqip burst=1 nodelay;
		limit_conn conip 1;
		proxy_pass http://backend/;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr;
		proxy_connect_timeout 120;
		proxy_send_timeout    120;
		proxy_read_timeout    180;
	}
}

Bomber ()
Ответ на: комментарий от Seraph

Закрыты все порты, кроме 80 и ssh. Апач снаружи не виден.

Bomber ()
Ответ на: комментарий от Seraph

Я например всегда ддосю такие проекты сразу на 8080 порт

нехороший ты человек. совсем нехороший. хотя лечится это одним правилом:
ipfw deny all from not me to me 8080 in via $interface

Komintern ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.