Öffentlich zugänglichen Web-Server erstellen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Hi Leute.
Ich beschäftige mich mit dem Erstellen eines Socket-Servers + Client.
Auf lokaler Ebene läuft alles mit multiplen Clienten, die sich einzelnd anmelden, miteinander Chaten und sich einzelnd wieder abmelden können.
Ich habe quasi einen kleinen Chat Room auf lokaler Ebene fertiggestellt.
Jetzt versuche ich die lokale Verbindung öffentlich zu machen, um mich von überall aus anmelden zu können.
Nach vielem Suchen im Netz bin ich auf Folgendes gestoßen:

Code: Alles auswählen

# external_client --> router(external_IP) --> server(local_IP) <-- local_client
Das habe ich versucht umzusetzen (Unwichtiges habe ich weggelassen).
Mein abgekürzter Server-Code:

Code: Alles auswählen

import socket

HOST = socket.gethostbyname(socket.gethostname())
PORT = 50505
ADDR = (HOST, PORT)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
server.listen()
print(f"Server is listening to {ADDR}...")


def start():
    while True:
        client, address = server.accept()
        print(client, address)


start()
...und mein gekürzter Client-Code:

Code: Alles auswählen

import socket


client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('95.90.xxx.xxx', 50505))  # Meine publicIP
Ich bekomme nach einiger Wartezeit immer die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\chris\Documents\PyCharm\Networking\Chat_Room\client.py", line 10, in <module>
    client.connect(('95.90.225.108', 50505))  # 95.90.225.108
TimeoutError: [WinError 10060] Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat

Process finished with exit code 1
Was mache ich falsch?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wahrscheinlich eine ganze Menge, weil man so ein Netzwerkprotokoll nicht so einfach entwickelt, wenn man sich nicht auskennt. Es wäre besser, da auf bestehendes woe XMPP oder so zu setzen.

Konkret fehlt es denke ich an einer Port-Weiterleitung auf deinem Router.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Ich dachte socket.SOCK_STREAM ist das Protokoll, das sagt, das TCP anstatt UDP verwendet wird?
Und wie kann ich dem Router sagen, der soll die verdammten Ports weiterleiten?
Wo finde ich nochmal meinen Router im Netz? Welche Seite?
Ich würde mir dann erstmal einen Barebone anschaffen und dem ne Netzwerkkarte verpassen.
Damit würde ich das dann gern testen...
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

TCP oder UDP ist nicht die Frage. Sondern was man mit denen macht. TCP ist ein Datenstrom. Kein diskreter Message-Service. Ich wette, dass du in deinem Programm davon ausgehst, dass alles, was gesendet wird, genau so auch ankommt. Also nicht nur alle Bytes (das garantiert TCP), sondern auch ein Paket per Nachricht. Und das stimmt einfach nicht. Wir diskutieren das heir andauernd, schau mal nach sendall und Protokoll und so.

Wie du das dem router sagst, verrät dessen Hilfe. Ich kenne den nicht. Auch wo der bei dir im Netz zu finden ist, sollte in der Dokumentation stehen. Wahrscheinlich ist er das gateway, das kannst du auch in deinen Netzwerkeinstellungen nachsehen.
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

DMD-OL hat geschrieben: Mittwoch 29. September 2021, 21:17
Und wie kann ich dem Router sagen, der soll die verdammten Ports weiterleiten?
Kommt ganz auf den Router an. Meistens steht dann irgendwo Port-Weiterleitung oder Port-Freigabe manchmal ists auch unter dem Punkt Firewall.
Wo finde ich nochmal meinen Router im Netz? Welche Seite?
Unter Windows einfach mal in einer Eingabeaufforderung

Code: Alles auswählen

ipconfig /all
eingeben. Da nach Gateway oder Default Gateway oder ähnlich (hab grade kein Windows greifbar) suchen.

Unter Linux sollte ein

Code: Alles auswählen

ip r | grep default
Die IP des default Gateways anzeigen. DAS sollte dann die IP von deinem Router sein.
Ich würde mir dann erstmal einen Barebone anschaffen und dem ne Netzwerkkarte verpassen.
Die meisten Barebones sollten ein Netzwerkinterface Onboard haben.
Damit würde ich das dann gern testen...
Du solltest vielleicht vorher noch klären, ob du bei deinem Provider nicht hinter einem CG-NAT hängst. Dann wirds etwas aufwendiger von außen "rein" zu kommen.

Zusätzlich mußt du natürlich beachten, dass wenn DU ohne irgendeine Authentifizierung auf dein Netz zugreifen kannst, auch andere darauf zugreifen können und es auch versuchen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Zum Ausprobieren ohne Einstellungen am Router zu verändern: https://ngrok.com/

Ansonsten musst du dafür sorgen, dass der Port weitergeleitet wird, da der Router ansonsten nicht weiß, für wen die ankommenden Pakete adressiert sind.
Hinter dem Router befindet man sich in einem privaten Netzwerk, dass im Internet nicht geroutet wird und kann.

Solange eine Verbindung von innen nach außen aufgebaut wird, merkt sich der Router die interne IP und bei der Antwort kann der Router das ankommende Paket der entsprechenden privaten Adresse zuordnen.
Wenn aber von außen eine Verbindung aufgebaut werden soll, muss der entsprechende Port einer privaten IP des Rechners im Netzwerk zugeordnet werden.

Manche nennen das fälschlicherweise Portfreigabe und andere nennen es Portweiterleitung.

Testen würde ich etwas anders.
Wechsle testweise in ein leeres Verzeichnis und starte mit Python einen Webserver auf einem Port.

Code: Alles auswählen

python3 -m http.server 8000
Dann versuch von außen eine Verbindung aufzubauen.

In einigen Fällen kann man sich von seinem PC im lokalen Netzwerk nicht mit der öffentlichen IP-Adresse verbinden.
Das Phänomen habe ich schon des Öfteren gehabt und es scheint vom Provider und/oder Router abhängig zu sein, ob das geht oder nicht.

Im schlimmsten Fall hängst du hinter einem Provider-NAT (CG-NAT).
D.h. du kannst gar keinen Port öffnen, da du keine Kontrolle über das CG-NAT hast.
Der Provider hat die Kontrolle.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

:twisted: :mrgreen: :oops: :lol: :shock: :shock: :shock: :oops: :oops: :mrgreen:
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Was mir beim Drüberlesen gerade so einfällt: Ggf. ist es für Dich hilfreich nen Netzwerk Sniffer wie z.B. Wireshark einzusetzen, der den ganzen Netzwerkverkehr protokolliert.

Ich hatte im Frühjahr ein streaming Daten Problem, welches ich nicht verstanden habe bzw nicht in den Griff bekommen habe... dann habe ich Wireshark installiert um den Netzwerkverkehr analysieren zu können. Habe kurz gebraucht zu verstehen, was der alles anzeigt, aber dann habe ich damit rausgefunden können, welches Programm / Service was sendet und / oder empfängt oder auch nicht.

Es gibt eine Umsetzung von Wireshark in Python, das Modul heißt pyshark. Es hat nicht vollen Funktionsumfang von Wireshark und scheint diverse Bugs zu haben, siehe Github, aber die Netzwerkprotokollierung ging und mit etwas Aufwand konnte ich auch die verschlüsselten Daten entschlüsseln, SSL halt, was ja Standard ist.

Naja, habe kurz überlegt, ob ich das hier poste, aber da es für einen öffentlich zugänglichen Web-Server definitiv relevant ist, füge es hier an: Durch Wireshark und dann pyshark habe ich in 3 Tagen spaßhalber eine angeblich sehr sichere Dipphie Hellmann Verschlüsselung eines aktiven Programms "geknackt", die in Wireshark unerwartet sichtbar wurde.

Ich war selber etwas überrascht, wie schnell das ging, aber googlet einfach mal nach sslkeylogfile und Wireshark...
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

August1328 hat geschrieben: Mittwoch 6. Oktober 2021, 21:04 Naja, habe kurz überlegt, ob ich das hier poste, aber da es für einen öffentlich zugänglichen Web-Server definitiv relevant ist, füge es hier an: Durch Wireshark und dann pyshark habe ich in 3 Tagen spaßhalber eine angeblich sehr sichere Dipphie Hellmann Verschlüsselung eines aktiven Programms "geknackt", die in Wireshark unerwartet sichtbar wurde.
Mit der SSLKEYLOGFILE Umgebungsvariable kann bei vielen Clients (Firefox, Chrome, curl) etc. die Schlüssel loggen lassen und mit denen kann man natürlich die verschlüsselten Daten auch entschlüsseln. Das ist in etwa so als ob du bei jemandem in der Wohnung einbrichst und dazu vorher nach dem Schlüssel fragst, diesen bekommst und damit die Wohnungstür öffnest. Das hat mit "knacken" nicht viel zu tun und sagt auch überhaupt nichts über die Sicherheit von Diffie-Hellmann aus, was übrigens ein Protokoll zum Schlüsselaustausch ist und mit Verschlüsselung nichts zu tun hat.
DMD-OL
User
Beiträge: 315
Registriert: Samstag 26. Dezember 2015, 16:21

Das sind viele Infos für mich.
Ich muss jetzt noch etwas ordnen...
Vielen Dank an euch. :)
Antworten