limit_conn и deny работают не на уровне сети, а на кровне nginx'a - он просто будет выдавать ошибки тем ip. А для блокировки ip/отслеживания кол-ва соединений обычно пользуются фаирволлом.
25 января 2009 г. 13:38 пользователь Доронин Сергей <nophear@xxxxxxxxx> написал:
Здравствуйте!
У меня на сервере на 8080 порту установлен apache, а на 80 nginx. Иногда мой сайт подвергается http-флуд атакам, что влечёт за собой множество
соединений с одного IP. Соответственно мне нужно средствами nginx ограничивать количество соединений с одного IP и блокировать доступ к сайту
для некоторых IP адресов. В документации по nginx я нашёл решение обоих вопросов. Вырезка из nginx.conf:
# NGINX Server configuration
worker_processes 3;
error_log /home/myhost/logs/error.log;
pid /home/myhost/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include /usr/local/etc/nginx/mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 64;
allow all;
deny 92.113.238.129;
.....................
Где 1.2.3.4 - IP моего сервера.
С данным конфигом я запускаю nginx. После этого смотрю в netstat и вижу такую картину:
[myhost@web48 ~]$ netstat -an|grep ESTABLISH|more
netstat: kvm not available
tcp4 0 0 1.2.3.4.80 62.182.93.42.55050 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20928 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.124.46.214.3788 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19614 ESTABLISHED
tcp4 0 0 1.2.3.4.80 62.182.93.42.56534 ESTABLISHED
tcp4 0 330 1.2.3.4.80 62.182.93.42.64848 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19580 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20842 ESTABLISHED
tcp4 0 330 1.2.3.4.80 95.79.9.220.3079 ESTABLISHED
tcp4 0 690 1.2.3.4.80 92.126.158.158.49561 ESTABLISHED
tcp4 0 690 1.2.3.4.80 92.126.158.158.49560 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20807 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20795 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19495 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20776 ESTABLISHED
tcp4 0 330 1.2.3.4.80 95.79.9.220.3078 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20775 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20774 ESTABLISHED
tcp4 0 330 1.2.3.4.80 89.250.149.46.61099 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20760 ESTABLISHED
tcp4 0 690 1.2.3.4.80 92.243.181.212.17171 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.124.46.214.3784 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20735 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20738 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20718 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20708 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20699 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20669 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20666 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19411 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20657 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20633 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19377 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.19400 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.124.46.214.3780 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20599 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20598 ESTABLISHED
tcp4 0 330 1.2.3.4.80 92.113.238.129.20587 ESTABLISHED
[myhost@web48 ~]$ ps aux|grep nginx
myhost 89909 0.0 0.0 12224 1220 ?? Ss 12:47PM 0:00.00 nginx: master process /usr/local/sbin/nginx -c /home/myhost/nginx/nginx.conf
(nginx)
myhost 89910 0.0 0.1 12684 1692 ?? S 12:47PM 0:06.15 nginx: worker process (nginx)
myhost 89911 0.0 0.0 12500 1508 ?? S 12:47PM 0:08.07 nginx: worker process (nginx)
myhost 89912 0.0 0.0 12500 1508 ?? S 12:47PM 0:08.19 nginx: worker process (nginx)
myhost 94547 0.0 0.0 1592 836 p5 S+ 1:13PM 0:00.00 grep nginx
[myhost@web48 ~]$
92.113.238.129 - данный IP не только успешно соединяется с nginx (не смотря на "deny"), но и делает это параллельно бесконечное множество раз
(не смотря на limit_zone/limit_conn). Скажите пожалуйста, что я делаю не так? Почему nginx игнорирует соответствующие директивы в конфигах?