Проблема решается посредством Iptables
СТавится Iptables, если Debian8, команда
apt-get install nftables
Cтавится fail2ban там по умолчанию защита от взлома сервера к админке
aptitude install fail2ban
Пишутся правила для Iptables
iptables -I INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 10 –connlimit-mask 24 -j DROP
iptables -I INPUT -p tcp –syn –dport 80 -m hashlimit –hashlimit-above 1/second –hashlimit-burst 20 –hashlimit-mode srcip –hashlimit-srcmask 24 –hashlimit-name blip -j DROP
echo «20000» > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo «1» > /proc/sys/net/ipv4/tcp_synack_retries
echo «30» > /proc/sys/net/ipv4/tcp_fin_timeout
echo «5» > /proc/sys/net/ipv4/tcp_keepalive_probes
echo «15» > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo «20000» > /proc/sys/net/core/netdev_max_backlog
echo «20000» > /proc/sys/net/core/somaxconn
От syn_flooda
iptables -N syn_flood
iptables -A INPUT -p tcp –syn -j syn_flood
iptables -A syn_flood -m limit –limit 500/s –limit-burst 2000 -j RETURN
iptables -A syn_flood -j DROP
Еще полезные фичи:
iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp –tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp –tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp –tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp –tcp-flags ACK,URG URG -j DROP
После сохраняете
iptables-save
Настройка от нагрузки файлов nginx.conf, sysctl.conf
/etc/nginx/nginx.conf
/etc/sysctl.conf
В файл sysctl.conf, в конец файла, пишите это строки, сервер после перезагружаете
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.lo.accept_source_route = 0
net.ipv4.conf.eth0.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.core.rmem_max = 996777216
net.core.wmem_max = 996777216
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_mem= 786432 1048576 996777216
net.ipv4.tcp_wmem = 4096 87380 4194304
net.ipv4.tcp_max_orphans = 2255360
net.core.netdev_max_backlog = 10000
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_syn_backlog = 4046
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_probes=5
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 494967295
kernel.shmall = 268435456
net.core.somaxconn= 16096
Находите в файле nginx.conf строчки, и меняете на:
worker_rlimit_nofile 100000;
worker_connections 65000;
gzip_comp_level 7;
gzip_buffers 8 64k;
File cache settings
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors off;
http {
# Main settings
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_timeout 10;
client_body_timeout 10;
client_header_buffer_size 1k;
client_body_buffer_size 1k;
client_max_body_size 10k;
large_client_header_buffers 2 1k;
send_timeout 10;
keepalive_timeout 5 5;
reset_timedout_connection on;
server_tokens off;
server_name_in_redirect off;
server_names_hash_max_size 512;
server_names_hash_bucket_size 512;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:5m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:5m rate=5r/s;
server {
limit_conn conn_limit_per_ip 5;
limit_req zone=req_limit_per_ip burst=5 nodelay;
}
Так DOS флуд GET запросов c разных ip, прокси останавливается, трафик в 3-5мб/cек падает, проц не грузится на 100%, сервер, сайт не упадет.
PS. Вдруг кто столкнется с похожей проблемой и не сможете решить сами, пишите в лс в телегу @KrolikQ