¿Qué parámetro del kernel u otras configuraciones controlan la cantidad máxima de sockets TCP que se pueden abrir en un servidor Linux? ¿Cuáles son las desventajas de permitir más conexiones?
Mientras cargaba probando un servidor Apache con ab, noté que es bastante fácil maximizar las conexiones abiertas en el servidor. Si deja de lado la opción ab's -k, que permite la reutilización de la conexión, y hace que envíe más de aproximadamente 10,000 solicitudes, Apache atiende las primeras 11,000 solicitudes y luego se detiene durante 60 segundos. Una mirada a la salida de netstat muestra 11,000 conexiones en el estado TIME_WAIT. Aparentemente, esto es normal. Las conexiones se mantienen abiertas por defecto de 60 segundos incluso después de que el cliente haya terminado con ellas por razones de confiabilidad de TCP .
Parece que esta sería una manera fácil de hacer un servidor DoS y me pregunto cuáles son las afinaciones y precauciones habituales para ello.
Aquí está mi salida de prueba:
# 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
Aquí está el comando netstat que ejecuto durante la prueba:
# 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