it-swarm.com.de

Es werden 408 Fehler in unseren Protokollen ohne Anforderung oder Benutzeragenten angezeigt

Ich bekomme viele Anfragen in unseren Apache-Protokollen, die so aussehen

www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -

Es scheint keine Anfrage und keinen Benutzeragenten zu geben. Hat das schon mal jemand gesehen?

38
Glenn Slaven

Führen Sie Ihre Webserver zufällig in Amazon hinter einem Elastic Load Balancer aus?

Es scheint sie generieren aufgrund ihrer Gesundheitsprüfungen viele 408 Antworten .

Einige der Lösungen aus diesem Forenthread:

  • RequestReadTimeout header=0 body=0

    Dadurch werden die 408 Antworten deaktiviert, wenn bei einer Anforderung eine Zeitüberschreitung auftritt.

  • Ändern Sie die ELB-Integritätsprüfung in einen anderen Port.
  • Deaktivieren Sie die Protokollierung für die ELB-IP-Adressen mit:

    SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
    CustomLog logs/access_log common env=!exclude_from_log
    

Und von dieser Blog-Beitrag :

  • Passen Sie Ihr Anforderungszeitlimit auf 60 oder höher an.
32
Ladadadada

Hier gibt es bereits einige gute Antworten, aber ich möchte einen zusätzlichen Hinweis riskieren, der nicht speziell angesprochen wurde. Wie viele der bereits erwähnten vorherigen Kommentatoren, gibt 408 eine Zeitüberschreitung an; und es gibt eine ganze Reihe von Umständen, unter denen auf einem Webserver Zeitüberschreitungen auftreten.

Trotzdem können 408 Fehler in einer Vielzahl von Fällen generiert werden, in denen Ihr Server nach Exploits durchsucht wird. Clients präsentieren in solchen Fällen selten einen Benutzeragenten und beenden Verbindungen häufig abrupt, was zu einem fehlgeschlagenen Herunterfahren dieser Verbindung führt, was zu einem 408-Fehler führen kann.

Nehmen wir zum Beispiel an, ich bin ein hinterhältiger Hacker, der das Internet nach Computern durchsucht, die immer noch anfällig für die POODLE-Sicherheitsanfälligkeit sind. Aus diesem Grund habe ich ein Skript geschrieben, das Verbindungen zu großen Teilen von IP-Adressen öffnet, um Server zu finden, die SSL Version 3 akzeptieren. Später werde ich diese Liste verwenden, um gezielt nach dem POODLE-Exploit zu suchen. Alles, was dieses erste Skript tut, ist eine Verbindung mit openssl herzustellen, um nach SSLv3 zu suchen, wie folgt:

openssl s_client -connect [IP]:443 -ssl3

Dieser Befehl führt in vielen Konfigurationen von Apache zu einer 408-Nachricht, genau wie Sie es beschrieben haben. Das Ausführen dieses Befehls auf zwei meiner eigenen Server führte zu diesem Eintrag im Zugriffsprotokoll:

<remote IP address>  - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"

Ich wollte dies klarstellen, da selbst in einer Situation, in der OP keinen Lastenausgleich verwendet, 408 Fehler unter verschiedenen Umständen auftreten können - einige sind böswillig, andere weisen auf Probleme mit dem Client hin und andere auf Probleme mit dem Server. (Ich habe in dem von OP bereitgestellten Protokoll festgestellt, dass eine lokale IP als Remote-IP angegeben wurde, aber OP erwähnte nicht ausdrücklich die Verwendung eines Load Balancers, sodass ich nicht sicher war, ob OP einfach eine nicht routbare IP für diese Zwecke verwendet hatte der Demonstration, wie er es mit der URL tat)

Wie auch immer, obwohl mein Beitrag offensichtlich viel zu spät am Tag ist, um dem OP zu helfen, könnte er hoffentlich anderen helfen, die hier ankommen und nach einer Lösung für all diese verdammten Timeout-Fehler suchen.

11
Josh Wieder

Etwas stellt eine Verbindung zum Port her und sendet dann niemals Daten. HTTP 408 ist ein "Timeout" -Fehler. Hier gibt es eine gute Beschreibung: http://www.checkupdown.com/status/E408.html

9
Insyte

Es gibt verschiedene Gründe für ein 408-Timeout. Aber gehen wir davon aus, dass alles in Ordnung ist, und irgendwann erscheinen diese 408 in Ihrem Zugriffsprotokoll - d. H. 408 0 "-" "-".

Wie viele im Internet darauf hinweisen, stellt ein 408 dar, dass eine Verbindung hergestellt wurde, aber keine Anfrage in der entsprechenden Zeitskala gesendet wurde. Daher trennt der Server die Verbindung mit einem 408. Eine arrogante Person antwortete tatsächlich auf jemanden, der um Hilfe zu diesem Problem bat - "Welchen Teil von Timeout verstehst du nicht".

Ich denke, das ist eine unerfahrene Antwort und zeigt einen völligen Mangel an Verständnis dafür, wie einige Sicherheitsmethoden mit Webserver-Software funktionieren.

Also zurück zum Anfang, warum sehe ich all diese 408er? Eine Sache, die Sie mit dem Rest von uns, der einen Server verwaltet, gemeinsam haben, ist die große Anzahl von Angriffen, die Sie täglich erhalten. Was machen Sie nun damit? Nun: Sie wenden die von Ihnen gewählten Sicherheitsmethoden an, um damit umzugehen. Dies ändert sich.

Nehmen wir ein sehr einfaches Beispiel: Löschen Sie eine IP-Adresse. In einer iptabes-Datei (rules.v4) ist "-A ufw-user-input -s 37.58.64.228 -j DROP" enthalten. Mit 37.58.64.228 erkennt die Firewall die IP und trennt die Verbindung. In vielen Konfigurationen würden Sie nicht einmal wissen, dass es an die Tür geklopft ist.

Nehmen wir nun ein erweitertes Beispiel: Trennen Sie die Verbindung anhand einiger Kriterien. In einer iptabes-Datei (rules.v4) ist "-A INPUT -p tcp -m tcp --dport 80 -m string --string" cgi "--algo bm --to 1000 -j DROP" enthalten. Dies ist anders, weil wir in dieser iptable-Regel sagen, dass Sie sich die ersten 1000 Bytes der Anforderungszeichenfolge ansehen und prüfen, ob Sie eine Unterzeichenfolge von "cgi" finden können, und wenn Sie diese Unterzeichenfolge finden, gehen Sie keine Trennen Sie einfach die Verbindung.

Hier ist die Sicherheitsmethode gut, aber was Ihre Protokolle betrifft, ist dies irreführend. Die generierte 408 0 "-" "-" ist das Beste, was Apache unter diesen Umständen tun kann. Die Verbindung wurde hergestellt und die Anforderung musste bis zu einem gewissen Punkt akzeptiert werden, um die Zeichenfolgenvergleichsregel anzuwenden, die letztendlich zu einer 408 führt, da Ihre Regel die Kriterien für das Trennen der Verbindung erfüllt. Unsere kleinen Neulinge könnten also nicht falscher liegen, wenn sie es versuchen würden. Es wurde eine Verbindung hergestellt und eine Anfrage empfangen (unter diesen Umständen ist sie einfach nicht sichtbar). Obwohl ein 408 generiert wird, handelt es sich nicht um eine Zeitüberschreitung. Ihr Server hat die Verbindung einfach getrennt, nachdem die Anforderung in Verbindung mit Ihrer Firewall-Regel gestellt wurde. Es gibt viele andere Regeln, die die gleiche Situation schaffen würden. Akzeptieren Sie die Erklärung zu Server Error Code 408 - "Zeitüberschreitung bei Anforderung" nicht zu wörtlich.

Im Idealfall würde es einen anderen von Apache generierten Fehlercode geben, zum Beispiel "499", was "Server hat Ihre Anfrage gelesen und entschieden, dass es einfach nicht gestört werden könnte, Sie zu unterhalten - Sod Off HaHa" bedeutet.

Mit der neuesten Webserver-Software können Sie DOS-Angriffe praktisch ausschließen, und das neue Gen von Browsern mit Vorhersagefunktionen verursacht dieses Problem nicht, wie einige vorgeschlagen haben.

Kurz gesagt, der 408 wird generiert, weil der Server nicht auf die Anforderung geantwortet hat. Für den Client ist die Verbindung abgelaufen. In Wirklichkeit hat der Server die Anforderung gelesen, die Verbindung jedoch aus anderen Gründen als einer Wartezeit abgebrochen eine Anfrage.

6
Kev

Wir hatten genau dieses Problem und rätselten eine ganze Weile darüber. Die beste Lösung, die wir gefunden haben, wurde vom ELB-Team des AWS-Supports vorgeschlagen. Es hängt im Wesentlichen davon ab, ob die Timeout-Einstellungen Ihres httpd-Servers alle größer sind als Ihre ELB-Einstellung idle timeout (standardmäßig 60 Sekunden).

  • Stellen Sie sicher, dass Ihr Apache Timeout Direktivenwert doppelt so hoch ist wie die Einstellung idle timeout Ihrer ELB.
  • Aktivieren Sie die Funktion KeepAlive, und stellen Sie sicher, dass MaxKeepAliveRequests sehr groß ist (entweder 0 für unendlich oder sehr hoch, wie 2000) und dass KeepAliveTimeout größer ist als der idle timeout Ihrer ELB.

Wir haben festgestellt, dass die Einstellung KeepAlive (und die zugehörigen Einstellungen) die Anzahl der 408s speziell auf effektiv 0 reduziert hat (wir sehen einige, aber nur sehr wenige).

5
dsummersl

Ich hatte dieses Problem hinter AWS Elastic Load Balancer. Gesundheitsprüfungen erzeugten eine schreckliche Anzahl von 408 Antworten im Protokoll.

Die einzige Lösung, die für mich funktioniert hat, war, dass Load Balancer's Idle Timeout Einstellung niedriger als Health Check's Response) ist Timeout.

3

Ein Kollege bemerkte kürzlich, dass mein letzter Beitrag zwar eine gültige Erklärung enthielt, wie ein 408 mit einer Sicherheitsmaßnahme in Verbindung gebracht werden könnte, aber keine Lösung bot.

Das Piped Access-Protokoll ist meine persönliche Lösung.

Das Folgende sollte bei den meisten Ubuntu-Konfigurationen sofort und bei anderen Apache-Konfigurationen mit minimalem Basteln funktionieren. Ich habe PHP gewählt, weil es am einfachsten zu verstehen ist. Es gibt zwei Skripte: Das erste verhindert, dass ein 408 in Ihr Zugriffsprotokoll geschrieben wird. Das zweite Skript sendet alle 408 an eine separate Protokolldatei. In beiden Fällen enthält das Zugriffsprotokoll keine 408 Sekunden mehr. Sie haben die Wahl, welches Skript implementiert werden soll.

Verwenden Sie Ihren bevorzugten Texteditor, ich verwende Nano. Öffnen Sie die Datei mit den Anweisungen 'LogFormat' und 'CustomLog'. Kommentieren Sie die Originale mit der üblichen Nummer aus und fügen Sie Folgendes hinzu. Sie finden diese Anweisungen in der folgenden Datei.

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

HINWEIS: Ich protokolliere keine Bilder in meinem Zugriffsprotokoll. In meine Datei etc/Apache2/httpd.conf füge ich die Zeile ein

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog

Wenn dies für Sie nicht von Interesse ist, entfernen Sie die env=!dontlog Aus der Direktive CustomLog.

Erstellen Sie nun eines der folgenden PHP - Skripte (#!/usr/bin/php Ist ein Verweis auf den Speicherort des Interpreters). Stellen Sie sicher, dass der Speicherort für Ihr System korrekt ist. Sie können dies tun, indem Sie Eingabe an der $ Prompt; whereis php - dies sollte etwas wie php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz zurückgeben. Wie Sie sehen können, ist #!/usr/bin/php für mein Setup richtig.

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);
      }
    }
  }
?>

Das Skript PipedAccessLog.php Gespeichert haben; Stellen Sie sicher, dass root Eigentümer ist, indem Sie Folgendes an der $ Prompt ausführen.

Sudo chown -R root:adm /var/log/Apache2/PipedAccessLog.php

Das Skript PipedAccessLog.php Benötigt Lese-/Schreib- und Ausführungsberechtigungen. Führen Sie daher an der Eingabeaufforderung $ Folgendes aus.

Sudo chmod 755 /var/log/Apache2/PipedAccessLog.php

Um alles zum Laufen zu bringen, müssen Sie den Apache-Dienst neu starten. Führen Sie an der $ Prompt Folgendes aus.

Sudo service Apache2 restart

Wenn sich Ihre Apache-Protokolle an einer anderen Stelle befinden, ändern Sie die Pfade entsprechend Ihrer Konfiguration. Viel Glück.

0
Kev