Forum: Mikrocontroller und Digitale Elektronik Unbekannte eingehende TCP Verbindung, was tun?


von AVRli .. (avrli)


Lesenswert?

Hi,

ich beschäftige mich seit kurzem etwas intensiver mit 
Netzwerkprotokollen. In zwischen bin ich soweit das ich einen kleinen 
HTTP Server programmiert habe und der im lokalen Netzwerk 1A läuft.

Der Client stellt seine Anfrage mit:

GET / HTTP/1.1
Host: 192.168.178.25
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0)
Accept: text/html
Accept-Language: de
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive

Bekommt darauf hin eine Antwort mit der index.htm. Alles soweit ok.
Nun habe ich über eine Dynamische IP Anmeldung den kleinen Webserver an 
das Internet durch meinen Router angebunden. Portfreigabe im Router ist 
Port 80 auf die IP von dem Webserver.

Nun kommt es gelegentlich dazu das von draußen Verbindungen aufgebaut 
werden und KEINE richtigen GET Anfragen enthalten sondern lediglich 
irgendwelche Zeichen zwischen 12 und 25 Byte. Diese werden nie mit dem 
CRLFCRLF abgeschlossen sondern die Verbindung bleibt einfach im Leerlauf 
bestehen.

Was ist das, wie behandelt man so etwas am besten?

Grüße AVRli...

von Peter II (Gast)


Lesenswert?

AVRli ... schrieb:
> Was ist das, wie behandelt man so etwas am besten?

einen Timeout festlegen. bzw. 2 Timeouts. Einen Timeout bis eine gültige 
anfrage kommt und einen timeout wie lange zwischen 2 Bytes vergehen 
dürfen.

Wenn der/dir Timeout zuschlagen, einfach die Verbindung beenden.

von Stefan F. (Gast)


Lesenswert?

> Was ist das, wie behandelt man so etwas am besten?

Das ist die Realität im Internet. Mach dich drauf gefasst, das solche 
Anfagen immer mehr werden, je länger der Server im Netz hängt.

Bei mir ist es mal so schlimm geworden, dass mein DSL Anschluss 
zeitweise nicht mehr zu gebrauchen war.

Kleiner Tip: Mikrocontroller gehören nicht direkt ans Internet 
Angeschlossen. Da gehört mindestens eine Firewall vorgeschaltet, die 
unerwünschte und fehlerhafte Requests raus filtert und DOS Angriffe 
verhindert. Für private Zwecke bieten sich auch VPN Tunnel an.

von Sebastian W. (wangnick)


Lesenswert?

AVRli ... schrieb:
> Was ist das, wie behandelt man so etwas am besten?

1. Mit Wireshark die Netzwerkpakete analysieren.
2. Ist Connection: close im reply?

LG, Sebastian

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Us schrieb:
> Kleiner Tip: Mikrocontroller gehören nicht direkt ans Internet
> Angeschlossen.

Nein, Protokollimplementierungen sollten robust genug sein, dass sie
den Unsinn ordentlich verwerfen.

von Ulrich F. (Gast)


Lesenswert?

> Was ist das, wie behandelt man so etwas am besten?

Ist das ein Webserver?
Wohl ja ....
Ein solcher Webserver beantwortet alle Zugriffe, in der Regel, mit einem 
HTTP Statuscode.
Status 400 (oder 408) bietet sich in deinem Fall an.

von Peter II (Gast)


Lesenswert?

Ulrich F. schrieb:
> Wohl ja ....
> Ein solcher Webserver beantwortet alle Zugriffe, in der Regel, mit einem
> HTTP Statuscode.
> Status 400 (oder 408) bietet sich in deinem Fall an.

aber nur wenn eine sinnvoll anfrage kam, und das ist hier noch nicht der 
fall gewesen.

von AVRli .. (avrli)


Lesenswert?

Danke für die schnellen Antworten,
Vielleicht mache ich auch noch was falsch.

Ich lese derzeit die Clientanfrage Zeilenweise ein bis ein CRLFCRLF 
kommt. Das einizige was ich mir genauer ansehe ist die GET Zeile, also 
welche Datei angefordert wird.

Wenn nun die wirren Zeichen kommen, regiert mein Server nicht weil das 
CRLFCRLF fehlt. Die Verbindung besteht und nichts passiert mehr.

Ein Timeout wäre noch ein Ansatz, was ich auch noch nachvollziehen 
könnte: ein Filter auf gültige Zeichen nur welche sind das? Ich habe 
versucht in den RFC's was zu finden doch die Infos sind unüberschaubar 
viel.

Dann wäre es super den Client "verhungern" zu lassen also garnicht mehr 
zu antworten, nur geht das überhaupt?

Das es sich eventuell um Angriffe handelt hätte ich nun nicht erwartet 
aber das wäre mir dann schon wichtig das die vernünftig abgehandelt 
werden. Eine weitere Firewall würde ich nun nicht so prima finden.

Ich frage mich auch die ganze Zeit wie groß das Risiko eines µC's am 
Internet so ist.

Grüße AVRli...

von Jay (Gast)


Lesenswert?

Folgendes:
Jede Anfrage beginnt IMMER mit einer Anfragemethode( 
http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP-Anfragemethoden 
). Wenn ich mich richtig erinnere, muss ein Webserver nur GET 
implementieren. Wenn also die ersten drei Zeichen nicht GET sind, könnte 
man mit einem 501 antworten.
(Wenn der Webserver mehr kann muss man natürlich auch mehr abfragen)

von Peter II (Gast)


Lesenswert?

AVRli ... schrieb:
> Ein Timeout wäre noch ein Ansatz, was ich auch noch nachvollziehen
> könnte: ein Filter auf gültige Zeichen nur welche sind das? Ich habe
> versucht in den RFC's was zu finden doch die Infos sind unüberschaubar
> viel.

und was ist wenn gar kein Zeichen kommt? Du brauchst zwingend einen 
Timeout. Sonst schickt dir jemand ein paar hundert Verbindungen ohne 
Daten und das wars dann für deinen Server.

von Peter II (Gast)


Lesenswert?

Jay schrieb:
> Wenn also die ersten drei Zeichen nicht GET sind, könnte
> man mit einem 501 antworten.

und wenn gar kein Zeichen kommt? Oder nur ein "G" ?

von Ulrich F. (Gast)


Lesenswert?

Peter II schrieb:
> aber nur wenn eine sinnvoll anfrage kam, und das ist hier noch nicht der
> fall gewesen.


Genau deswegen, wegen den nicht sinnvoll interpretierbaren Anfragen, 
wurde dieses erfunden:
> 400  Bad Request  Die Anfrage-Nachricht war fehlerhaft aufgebaut.


Teste deinen Apache, wie der reagiert...

Zum Sicherheitsaspekt:
Wenn über Port 80 zu dem Webserver eine Verbindung aufgebaut wurde, weiß 
der "Gegner" doch sowieso schon, dass da ein Server hinter steckt. Es 
gibt also wirklich wenig Grund, nicht angemessen zu reagieren.

von Peter II (Gast)


Lesenswert?

Ulrich F. schrieb:
> Genau deswegen, wegen den nicht sinnvoll interpretierbaren Anfragen,
> wurde dieses erfunden:

und wann soll er die schicken? Was ist wenn eine Verbindung ankommt und 
ein nur "G" drin steht?

von AVRli .. (avrli)


Lesenswert?

Jay schrieb:
> Wenn also die ersten drei Zeichen nicht GET sind, könnte
> man mit einem 501 antworten.

Ja auch nicht schlecht, wenn GET immer das erste sein muss.

Peter II schrieb:
> und was ist wenn gar kein Zeichen kommt?

Ja hab ich übersehen, logisch dann ist die Verbindung da und nichts geht 
mehr... :-(

Mit ws sich die Leute so befassen (Angreifer, Spinner im Netz), ist echt 
nicht zu fassen. Da freu ich mich über die neuen Möglichkeiten und dann 
so ein Quatsch. :-(

Grüße AVRli...

von Christian B. (casandro)


Lesenswert?

Das sind ganz normale Portscans. Das passiert ständig. Ist nicht schlimm 
und bedeutet auch nicht, dass Dir irgendjemand was Böses will.

Da ist halt jemand ein wenig neugierig.

von Ulrich F. (Gast)


Lesenswert?

Peter II schrieb:
> Ulrich F. schrieb:
>> Genau deswegen, wegen den nicht sinnvoll interpretierbaren Anfragen,
>> wurde dieses erfunden:
>
> und wann soll er die schicken? Was ist wenn eine Verbindung ankommt und
> ein nur "G" drin steht?

Ein einzelnes G wird keinem Webserver reichen!
Also einen Status 400 und Verbindung.close()

Mein Vorschlag:
Einen Endlichen Automaten auf den Datenstrom ansetzen.
Wenn er es Interpretiert bekommt, einen positiv bestätigenden Status 
Code senden, und wenn der Interpreter den Request nicht versteht, einen 
ablehnenden Code.
Ausgestattet, mit einem Timeout ist das eine runde Sache, welche den 
Gepflogenheiten im Webserverumfeld gerecht wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

AVRli ... schrieb:
> Dann wäre es super den Client "verhungern" zu lassen also garnicht mehr
> zu antworten, nur geht das überhaupt?

Klar geht das.  Für die angefrühstückte HTTP-Verbindung musst du aber
auf Serverseite Ressourcen belegen, um die TCP-Verbindung offen zu
halten.

Timeout, danach Pumpe.

von Bernd K. (prof7bit)


Lesenswert?

Jörg Wunsch schrieb:
> Klar geht das.  Für die angefrühstückte HTTP-Verbindung musst du aber
> auf Serverseite Ressourcen belegen, um die TCP-Verbindung offen zu
> halten.

Er kann einfach den Socket schließen ohne vorher shutdown() zu machen, 
dann bemerkt die Gegenseite nichts aber der Socket ist trotzdem weg.

von AVRli .. (avrli)


Lesenswert?

Klar ist eine sauberes Frage/Antwort Spiel die feinere Art, doch wenn 
mich einer anpöpelt, und so sehe ich ein sinnloses "probieren" auf Port 
X an IP Z an, mag ich mich mit dem nicht unterhalten.

Gut er weiß es kommt eine Verbindung auf Port 80 an IP X zustande nur 
wenn nix zurück kommt hat er sich das verdient...

Oder wäre die ERROR 400 Status eine sauberere Sache für alle beteiligte 
im Netz weil unnötiger Traffic vermieden würde?

Ich werde mal eine Nacht mit dem Timeout probieren. Mal schauen ob das 
geht. Ich bin noch nicht ganz darüber hinweg mit was man sich so alles 
auseinandersetzen muß... ;-) Ich renne doch auch nicht die Straße 
entlang und schauen an jedem Auto ob die Tür auf ist...

Grüße AVRli...

von paele (Gast)


Lesenswert?

AVRli ... schrieb:
> Ich frage mich auch die ganze Zeit wie groß das Risiko eines µC's am
> Internet so ist.

Steuert das Teil ein AKW oder sind personenbezogende Daten drauf?

von paele (Gast)


Lesenswert?

AVRli ... schrieb:
> Ich lese derzeit die Clientanfrage Zeilenweise ein bis ein CRLFCRLF
> kommt. Das einizige was ich mir genauer ansehe ist die GET Zeile, also
> welche Datei angefordert wird.

Cool, was passiert wenn ich dir überlange Zeilen schicke?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

AVRli ... schrieb:
> Oder wäre die ERROR 400 Status eine sauberere Sache

Brauchst du nicht.  Einfach dicht machen nach XX Sekunden, macht
jeder andere Webserver auch so.

von AVRli .. (avrli)


Lesenswert?

paele schrieb:
> Steuert das Teil ein AKW oder sind personenbezogende Daten drauf?

Och ich möchte einfach nicht das die eigentliche Funktion, Anbindung ans 
Netz, durch Spielerei ausgehebelt werden kann.


paele schrieb:
> Cool, was passiert wenn ich dir überlange Zeilen schicke?

Mehr als 80 Zeichen pro Zeile interessieren nicht. Dann ignoriert er 
alles weitere bis zum CR.


Jörg Wunsch schrieb:
> Brauchst du nicht.  Einfach dicht machen nach XX Sekunden, macht
> jeder andere Webserver auch so.

OK Danke, ich baue das mal ein und schaue was heute Nacht passiert.

Grüße AVRli...

von Rolf M. (rmagnus)


Lesenswert?

Jörg Wunsch schrieb:
> Stefan Us schrieb:
>> Kleiner Tip: Mikrocontroller gehören nicht direkt ans Internet
>> Angeschlossen.
>
> Nein, Protokollimplementierungen sollten robust genug sein, dass sie
> den Unsinn ordentlich verwerfen.

Es ist selbst bei ganz großen Servern der Standardfall, daß der Server 
nicht direkt am Internet hängt. Warum sollte man das ausgerechnet bei 
einem µC anders handhaben?

Ulrich F. schrieb:
>> und wann soll er die schicken? Was ist wenn eine Verbindung ankommt und
>> ein nur "G" drin steht?
>
> Ein einzelnes G wird keinem Webserver reichen!
> Also einen Status 400 und Verbindung.close()

Und woher weißt der Server, daß nicht kurz danach noch der Rest kommt? 
Das G ist ja erstmal nicht falsch, sondern nur (noch) unvollständig.

> Ausgestattet, mit einem Timeout ist das eine runde Sache, welche den
> Gepflogenheiten im Webserverumfeld gerecht wird.

Eben, den Timeout braucht man auf jeden Fall.

Jörg Wunsch schrieb:
> AVRli ... schrieb:
>> Dann wäre es super den Client "verhungern" zu lassen also garnicht mehr
>> zu antworten, nur geht das überhaupt?
>
> Klar geht das.  Für die angefrühstückte HTTP-Verbindung musst du aber
> auf Serverseite Ressourcen belegen, um die TCP-Verbindung offen zu
> halten.

Warum? "Verhungern lassen" heißt für mich, daß der Server einfach 
stillschweigend die Verbindung bei sich löscht, aber keinerlei Pakete 
mehr zurückschickt.

von guest (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Klar geht das.  Für die angefrühstückte HTTP-Verbindung musst du aber
> auf Serverseite Ressourcen belegen, um die TCP-Verbindung offen zu
> halten.

So in etwa 65535 Sockets auf einem uC offen halten, wird schwierig. Da 
ja auch auf der Firewall müssen diese Verbindungen in der NAT Table 
gehalten werden. Das macht so manches Homeuser Gerät nicht mit. Somit 
kommen die anderen Geräte auch nicht mehr ins Internet. -> DOS Angriff 
erfolgreich.

Bernd K. schrieb:
> Er kann einfach den Socket schließen ohne vorher shutdown() zu machen,
> dann bemerkt die Gegenseite nichts aber der Socket ist trotzdem weg.

Und auch sie Firewall bemerkt davon nichts. Auswirkungen wie oben.

Ergo alle Requests sauber mit einer Fehlermeldung beantworten und TCP 
Session mit RST beenden.

von Bernd K. (prof7bit)


Lesenswert?

guest schrieb:
> Ergo alle Requests sauber mit einer Fehlermeldung beantworten und TCP
> Session mit RST beenden.

Stimmt, an NAT-Router und dergleichen hab ich dabei nicht gedacht. Also 
shutdown() und close().

Aber für einen HTTP-Statuscode ist kein Platz wenn der HTTP-Handshake 
noch nicht an der Stelle war an der überhaupt der Statuscode hingehört, 
den würde dann eh niemand lesen oder parsen weil unerwartet und falsch 
plaziert. Also einfach RST und schließen, das ist Antwort genug.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Es ist selbst bei ganz großen Servern der Standardfall, daß der Server
> nicht direkt am Internet hängt.

Aber eher zur Lastverteilung.  Ansonsten lässt der Firewall einen
aufgebauten TCP-Stream zum Server durch.  Klar könnte man nun auch
noch auf dem Firewall anfangen, die HTTP-Requests zu tracken und
erstmal gegenüber dem Server zurückzuhalten, aber spätestens bei
HTTP/S wäre dann Schluss mit lustig, es sei denn, du willst dem
Firewall auch noch die Zertifikate anvertrauen.  Dann muss es doch
wieder der Server sauber machen (und macht er ja auch).

Für eine ordentlich aufgesetzte Kiste braucht man eigentlich keinen
Firewall.  Das Risiko, dass die Firewallsoftware Bugs hat, ist kaum
geringer als das Risiko, dass die HTTP-Server-Software welche hat.

von Stefan F. (Gast)


Lesenswert?

> Das Risiko, dass die Firewallsoftware Bugs hat, ist kaum
> geringer als das Risiko, dass die HTTP-Server-Software welche hat.

Erzähl das mal Leuten, die PHP und Java Webserver Anwendungen betreiben.

Dir ist wohl nicht klar, dass Geschäftsanwendungen in aller Regel 100x 
schlampiger entwickelt werden, als so Sachen wie der Apache HTTP Server.

Wenn Zeit und Geld minimiert werden, gleichzeitig aber die Anforderungen 
maximiert werden, kann keine Sichere Software entstehen. Und genau 
dieses Szenario ist in vielen Bereichen der Regelfall.

von Bernd K. (prof7bit)


Lesenswert?

Stefan Us schrieb:
>> Das Risiko, dass die Firewallsoftware Bugs hat, ist kaum
>> geringer als das Risiko, dass die HTTP-Server-Software welche hat.
>
> Erzähl das mal Leuten, die PHP und Java Webserver Anwendungen betreiben.

Ja und was hat das eine mit dem anderen zu tun?

von guest (Gast)


Lesenswert?

Bernd K. schrieb:
> Ja und was hat das eine mit dem anderen zu tun?

Dass eine Firewall eben nicht nur aus einem simplen Paketfilter besteht, 
sondern eben auch in den höheren OSI Schichten agiert und entsprechend 
schädliche Anfragen auf die Webserver erkennen und blockieren kann.

von Peter II (Gast)


Lesenswert?

guest schrieb:
> Dass eine Firewall eben nicht nur aus einem simplen Paketfilter besteht,
> sondern eben auch in den höheren OSI Schichten agiert und entsprechend
> schädliche Anfragen auf die Webserver erkennen und blockieren kann.

soweit die Theorie.

Das dumme daran ist, das die Firewall damit genauso anfällig wird wie 
der Webserver weil sie die Protokolle fehlerfrei Parsen muss.

Damit hat man also 2 Geräte die angreifbar sind.

von AVRli .. (avrli)


Lesenswert?

Ich danke allen für ihre Beiträge, es ist wirklich ein nicht zu 
unterschätzendes Thema. Da freut man sich seinen kleinen ATmega am 
Internet zu haben und dann wird die Sache schnell kritisch...

Ich habe die letzten "Anfragen" ausführlicher mit geloggt... ganz so 
wirr waren sie dann doch nicht!

Es wurden unter anderen PUT, POST, DELETE, HEAD und CONNECT Anfragen 
gesendet. Einige kamen auch nur mit binären Zeichen also nicht lesbar...

Der ATmega macht hier "nur" GET mehr nicht.

Ich habe nun den folgenden Ansatz verfolgt.

Ulrich F. schrieb:
> Einen Endlichen Automaten auf den Datenstrom ansetzen.
> Wenn er es Interpretiert bekommt, einen positiv bestätigenden Status
> Code senden, und wenn der Interpreter den Request nicht versteht,
> einen ablehnenden Code.
> Ausgestattet, mit einem Timeout ist das eine runde Sache, welche den
> Gepflogenheiten im Webserverumfeld gerecht wird.

Positiv ist 200. Wenn ein Kommando <> GET kommt wird es ein 400. Ebenso 
wenn keine oder wirre Zeichen kommen und damit der Timeout zuschlägt, 
kommt nun auch 400. Jeweils mit abschließenden Disconnect(); vom Server.

Nun lasse ich das mal am Netz laufen, die erste Nacht lief 
ausgezeichnet. 18 Verbindungen von irgendwelchen Schlauen wurden alle 
ordentlich behandelt mit dem 400 beendet. Dann lief der Server wieder.

War heute morgen also sofort erreichbar.

Man hat nun sicher noch nicht an alles gedacht aber auf jeden Fall 
bleibt eine unnötige Verbindung nun nicht mehr hängen.

Grüße AVRli...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

AVRli ... schrieb:
> Der ATmega macht hier "nur" GET mehr nicht.

HEAD ist auch verpflichtend, und sollte kein Problem sein zu
implementieren.  Ist ja letztlich das gleiche wie GET, nur dass
eben nur die Response headers aber kein body gesendet werden.

Alle anderen Methoden solltest du mit einem 501 (Not implemented)
beantworten, wenn der Request an sich korrekt ist (also kein Schrott).

Zumindest sagt RFC7231 das so.

von AVRli .. (avrli)


Lesenswert?

Jörg Wunsch schrieb:
> HEAD ist auch verpflichtend

OK, danke für den Hinweis, habe ich nun mit drin, springt auch in die 
gleiche Ausgabe aber eben nur mit Content wenn es GET war.


> ...nur die Response headers...

Welche dieser Header sind eigentlich ZWINGEND erforderlich?
Man kann viel schicken wenn der Tag lang ist aber was braucht man 
wirklich?

> Alle anderen Methoden solltest du mit einem 501 (Not implemented)
> beantworten, wenn der Request an sich korrekt ist

OK, dann baue ich nochmal um... dann nur noch BAD REQUEST wenn der 
Timout zu schlägt... obwohl 501 ja auch "passen" würde, denn Quatsch in 
Form von X nicht Klartext Charakter ja auch "nicht implementiert ist".


> Zumindest sagt RFC7231 das so.

Ja mit den den RFC's ist es für mich schwer :-( das HTTP Protokoll ist 
ein gutes Beispiel, da sind alle Sachen mit drin die vlt ein "echter" 
Server braucht, da das zu filtern was hier auf dem kleinen ATMEGA nun 
gerade wirklich wichtig ist, fällt mir schwer.


Eine schönen Wochenstart,
Gruß AVRli...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

AVRli ... schrieb:

>> ...nur die Response headers...
>
> Welche dieser Header sind eigentlich ZWINGEND erforderlich?

Eine geschlossene Beschreibung dafür finde ich auch nicht.

Ein "Content-Type"-Header "SHOULD (be) include(d)", sofern die
Antwort Inhalt enthält.

"Content-Encoding" muss unter bestimmten Umständen dabei sein,
nämlich dann, wenn das Encoding der Antwort nicht exakt dem des
Requests entspricht.

"Date" "MUST (be) include(d)", sofern der Server eine Uhr hat.
Hat er keine, dann ist er verpflichtet, kein Date zu senden,
darf dann aber kein "Last-Modified" oder "Expires" senden.  Keine
Regel ohne Ausnahme :), es darf optional ein "Expires" gesendet
werden mit einem Zeitstempel, der zum Zeitpunkt der Konfiguration
des Servers oder zuvor liegt, um auf diese Weise den Inhalt als
dauerhaft out of date zu markieren (darf nicht gecachet werden).

"Content-Length" könnte noch sinnvoll sein.  Wenn es vorhanden ist,
soll der Client es benutzen, sonst muss er selbst versuchen, die
Länge zu ermitteln.

> OK, dann baue ich nochmal um... dann nur noch BAD REQUEST wenn der
> Timout zu schlägt...

Wenn der Timeout zuschlägt, ohne dass du einen gültigen Request
gesehen hast, kannst du einfach kommentarlos dicht machen.  Macht
ein Apache auch so.  501 ist nur dafür da, dass du zumindest etwas
bekommen hast, was syntaktisch wie ein HTTP request aussieht.

von AVRli .. (avrli)


Lesenswert?

Jörg Wunsch schrieb...

> Eine geschlossene Beschreibung dafür finde ich auch nicht.

Entschuldige die späte Antwort, war "außer Gefecht".
Danke Dir für die ausführliche Darstellung. In der Tat kann ich damit 
nun was anfangen. Ich habe den kleinen Webserver nun erweitert das er 
HEAD und GET Anfragen beantwortet, sinnlose Sachen ignoriert und bei 
nicht gefundenen Dateien mit 404 antwortet.

Die "Angriffe" sind weniger geworden und vor allem läuft der Server nun 
durch! Was ich ich noch immer frage ist ob es zufällige oder gezielte 
Anfragen sind. Aber das wird so einfach nicht zu klären sein.

Manchmal ist ein Muster zu erkennen, erst sieht man das nur kurz eine 
Verbindung aufgebaut wird und dann fliegt die gleiche (IP) mit einem 
GET, CONNECT oder was weiß ich rein.

Der Server soll soll ja aus dem Netz erreichbar sein, doch zum anderen 
keine Spielwiese werden.

Grüße AVRli...

von Bernd K. (prof7bit)


Lesenswert?

AVRli ... schrieb:
> Der Server soll soll ja aus dem Netz erreichbar sein, doch zum anderen
> keine Spielwiese werden.

Das erreicht man dadurch daß man so wenig wie möglich Spielzeug dort 
hinlegt. Und grundsäzlich überhaupt nur Spielzeug aus Stahlbeton mit 
solidem Fundament und ohne bewegliche Teile ;-)

von jonasbiensack (Gast)


Lesenswert?

Du darfst die ganzen robots der suchmaschinen nicht vergessen, die 
scannen auch ständig das ganze nets. Da muss slso nicht msl jemand mit 
bösen absichten dahinter stecken. Gruß j

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

jonasbiensack schrieb:
> Du darfst die ganzen robots der suchmaschinen nicht vergessen, die
> scannen auch ständig das ganze nets.

Die schicken allerdings saubere Anfragen, nicht irgendwelchen Müll.
Insbesondere fragen alle ordentlich implementierten Suchmaschinen
zuerst nach einem Dokument namens "/robots.txt".  Wenn man keine
Suchmaschinen haben möchte, sollte man darauf diese Antwort geben:
1
User-agent: *
2
Disallow: /

von IUnknown (Gast)


Lesenswert?

Ich habe mal eine Zeit lang ein Raspberry als Server auf Port 80 laufen 
lassen. Nach nur wenigen Stunden waren im log sehr seltsame Anfragen. 
Das meiste davon verstümmelte Zeichenketten, viele nichtdarstellbare 
Zeichen. Sah für mich aus wie der Versuch Bugs auszunutzen oder 
overflows zu erzeugen. Auch gab es viele Anfragen nach diversen 
Konfigurationsseiten, z.b. phpMyAdmin.php oder ähnliches. Auch das sah 
nach dem Versuch aus, das System anzugreifen. Ich hab auch mal ein µC 
mit Ethernetadapter ans Netz gehanden, welcher eingehende UDP-Packete 
auf einem LCD darstellen sollte. Schon nach kurzer Zeit kam wieder 
dieser Datenmüll. Damit muss man leider rechnen.

von Peter (Gast)


Lesenswert?

IUnknown schrieb:
> Auch das sah
> nach dem Versuch aus, das System anzugreifen. Ich hab auch mal ein µC
> mit Ethernetadapter ans Netz gehanden, welcher eingehende UDP-Packete
> auf einem LCD darstellen sollte. Schon nach kurzer Zeit kam wieder
> dieser Datenmüll. Damit muss man leider rechnen.

Tja das ist so eine Sache das zu beurteilen. Ist halt die Frage was für 
einen Port du gewählt hast. Ist eigentlich ganz logisch, dass es da 
ziemlich zugeht, so ungefiltert da kommt dir ja jeder Broadcast durch. 
Und der haut dir wahrscheinlich alles zusammen weil dein UDP RX Buffer 
keine 100 Bytes groß ist ...

IUnknown schrieb:
> Ich habe mal eine Zeit lang ein Raspberry als Server auf Port 80 laufen
> lassen. Nach nur wenigen Stunden waren im log sehr seltsame Anfragen.

Naja auf Port 80 ist das doch auch nicht wirklich ein Wunder oder? 
Stichwort Suchmaschinen z.B ?!

von AVRli .. (avrli)


Lesenswert?

Jörg Wunsch schrieb:
> Wenn man keine Suchmaschinen haben möchte, sollte man
> darauf diese Antwort geben:
> User-agent: *
> Disallow: /

Danke, habe ich sofort hinzugefügt! Obwohl ich noch nicht eine Robot.txt 
Abfrage hatte.


@ IUnknown
Genau dieses Szenario hat den ATMEGA bei meiner ersten Implementierung 
so ziemlich durcheinander gebracht. Dank der User Antworten hier im 
Beitrag, besonders Ulrich F. und Jörg Wunsch ist es hier nun sehr ruhig 
geworden.

"ms*an" schaut ab und zu noch vorbei, das lässt sich nicht vermeiden 
aber die sinnfreien Abfragen und Weiterleitungs Anforderungen haben zu 
99% ein Ende. Die Aufhänger nach wilden Zeichen sind 100% weg.


Peter schrieb:
> Ist eigentlich ganz logisch, dass es da
> ziemlich zugeht, so ungefiltert da kommt dir ja jeder
> Broadcast durch. Und der haut dir wahrscheinlich alles
> zusammen weil dein UDP RX Buffer keine 100 Bytes groß ist ...

Das der Zeiger den Buffer nie verlassen sollte wo er hingehört ist doch 
ein Grundsatz. Das maximale was bei schlechter Portwahl passieren 
sollte, ist das der Server viel sinnloses Zeug macht. Ich würde nur nach 
Paketen suchen die ich erwarte, alles andere einfach ignorieren. Wenn 
alle UDP Pakete angezeigt werden sollen dann können eben nur Daten bis 
max. 100 Byte angezeigt werden.


Peter schrieb:
> Naja auf Port 80 ist das doch auch nicht wirklich ein Wunder oder?
> Stichwort Suchmaschinen z.B ?!

Mich hat die aggressive Art einfach überrascht und damit war es für mich 
doch ein Wunder. Würden sich alle an die Spielregeln halten und nicht 
auf der Suche nach offenen "Türen, Fenstern, Toren" in dem gefühlt 
"rechtsfreien Raum" sein, dann bräuchte man sich mit so einem Quatsch 
nicht auseinander setzen.

Es sind einfach zu viele "Spezialistin" unterwegs.

Ich bin froh mich mit dem Thema beschäftigt zu haben, allerdings bin ich 
nicht ganz so leichtfüßig mehr mit dem Netzwerk und den Portfreigaben 
ans Internet.

Grüße AVRli...

von Stefan F. (Gast)


Lesenswert?

Das ist nicht nur im Internet so. SO sind wir Menschen halt - und die 
von uns gebauten Maschinen.

Stell mal vor den Kölner Dom ein Blockhaus auf. Es wird nicht lange 
dauern, bis neugierige Menschen durch die Fenster hinein schauen und 
ausprobieren, ob man die Türen öffnen kann.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo AVRli,
ich habe mal einen HTTP 1.1 Server implementiert und mich dabei an 
RFC2616 orientiert. Der RFC ist eigentlich ganz verständlich 
geschrieben. Du kannst Dir ja mal die Unit-Tests in 
https://github.com/TorstenRobitzki/Sioux angucken, vielleicht hilft Dir 
das.

Aber generell musst Du jede offene Verbindung mit einem timer versehen, 
sowohl bei Lesen und beim Schreiben. Ich würde Verbindungen, auf denen 
keine gültiger HTTP request gekommen ist, auch einfach schließen (je 
früher, um so besser).

mfg Torsten

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.