Recibo muchas solicitudes en nuestros registros de Apache que se ven así
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
Parece que no hay solicitud ni agente de usuario. ¿Alguien ha visto esto antes?
Recibo muchas solicitudes en nuestros registros de Apache que se ven así
www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -
Parece que no hay solicitud ni agente de usuario. ¿Alguien ha visto esto antes?
Respuestas:
¿Está por casualidad ejecutando sus servidores web en Amazon detrás de un Elastic Load Balancer?
Parece que generan 408 respuestas debido a sus controles de salud .
Algunas de las soluciones de ese hilo del foro:
RequestReadTimeout header=0 body=0
Esto deshabilita las 408 respuestas si se agota el tiempo de espera de una solicitud.
Inhabilite el registro de las direcciones IP de ELB con:
SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
CustomLog logs/access_log common env=!exclude_from_log
Y de esta publicación de blog :
RequestReadTimeout header=0 body=0
pediría desactivar leer tiempo de espera de todos juntos, que no recomendaría este
Algo se conecta al puerto y luego nunca envía datos. HTTP 408 es un error de "tiempo de espera". Hay una buena reseña aquí: http://www.checkupdown.com/status/E408.html
Ya hay bastantes buenas respuestas aquí, pero me gustaría arriesgar una nota adicional que no se ha abordado específicamente. Como muchos de los comentaristas anteriores ya mencionados, 408 indica un tiempo de espera; y hay una gran variedad de circunstancias en las que los tiempos de espera se producen en un servidor web.
Dicho esto, se pueden generar 408 errores en una variedad de casos en los que se explora su servidor en busca de vulnerabilidades. En tales casos, los clientes rara vez presentan un agente de usuario y, a menudo, finalizan las conexiones abruptamente, lo que resulta en un cierre abortivo de esa conexión que puede generar un error 408.
Por ejemplo, digamos que soy un pirata informático que está escaneando Internet para buscar computadoras que aún son vulnerables a la vulnerabilidad POODLE. Como tal, he escrito un script que abre conexiones a grandes porciones de direcciones IP para encontrar servidores que acepten la versión 3 de SSL; más adelante usaré esa lista para buscar específicamente el exploit POODLE. Todo lo que hace este primer script es establecer una conexión usando openssl para verificar SSLv3, así:
openssl s_client -connect [IP]:443 -ssl3
Este comando, en muchas configuraciones de Apache, dará como resultado un mensaje 408 exactamente como lo ha descrito. La ejecución de este comando en dos de mis propios servidores resultó en esta entrada al registro de acceso:
<remote IP address> - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"
Quería aclarar esto, ya que incluso en una situación en la que OP no estaba utilizando ninguna forma de equilibrio de carga, pueden producirse errores 408 en una variedad de circunstancias: algunas maliciosas, algunas que indican problemas con el cliente y otras que indican problemas con el servidor. (Noté en el registro proporcionado por OP que una IP local se indicaba como IP remota, pero OP no mencionó específicamente el uso de un equilibrador de carga, por lo que no estaba seguro de si OP simplemente había usado una IP no enrutable para los fines de demostración, como lo hizo con la URL)
De todos modos, aunque mi publicación es obviamente demasiado tarde en el día para ayudar al OP, espero que pueda ayudar a otros que llegan aquí en busca de una solución a todos esos malditos errores de tiempo de espera.
Hay varias razones para un tiempo de espera 408. Pero comencemos con la premisa de que todo está bien, en algún momento estos 408 comienzan a aparecer en su registro de acceso, es decir, 408 0 "-" "-".
Como muchos señalan en la red, un 408 representa que se realiza una conexión, pero no se envía ninguna solicitud en la escala de tiempo apropiada, por lo tanto, el servidor interrumpe la conexión con un 408. Un individuo arrogante realmente respondió a alguien pidiendo ayuda sobre este tema con - "¿Qué parte de Timeout no entiendes?".
Creo que es una respuesta novata y demuestra una total falta de comprensión de cómo funcionan algunos métodos de seguridad con el software de servidor web.
Volviendo al principio, ¿por qué estoy viendo todos estos 408? Una cosa que tendrá en común con el resto de nosotros que administramos un servidor es la gran cantidad de ataques que recibe a diario. Ahora, ¿qué haces al respecto? Bueno: empleas los métodos de seguridad elegidos para lidiar con ellos, esto es lo que cambia.
Tomemos un ejemplo muy sencillo: soltar una dirección IP. Incluido en un archivo iptabes (rules.v4) tiene "-A ufw-user-input -s 37.58.64.228 -j DROP". Entonces viene 37.58.64.228, el firewall reconoce la IP y desconecta la conexión. En muchas configuraciones, ni siquiera sabría que llamaron a la puerta.
Ahora tomemos un ejemplo más avanzado: desconecte la conexión según algunos criterios. Incluido en un archivo iptabes (rules.v4) tiene "-A INPUT -p tcp -m tcp --dport 80 -m string --string" cgi "--algo bm --to 1000 -j DROP". Esto es diferente porque en esta regla de iptable estamos diciendo que mire los primeros 1000 bytes de la cadena de solicitud y vea si puede encontrar una subcadena de "cgi" y si encuentra esa subcadena, entonces no vaya a ninguna Además, simplemente deje caer la conexión.
Aquí el método de seguridad es bueno, pero en lo que respecta a sus registros, es engañoso. El 408 0 "-" "-" generado es lo mejor que apache puede hacer en estas circunstancias. Se realizó la conexión y la solicitud tuvo que ser aceptada hasta cierto punto para aplicar la regla de comparación de cadenas que finalmente resulta en un 408 porque su regla cumplió con los criterios para que la conexión se elimine. Entonces, nuestras pequeñas queridas novicias no podrían estar más equivocadas si lo intentaran. Se realizó una conexión y se recibió una solicitud (en estas circunstancias no tendrá visibilidad). Aunque se genera un 408, no es un 'Tiempo de espera'; su servidor simplemente cortó la conexión después de que la solicitud se realizó en asociación con su regla de firewall. Hay muchas otras reglas, que crearían la misma situación. Don'
Idealmente, habría otro Código de error generado por Apache, por ejemplo, '499', que significaría 'El servidor leyó su solicitud y decidió que simplemente no podría molestarse en entretenerlo: Sod Off HaHa'.
Con el último software de servidor web, prácticamente puede excluir los ataques de DOS y el nuevo gen de los navegadores que incorporan capacidades predictivas no causa este problema como algunos han sugerido.
En resumen, el 408 se genera porque el servidor no respondió a la solicitud, en lo que respecta al cliente, la conexión agotó el tiempo de espera, cuando en realidad el servidor leyó la solicitud pero interrumpió la conexión por razones distintas a un tiempo de espera una solicitud.
Tuvimos este mismo problema y lo desconcertamos durante bastante tiempo. La mejor solución que se nos ocurrió fue sugerida por el equipo ELB de AWS Support. Básicamente depende de garantizar que la configuración de tiempo de espera de su servidor httpd sea mayor que su idle timeout
configuración ELB (que por defecto es de 60 segundos).
Timeout
valor de su directiva apache sea el doble de la idle timeout
configuración de su ELB.KeepAlive
función, asegúrese de que MaxKeepAliveRequests
sea muy grande (0 para infinito o muy alto, como 2000), y que KeepAliveTimeout
sea mayor que sus ELB idle timeout
.Descubrimos que la KeepAlive
configuración (y la configuración asociada) redujo específicamente la cantidad de 408 a efectivamente 0 (vemos algunas, pero muy pocas).
Tuve este problema detrás de AWS Elastic Load Balancer. Las comprobaciones de estado generaron una horrible cantidad de 408 respuestas en el registro.
La única solución que funcionó para mí era tener Tiempo de espera inactivo del equilibrador de carga de la configuración más baja que su tiempo de espera de respuesta de chequeo .
Un colega comentó recientemente que, si bien mi última publicación dio una explicación válida de cómo un 408 podría tener una asociación con una medida de seguridad, no ofreció ninguna solución.
El registro de acceso canalizado es mi solución personal.
Lo siguiente debería funcionar listo para usar en la mayoría de las configuraciones de Ubuntu, y con ajustes mínimos en otras configuraciones de Apache. Elegí PHP porque es el más fácil de entender. Hay dos scripts: el primero evita que se escriba un 408 en su registro de acceso. El segundo script envía todos los 408 a un archivo de registro separado. De cualquier manera, el resultado no es más 408 en su registro de acceso. Es su elección qué script implementar.
Usa tu editor de texto favorito, yo uso nano. Abra el archivo donde tiene sus directivas 'LogFormat' y 'CustomLog'. Comente los originales con el # habitual y agregue lo siguiente. Puede encontrar estas directivas en el archivo a continuación.
sudo nano / etc / apache2 / sites-available / default
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe
CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog
NOTA: No registro imágenes en mi registro de acceso. En mi archivo etc / apache2 / httpd.conf incluyo la línea
SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog
Si esto no le interesa, elimine el env=!dontlog
de la CustomLog
directiva.
Ahora cree uno de los siguientes scripts PHP ( #!/usr/bin/php
es una referencia a la ubicación del intérprete, asegúrese de que la ubicación sea correcta para su sistema; puede hacerlo escribiendo en el indicador $; whereis php
esto debería devolver algo como php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
. puede ver #!/usr/bin/php
es el correcto para mi configuración).
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) == "") {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
sudo nano /var/log/apache2/PipedAccessLog.php
#!/usr/bin/php
<?php
$file = '/var/log/apache2/access.log';
$file408 = '/var/log/apache2/408.log';
$no408 = '"-" 408 0 "-" "-"';
$stdin = fopen ('php://stdin', 'r');
ob_implicit_flush (true);
while ($line = fgets ($stdin)) {
if($line != "") {
if(stristr($line,$no408,true) != "") {
file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
}
else {
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
}
}
}
?>
Habiendo guardado el PipedAccessLog.php
guión; asegúrese de que la raíz sea propietaria ejecutando lo siguiente en el indicador $.
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
El PipedAccessLog.php
script necesitará permisos de lectura / escritura y ejecución, así que ejecute lo siguiente en el indicador $.
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
Finalmente, para que todo funcione, debe reiniciar el servicio Apache. Ejecute lo siguiente en el indicador $.
sudo service apache2 restart
Si sus registros de Apache se encuentran en otro lugar, cambie las rutas para adaptarlas a su configuración. Buena suerte.
He encontrado que 408 errores están aumentando tanto en número como en frecuencia. El rango de direcciones IP de las que se originan también está creciendo (estos se registran en su propio archivo separado). También hay patrones de registro evidentes que muestran 408 consecutivos de los mismos grupos de IP que no se deben a los tiempos de espera normales del servidor en el sentido de que el originador está intentando conexiones separadas unos 2 o 3 segundos en un patrón cíclico (no hay que esperar un tiempo de espera antes de otro intento de conexión) Los veo como simples intentos de conexión de estilo DDOS. En mi opinión, estos son un tipo de mensaje de confirmación para el creador de que un servidor está en línea ... luego regresan más tarde con diferentes herramientas ... Si aumenta su intervalo de tiempo de espera, simplemente les está dando una asignación de tiempo más grande para que se ejecuten sus programas de hack dentro.