"Можливе затоплення SYN" у журналі, незважаючи на малу кількість з'єднань SYN_RECV


30

Нещодавно у нас був сервер apache, який реагував дуже повільно через затоплення SYN. Вирішенням цього було включити tcp_syncookies ( net.ipv4.tcp_syncookies=1 in /etc/sysctl.conf).

Я розмістив питання про це тут, якщо ви хочете більше інформації.

Після ввімкнення syncookies ми почали бачити таке повідомлення у / var / log / messages приблизно кожні 60 секунд:

[84440.731929] possible SYN flooding on port 80. Sending cookies.

Вінко Врсалович повідомив мені, що це означає, що відставання синхронізації заповнюється, тому я підвищив tcp_max_syn_backlog до 4096. У якийсь момент я також знизив tcp_synack_retries до 3 (вниз від за замовчуванням 5), видавши sysctl -w net.ipv4.tcp_synack_retries=3. Після цього частота, здавалося, знизилася, інтервал повідомлень коливався приблизно від 60 до 180 секунд.

Далі я видав sysctl -w net.ipv4.tcp_max_syn_backlog=65536, але все ще отримую повідомлення у журналі.

Протягом усього цього я спостерігав кількість підключень у стані SYN_RECV (за допомогою запуску watch --interval=5 'netstat -tuna |grep "SYN_RECV"|wc -l'), і він ніколи не перевищує 240, набагато менший, ніж розмір відставання. Однак у мене є сервер Red Hat, який наближається до 512 (обмеження на цьому сервері - 1024).

Чи є інші налаштування tcp, які б обмежували розмір відставання або я гавкаю неправильне дерево? Чи повинно число SYN_RECV підключень netstat -tunaспіввідноситися з розміром відставання?


Оновлення

Як найкраще я можу сказати, що я маю справу з законними зв’язками тут, netstat -tuna|wc -lколись близько 5000. Я досліджував це сьогодні і знайшов цю посаду від співробітника last.fm, яка була досить корисною.

Я також виявив, що tcp_max_syn_backlog не впливає, коли синхрокіаки включені (за цим посиланням )

Отже, як наступний крок я встановив у sysctl.conf наступне:

net.ipv4.tcp_syn_retries = 3
        # default=5
net.ipv4.tcp_synack_retries = 3
        # default=5
net.ipv4.tcp_max_syn_backlog = 65536
        # default=1024
net.core.wmem_max = 8388608
        # default=124928
net.core.rmem_max = 8388608
        # default=131071
net.core.somaxconn = 512
        # default = 128
net.core.optmem_max = 81920
        # default = 20480

Потім я встановив свій тест часу відповіді, запустив sysctl -pі відключив синкокі sysctl -w net.ipv4.tcp_syncookies=0.

Після цього кількість з'єднань у стані SYN_RECV все ще залишалася близько 220-250, але з'єднання знову починали затримуватися. Як тільки я помітив ці затримки, я знову включив синкокі, і затримки припинилися.

Я вважаю, що те, що я бачив, все ще покращився від початкового стану, проте деякі запити все ще були відкладені, що значно гірше, ніж увімкнено синхрокіаки. Так виглядає, що я затримався з ними, доки ми не зможемо отримати ще кілька серверів в Інтернеті, щоб впоратися з навантаженням. Навіть тоді я не впевнений, що бачу поважну причину відключити їх знову, оскільки вони надсилаються (мабуть) лише тоді, коли буфери сервера заповнюються.

Але, схоже, що відставання синхронізації не заповнене лише ~ 250 підключеннями в стані SYN_RECV! Чи можливо, що повідомлення про затоплення SYN - це червона оселедець, і це щось інше, ніж заповнення syn_backlog?

Якщо у когось є якісь інші налаштування, я ще не пробував, я був би більш ніж радий спробувати їх, але я починаю цікавитись, чи налаштування syn_backlog чомусь не застосовується належним чином.


Відповіді:


27

Отже, це акуратне питання.

Спочатку я був здивований, що ви побачили будь-які з'єднання в стані SYN_RECV із включеними файлами cookie SYN. Краса файлів cookie SYN полягає в тому, що ви можете без громадянства брати участь у триходовому рукостисканні TCP як сервер за допомогою криптографії, тому я би сподівався, що сервер взагалі не представляє напіввідкритих з'єднань, оскільки це був би той самий стан, який не є мене не тримають.

Фактично, швидкий погляд у джерело (tcp_ipv4.c) показує цікаву інформацію про те, як ядро ​​реалізує файли cookie SYN. По суті, незважаючи на їх увімкнення, ядро ​​поводиться так, як це було нормально, поки його черга очікуваних з'єднань не заповниться. Це пояснює наявний список підключень у стані SYN_RECV.

Тільки коли черга очікуваних з'єднань заповнена, і отримано інший пакет SYN (спроба з'єднання), і пройшло більше хвилини з часу останнього попереджувального повідомлення, ядро ​​надсилає попереджене повідомлення, яке ви побачили ("відправлення файлів cookie" ). Файли cookie SYN надсилаються навіть тоді, коли попередження відсутнє; Попереджувальне повідомлення полягає лише в тому, щоб дати вам голову про те, що проблема не зникла.

По-іншому, якщо вимкнути файли cookie SYN, повідомлення відійде. Це вийде для вас лише тоді, коли вас більше не затопить SYN.

Щоб вирішити деякі інші дії, які ви зробили:

  • net.ipv4.tcp_synack_retries:
    • Підвищення цього не матиме позитивного ефекту для тих вхідних з'єднань, які підроблені, а також для тих, хто отримує файли cookie SYN замість стану на стороні сервера (жодних спроб для них також немає).
    • Для вхідних підроблених з'єднань, збільшуючи це, збільшується кількість пакетів, які ви надсилаєте на підроблену адресу, і, можливо, кількість часу, який ця підроблена адреса залишається у вашій таблиці зв’язків (це може бути суттєвим негативним ефектом).
    • При нормальному навантаженні / кількості вхідних з'єднань, чим вище це, тим більше шансів на швидке / успішне завершення з'єднань через посилання, які скидають пакети. Збільшуються прибутки для збільшення цього.
  • net.ipv4.tcp_syn_retries: Змінення цього не може вплинути на вхідні з'єднання (це впливає лише на вихідні з'єднання)

Інших змінних, про які ви згадуєте, я не досліджував, але я підозрюю, що відповіді на ваше запитання тут знаходяться прямо тут.

Якщо ви не затоплені SYN, і машина реагує на з'єднання, що не є HTTP (наприклад, SSH), я думаю, що, мабуть, є проблема з мережею, і вам слід мати мережевого інженера, який допоможе вам це переглянути. Якщо машина, як правило, не реагує навіть тоді, коли вас не затоплює SYN, це здається серйозною проблемою із завантаженням, якщо це впливає на створення TCP-з'єднань (досить низький рівень та неінтенсивні ресурси)


Спасибі - це цікава та інформативна відповідь. Він, безумовно, відповідає на мій запит про зв’язок між з'єднаннями в стані SYN_RECV та надсиланням файлів cookie. Машина реагувала на не HTTP, включаючи SSH та HTTPS, які отримують набагато менше трафіку, ніж HTTP. Таким чином, ми вирішили, що зменшити трафік - це шлях.
Алекс Форбс

Що стосується того, щоб залучити інженера до мережі, щоб придивитись - гарна пропозиція, але ми відходимо від цього датацентру, тому, мабуть, не варто, коли ми приносимо пару нових серверів в Інтернеті в іншому місці. Я думаю, ви можете мати рацію, оскільки це проблема мережі - можливо, проблема з балансиром навантаження або брандмауером. Ще раз дякую за вашу думку!
Алекс Форбс

13

Я зіткнувся з точно такою самою проблемою, коли в новому встановленні Ubuntu Oneiric 11.10 працює веб-сервер (apache2) з важко завантаженим веб-сайтом. У Ubuntu Oneiric 11.10 синхрокіїв було включено за замовчуванням.

У мене були ті ж повідомлення ядра, що свідчать про можливу атаку потоку SYN на порт веб-сервера:

ядро: [739408.882650] TCP: можливе затоплення SYN на порт 80. Відправлення файлів cookie.

У той же час я був майже впевнений, що нападу не відбувається. У мене це повідомлення поверталося з інтервалом у 5 хвилин. Це виглядало як вигляд завантаження, тому що зловмисник буде постійно тримати навантаження, намагаючись змусити сервер перестати відповідати на запити.

Налаштування net.ipv4.tcp_max_syn_backlogпараметра не призвело до покращення - повідомлення продовжувались із тією ж швидкістю. той факт, що кількість з'єднань SYN_RECV завжди був дуже низьким (у моєму випадку - 250), був показником, що має бути якийсь інший параметр, який відповідає за це повідомлення.

Я знайшов це повідомлення про помилку https://bugzilla.redhat.com/show_bug.cgi?id=734991 на веб- сайті з червоною шапочкою, де вказано, що повідомлення ядра може бути наслідком помилки (або неправильної конфігурації) на стороні програми . Звичайно, повідомлення журналу дуже вводить в оману! Оскільки це не параметр ядра, який відповідає в цьому випадку, а параметр вашої програми, передається ядру.

Тому ми також повинні ознайомитися з параметрами конфігурації нашого веб-серверного додатку. Візьміть документи домену apache та перейдіть на сторінку http://httpd.apache.org/docs/2.0/mod/mpm_common.html#listenbacklog

Значення за замовчуванням ListenBacklogпараметра - 511. (Це відповідає кількості підключень, які ви спостерігали на своєму сервері червоної шапки. На іншому сервері, можливо, буде налаштовано нижнє число.)

Apache має власний параметр конфігурації черги відставання для вхідних з'єднань. якщо у вас є багато вхідних з'єднань, і в будь-який момент (як випадкова річ) вони приходять всі разом майже в один і той же час, таким чином, щоб веб-сервер не міг їх досить швидко обслуговувати належним чином, ваш відставання буде бути повним 511 з'єднанням, і ядро ​​запустить вищезгадане повідомлення, вказуючи можливу атаку потоку SYN.

Щоб вирішити це питання, я додаю наступний рядок до /etc/apache2/ports.confодного чи іншого .conf-файлів, який буде завантажений apache ( /etc/apache2/apache2.confмає бути також нормально):

ListenBackLog 5000

Ви також повинні встановити net.ipv4.tcp_max_syn_backlogрозумне значення. на моє розуміння, максимум ядра обмежить значення, яке ви зможете налаштувати в конфігурації apache. тому бігайте:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=5000

Після налаштування конфігурації не забудьте перезапустити апаш:

sudo service apache2 restart ( or sudo /etc/init.d/apache2 restart )

У моєму випадку ця зміна конфігурації негайно зупинила попередження ядра. Я можу відтворити повідомлення, встановивши низьке значення ListenBackLog у конфігурації apache.


2
Чудова відповідь. Якщо припустити, що ви говорите правильно, я б позначив це як прийняту відповідь, але я не можу це перевірити - зменшення навантаження вирішило проблему, і я маю політику не повозитися з виробничими серверами без поважних причин :)
Alex Forbes

Я можу підтвердити, що це по суті працює, це функція анти-DDOS ядра, однак, коли ви отримуєте, скажімо, багато веб-трафіку, це в результаті блокує ваших законних користувачів!
Аріб Су Ясір

5

Після деяких тестів з ядром 3.4.9 залежить кількість підключень SYN_RECV в netstat

  • /proc/sys/net/core/somaxconn округлюється до наступної потужності 2 (наприклад, 128 -> 256)
  • 75%, /proc/sys/net/ipv4/tcp_max_syn_backlogякщо /proc/sys/net/ipv4/tcp_syncookiesвстановлено значення, 0або 100%, якщо /proc/sys/net/ipv4/tcp_syncookiesвстановлено значення1
  • ListenBackLog в конфігурації apache, округленої до наступної потужності 2 (наприклад, 128 -> 256)

використовується мінімум кожного з цих параметрів. Після зміни somaxconn або ListenBackLog apache потрібно перезапустити.

А після збільшення tcp_max_syn_backlog apache також потрібно перезапустити.

Без tcp_syncookies apache блокує, чому в цьому випадку дивним є лише 75% tcp_max_syn_backlog. а збільшення цього параметра збільшує підключення SYN_RECV до 100% від старого значення без перезавантаження апаша.


А також виклик /bin/echo m >/proc/sysrq-triggerчасто призводить до можливого затоплення SYN на порт 80. Надіслати повідомлення cookie .
usoft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.