Уже некоторое время у меня на сервере (vds virtuozzo, debian 6) в munin наблюдается странная картина по установленным подключениям, а именно - сразу после загрузки сервера число установленных подключений начинает увеличиваться и когда достигает 10-18 тысяч, расти перестаёт и держиться на этом уровне.



Сервер находится под довольно посредстенной нагрузкой (16 ядер почти незагружены, оперативки 30% свободно, load average 0.05) - около 10 requests/s (100 active connections) через nginx. На сервере работает и активно используется apache2+modphp, nginx, php5-fpm, mysql 5.5. Остановка всех этих сервисов не влияет на количество established подключений, которое показывает мунин..
Также на севере отрабаетывает скрипт ddos deflate раз в минуту с высоким приоритетом.
Есть мнение, что такое поведение связано с настройками iptables, где я пытался в своё время придумать некоторые подходы по предотвращению всяких пакостей (такое впечатление что connstate оставляет соединение установленным..)
Код: Выделить всё
netstat -lnpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 752/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1557/sendmail: MTA:
tcp 0 0 92.61.46.238:443 0.0.0.0:* LISTEN 1973/nginx
tcp 0 0 127.0.0.1:9312 0.0.0.0:* LISTEN 1632/searchd
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 29959/mysqld
tcp 0 0 127.0.0.1:587 0.0.0.0:* LISTEN 1557/sendmail: MTA:
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 1986/apache2
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1973/nginx
tcp 0 0 127.0.0.1:4949 0.0.0.0:* LISTEN 1670/munin-node
tcp6 0 0 :::22 :::* LISTEN 752/sshdКод: Выделить всё
# BOR'BA S DDOS
iptables -N ssh_brute_check # Sozdaem cepochku dlya proverki popytok soedinenii na zaschischaemyi port
# Esli za poslednie 1 minut (60 sekund) s odnogo adresa bylo 2 ili bolee novyh soedinenii blokiruem etot adres
iptables -A ssh_brute_check -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 2 -j DROP
# V protivnom sluchae razreshaem, i pri etom zanosim v spisok
iptables -A ssh_brute_check -m recent --set -j ACCEPT
iptables -F INPUT # Ochischaem cepochku INPUT
iptables -I INPUT -p tcp --dport 22 -s MY_WHITE_IP -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Razreshaem pakety po ustanovlennym soedineniyam
# Vse popytki otkryt' novoe soedinenie po SSH napravlyaem na proverku
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 22 -j ssh_brute_check
# Zdes' mojno razreshat' te porty, dlya kotoryh takaya proverka ne nujna. Naprimer, HTTP
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT
iptables -P INPUT ACCEPT
# ustanavlivaem maksimal'noe kolichestvo podklyuchenii s odnogo aipi.
# V brauzerah eta kolichestvo podklyuchenii k serveru ogranicheno 16 soedineniyami,
# no stoit uchityvat' teh, kto sidit za NAT, a takje chto pol'zovatel'
# mojet otkryt' 2 saita na raznyh aipishnikah odnogo i togo je servera.
# Dannyi parametr podbiraetsya optimal'no s pomosch'yu predyduschei komandy.
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 32 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# to je dlya DNS
iptables -A INPUT -p udp --dport 53 -m connlimit --connlimit-above 8 -j DROP
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# budet prepyatstvovat' spufingu ot nashego imeni.
# Ved' esli my poluchaem paket s ustanovlennymi flagami SYN i ACK
# (takoi kombinaciei flagov obladaet tol'ko otvet na SYN-paket) po esche ne otkrytomu soedineniyu,
# eto oznachaet, chto kto-to poslal drugomu hostu SYN-paket ot nashego imeni, i otvet prishel k nam.
# Konechno, zloumyshlenniku predstoit esche ugadat' nomer posledovatel'nosti.
# Soglasno privedennomu pravilu, nash host otvetit RST-paketom, posle polucheniya kotorogo
# atakuemyi host zakroet soedinenie.
iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset
# Dlya zaschity ot SYN atak vklyuchaem SYN-cookies
sysctl -w net.ipv4.tcp_syncookies=1
# Uvelichivaem razmer ocheredi poluotkrytyh soedinenii (takje polezno pri SYN flude) (default 512)
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
# Proveryat' TCP-soedinenie kajduyu minutu. Esli na drugoi storone - legal'naya mashina,.
# ona srazu otvetit. Defoltovoe znachenie - 2 chasa.
sysctl -w net.ipv4.tcp_keepalive_time=60
# Povtorit' probu cherez desyat' sekund
sysctl -w net.ipv4.tcp_keepalive_intvl=10
# Kolichestvo proverok pered zakrytiem soedineniya
sysctl -w net.ipv4.tcp_keepalive_probes=5
# Fil'tr obratnogo puti, zaschita ot spufinga (podmeny adresov)
sysctl -w net.ipv4.conf.default.rp_filter=1
# Umen'shenie vremeni uderjaniya «poluotkrytyh» soedinenii
# Sdelaem tak, chtoby pereperedacha osuschestvlyalas' na 3 sekunde
# i polnoe vremya hraneniya poluotkrytyh soedinenii v ocheredi sostavilo 9 sekund
sysctl -w net.ipv4.tcp_synack_retries=1
# Izmenyaem vremya ojidaniya priema FIN do polnogo zakrytiya soketa
sysctl -w net.ipv4.tcp_fin_timeout=10ниже привожу листинг /proc/net/nf_conntrack где на самом деле 2 тысячи строк, смысл которых мне не совсем ясен.. как может быть tcp установленное соединение если оно UNREPLIED..
Код: Выделить всё
ipv4 2 tcp 6 431993 ESTABLISHED src=84.201.228.128 dst=MY_IP sport=26120 dport=80 src=MY_IP dst=84.201.228.128 sport=80 dport=26120 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 tcp 6 322977 ESTABLISHED src=MY_IP dst=178.125.68.245 sport=80 dport=13545 [UNREPLIED] src=178.125.68.245 dst=MY_IP sport=13545 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 343356 ESTABLISHED src=MY_IP dst=178.126.176.17 sport=80 dport=12199 [UNREPLIED] src=178.126.176.17 dst=MY_IP sport=12199 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 345647 ESTABLISHED src=MY_IP dst=178.122.3.136 sport=80 dport=52311 [UNREPLIED] src=178.122.3.136 dst=MY_IP sport=52311 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 344923 ESTABLISHED src=MY_IP dst=178.125.41.162 sport=80 dport=1566 [UNREPLIED] src=178.125.41.162 dst=MY_IP sport=1566 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 403753 ESTABLISHED src=MY_IP dst=178.127.66.88 sport=80 dport=1025 [UNREPLIED] src=178.127.66.88 dst=MY_IP sport=1025 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 101 TIME_WAIT src=66.249.66.68 dst=MY_IP sport=41182 dport=80 src=MY_IP dst=66.249.66.68 sport=80 dport=41182 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 tcp 6 394024 ESTABLISHED src=MY_IP dst=158.169.9.14 sport=80 dport=62458 [UNREPLIED] src=158.169.9.14 dst=MY_IP sport=62458 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 407597 ESTABLISHED src=MY_IP dst=178.127.239.16 sport=80 dport=51051 [UNREPLIED] src=178.127.239.16 dst=MY_IP sport=51051 dport=80 mark=0 secmark=0 use=2
ipv4 2 tcp 6 69 TIME_WAIT src=84.201.228.128 dst=MY_IP sport=26085 dport=80 src=MY_IP dst=84.201.228.128 sport=80 dport=26085 [ASSURED] mark=0 secmark=0 use=2
ipv4 2 tcp 6 402593 ESTABLISHED src=MY_IP dst=65.52.1.12 sport=80 dport=1937 [UNREPLIED] src=65.52.1.12 dst=MY_IP sport=1937 dport=80 mark=0 secmark=0 use=2