Ich bekomme viele Anfragen in unseren Apache-Logs, 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 kein User-Agent zu geben. Hat das schon mal jemand gesehen?
Ich bekomme viele Anfragen in unseren Apache-Logs, 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 kein User-Agent zu geben. Hat das schon mal jemand gesehen?
Antworten:
Führen Sie Ihre Webserver möglicherweise in Amazon hinter einem Elastic Load Balancer aus?
Es scheint, dass sie aufgrund ihrer Gesundheitskontrollen eine Menge von 408 Antworten generieren .
Einige der Lösungen aus diesem Forenthread:
RequestReadTimeout header=0 body=0
Dadurch werden die 408 Antworten deaktiviert, wenn eine Anforderung eine Zeitüberschreitung aufweist.
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 aus diesem Blogeintrag :
RequestReadTimeout header=0 body=0
würde das Zeitlimit für das Lesen von Anfragen alle zusammen deaktivieren, ich würde dies nicht empfehlen
Etwas verbindet sich mit dem Port und sendet dann niemals Daten. HTTP 408 ist ein "Timeout" -Fehler. Hier gibt es eine gute Beschreibung: http://www.checkupdown.com/status/E408.html
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 früheren Kommentatoren zeigt 408 eine Zeitüberschreitung an; und es gibt eine ganze Reihe von Umständen, unter denen Timeouts auf einem Webserver auftreten.
Trotzdem können in einer Vielzahl von Fällen, in denen Ihr Server auf Exploits überprüft wird, 408 Fehler generiert werden. In solchen Fällen stellen Clients selten einen Benutzeragenten bereit und beenden Verbindungen häufig abrupt, was zu einem Abbruch des Herunterfahrens dieser Verbindung führt, was zu einem 408-Fehler führen kann.
Nehmen wir zum Beispiel an, ich bin ein heimtückischer Hacker, der das Internet nach Computern durchsucht, die immer noch für die POODLE-Sicherheitsanfälligkeit anfällig sind. Als solches 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. Dieses erste Skript baut lediglich eine Verbindung mit openssl auf, um nach SSLv3 zu suchen:
openssl s_client -connect [IP]:443 -ssl3
Dieser Befehl führt in vielen Apache-Konfigurationen zu einer 408-Nachricht, genau wie Sie sie beschrieben haben. Die Ausführung dieses Befehls auf zwei eigenen Servern 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 keine Form des Lastenausgleichs verwendet, 408 Fehler unter verschiedenen Umständen auftreten können - einige böswillig, einige weisen auf Probleme mit dem Client hin, andere auf Probleme mit dem Server. (Ich habe in dem von OP bereitgestellten Protokoll festgestellt, dass eine lokale IP als Remote-IP angegeben wurde, OP erwähnte jedoch nicht ausdrücklich die Verwendung eines Lastenausgleichs, sodass ich nicht sicher war, ob OP für diese Zwecke einfach eine nicht routbare IP verwendet hatte der Demonstration, wie er es mit der URL tat)
Wie auch immer, obwohl mein Beitrag offensichtlich zu spät 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.
Es gibt verschiedene Gründe für ein 408 Timeout. Aber gehen wir mal davon aus, dass alles in Ordnung ist, dann tauchen diese 408 irgendwann in Ihrem Zugriffsprotokoll auf - also 408 0 "-" "-".
Wie viele im Netz betonen, stellt ein 408 eine Verbindung dar, die hergestellt wird, aber in der entsprechenden Zeitskala wird keine Anfrage gesendet, weshalb der Server die Verbindung mit einem 408 abbricht - "Welchen Teil von Timeout verstehst du nicht".
Ich denke, das ist eine unerfahrene Antwort und zeigt ein völliges Unverständnis darüber, 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 werden, ist die enorme Anzahl von Angriffen, die Sie täglich erhalten. Was machen Sie jetzt damit? Nun: Sie wenden Ihre gewählten Sicherheitsmethoden an, um damit umzugehen. Dies ändert sich.
Nehmen wir ein sehr einfaches Beispiel: Geben Sie eine IP-Adresse ein. 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 hat.
Nehmen wir nun ein erweitertes Beispiel: Trennen Sie die Verbindung anhand einiger Kriterien. In einer Iptabes-Datei (rules.v4) ist "-EINGABE -p tcp -m tcp --dport 80 -m Zeichenfolge --string" cgi "--algo bm --to 1000 -j DROP" enthalten. Dies ist anders, da 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. Wenn Sie diese Unterzeichenfolge finden, gehen Sie zu keiner Trennen Sie einfach die Verbindung.
Hier ist die Sicherheitsmethode gut, aber was Ihre Protokolle betrifft irreführend. Das 408 0 "-" "-", das generiert wird, ist das Beste, was Apache unter diesen Umständen tun kann. Die Verbindung wurde hergestellt und die Anforderung musste bis zu einem bestimmten Punkt akzeptiert werden, um die Zeichenfolgenvergleichsregel anzuwenden. Dies führt letztendlich zu einer 408, 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 wurde empfangen (unter diesen Umständen ist sie nur nicht sichtbar). Obwohl ein 408 generiert wird, handelt es sich nicht um ein Timeout. Ihr Server hat die Verbindung einfach getrennt, nachdem die Anforderung in Verbindung mit Ihrer Firewall-Regel gestellt wurde. Es gibt viele andere Regeln, die dieselbe Situation schaffen würden. Don'
Im Idealfall würde es einen anderen von Apache generierten Fehlercode geben, zum Beispiel '499', was bedeutet: 'Server hat Ihre Anfrage gelesen und festgestellt, dass es einfach nicht stört, Sie zu unterhalten - Sod Off HaHa'.
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 auf die Anforderung nicht geantwortet hat, was das Timeout der Verbindung für den Client betrifft, wenn der Server in Wirklichkeit die Anforderung gelesen hat, die Verbindung jedoch aus anderen Gründen als einem Wartezeitlimit abgebrochen hat eine Anfrage.
Wir hatten genau dieses Problem und haben eine ganze Weile darüber nachgedacht. Die beste Lösung wurde vom ELB-Team des AWS-Supports vorgeschlagen. Es hängt im Wesentlichen davon ab, dass sichergestellt wird, dass die Timeout-Einstellungen Ihres httpd-Servers alle größer sind als Ihre ELB- idle timeout
Einstellung (die standardmäßig 60 Sekunden beträgt).
Timeout
Anweisungswert doppelt so hoch ist wie die idle timeout
Einstellung Ihres ELB.KeepAlive
Funktion, und stellen Sie sicher, dass sie MaxKeepAliveRequests
sehr groß ist (entweder 0 für unendlich oder sehr hoch, wie 2000) und KeepAliveTimeout
größer als Ihre ELBs idle timeout
.Wir haben festgestellt, dass durch die KeepAlive
Einstellung (und die zugehörigen Einstellungen) die Anzahl der 408-Sekunden auf 0 reduziert wurde (wir sehen nur wenige, aber nur sehr wenige).
Ich hatte dieses Problem hinter AWS Elastic Load Balancer. Die Integritätsprüfungen ergaben eine schreckliche Anzahl von 408 Antworten im Protokoll.
Die einzige Lösung , die für mich gearbeitet wurde haben Load Balancer Idle Timeout Einstellung niedriger als der Gesundheitscheck der Antwort - Timeout .
Ein Kollege bemerkte kürzlich, dass mein letzter Beitrag zwar eine gültige Erklärung lieferte, wie ein 408 mit einer Sicherheitsmaßnahme in Verbindung gebracht werden könne, aber keine Lösung bot.
Piped Access Log ist meine persönliche Lösung.
Das Folgende sollte bei den meisten Ubuntu-Konfigurationen sofort funktionieren und bei anderen Apache-Konfigurationen nur minimale Änderungen erfordern. 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 408s an eine separate Protokolldatei. In beiden Fällen ist das Ergebnis nicht mehr 408s in Ihrem Zugriffsprotokoll. Sie entscheiden, welches Skript Sie implementieren möchten.
Benutze deinen bevorzugten Texteditor, ich benutze Nano. Öffnen Sie die Datei mit Ihren Anweisungen 'LogFormat' und 'CustomLog'. Kommentieren Sie die Originale mit dem üblichen # aus und fügen Sie Folgendes hinzu. Diese Anweisungen finden Sie 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 meiner etc / apache2 / httpd.conf Datei 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 CustomLog
Richtlinie.
Jetzt ist einer der folgenden PHP - Skripte erstellen ( #!/usr/bin/php
ist ein Verweis auf die Lage des Dolmetschers, stellen Sie sicher , dass der Standort für Ihr System korrekt ist - man kann dies auf $ prompt durch Eingabe tun; whereis php
- dies sollte so etwas wie zurückkehren php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gz
Wie Sie. kann sehen, #!/usr/bin/php
ist richtig für mein Setup).
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 PipedAccessLog.php
Skript gespeichert haben ; Stellen Sie sicher, dass root Eigentümer ist, indem Sie an der Eingabeaufforderung $ Folgendes ausführen.
sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php
Das PipedAccessLog.php
Skript benötigt Lese- / Schreib- und Ausführungsberechtigungen. Führen Sie daher Folgendes an der Eingabeaufforderung $ aus.
sudo chmod 755 /var/log/apache2/PipedAccessLog.php
Zum Schluss müssen Sie den Apache-Dienst neu starten, damit alles funktioniert. Führen Sie an der Eingabeaufforderung $ Folgendes aus.
sudo service apache2 restart
Wenn sich Ihre Apache-Protokolle an anderer Stelle befinden, ändern Sie die Pfade entsprechend Ihrer Konfiguration. Viel Glück.
Ich habe festgestellt, dass 408 Fehler sowohl in der Anzahl als auch in der Häufigkeit zunehmen. Der Bereich der IP-Adressen, von denen sie stammen, wächst ebenfalls (diese werden in einer eigenen separaten Datei protokolliert). Es gibt auch offensichtliche Protokollmuster, die aufeinanderfolgende 408 aus denselben IP-Gruppen anzeigen, die nicht auf normale Server-Zeitüberschreitungen zurückzuführen sind, da der Absender in einem zyklischen Muster versucht, Verbindungen im Abstand von 2 oder 3 Sekunden herzustellen (es wird nicht auf eine Zeitüberschreitung gewartet) Verbindungsversuch) Ich betrachte diese als einfache Verbindungsversuche im DDOS-Stil. Meiner Meinung nach handelt es sich hierbei um eine Art Bestätigungsnachricht für den Absender, dass ein Server online ist. Sie werden später mit verschiedenen Tools wieder angezeigt ihre Hack-Programme innerhalb.