Який параметр ядра чи інші параметри контролюють максимальну кількість сокетів TCP, які можна відкрити на сервері Linux? Які компроміси дозволяють отримати більше з'єднань?
Я помітив, під час завантаження тестування сервера Apache з ab, що досить легко максимізувати відкриті з'єднання на сервері. Якщо ви вимкнете опцію ab's -k, яка дозволяє повторно використовувати з'єднання, і надіслати більше 10 000 запитів, то Apache обслуговує перші 11 000 або більше запитів, а потім зупиняється на 60 секунд. Погляд виходу netstat показує 11000 з'єднань у стані TIME_WAIT. Мабуть, це нормально. З'єднання залишаються відкритими за замовчуванням 60 секунд, навіть після того, як клієнт зробив з ними з міркувань надійності TCP .
Здається, це був би простий спосіб зробити сервер DoS, і мені цікаво, що це за звичайні налаштування та заходи безпеки.
Ось мій тестовий результат:
# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed
Ось команда netstat, яку я запускаю під час тесту:
# netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c
11651 tcp 0 0 localhost:www TIME_WAIT -
1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab