Socketverbindung via Internet

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hallo,

ich bin mal wieder am Verzweifeln. Schon öfter habe ich versucht, eine Socketverbindung über das Internet zu einem Freund herzustellen. Heute versuchte ich es über das schon vorgestellte Programm Pychat: http://www.python-forum.de/topic-5145.h ... ght=pychat

Lokal läuft das hervorragend, aber via Internet habe ich bei Eingabe der IP meines Freundes und vereinbartem Port keine Verbindung herstellen können, umgekehrt genauso. Ich bin immernoch überzeugt, dass das möglich ist, aber wie??

Kann mir einer von euch sagen, welche Ursachen das noch haben kann? Wenn ich erst eine einfache P2P-Verbindung habe, sehe ich für den Datenaustausch keine Probleme.

Vielen Dank für eure Hilfe!
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Firewall welche die Ports blockt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DatenMetzgerX hat geschrieben:Firewall welche die Ports blockt
Oder ein NAT welches die benötigten Ports nicht forwardet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

DatenMetzgerX hat geschrieben:Firewall welche die Ports blockt
Hi DatenMetzgerX,

habe gestern Abend noch gemerkt dass ich vergaß zu erwähnen, dass wir diesen Port in der Firewall freigaben. Jedenfalls habe ich das versucht. Kann man genau herausfinden, welche Ports bei der Windows Firewall gerade offen sind?

Ich habe auch schon über einen von SimpleCGIServer abgeleiteten Server nachgedacht.

Als letzte (aber vielleicht auch bessere) Möglichkeit sehe ich den Aufbau eines VPN. Aber hier geht es erstmal um's Prinzip.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Prinzipiel must du nicht nur auf deinem lokalen Rechner die Ports öffnen sondern auch noch auf deinem Modem / Router. Wenn du das ganze auf dem Modem Router machst musst du auch noch angeben wo hin der Router die Packete routen soll...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi DatenMetzger,

stimmt, das klingt plausibel. Ich habe heute darüber nachgedacht, als ich den Beitrag zu VPN in einer Computerzeitschrift las. Das könnte tatsächlich der Knackpunkt sein. Jetzt muss ich nur noch das Config-Menü meiner Fritzbox finden. :)
Mit einer herkömmlichen Firewall kann ich doch auch die Programme bestimmen, die über diesen Port Kontakt zum Internet aufnehmen dürfen und welche nicht, oder?

Danke für den Hinweis, jetzt habe ich zumindest wieder einen Ansatzpunkt.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Michael Schneider hat geschrieben:Mit einer herkömmlichen Firewall kann ich doch auch die Programme bestimmen, die über diesen Port Kontakt zum Internet aufnehmen dürfen und welche nicht, oder?
Ja, aber nur in Personal Firewalls unter Windows. Unter Linux kannst du dahingegen nur Ports sperren/umleiten usw, aber nicht getrennt nach Programmen (bei Interesse verweise ich auf netfilter.org, der Homepage von iptables). Bei Routern geht das auch gar nicht anders, denn sie haben keine Möglichkeit zu wissen, welche Verbindung welchem Windowsprogramm gehört.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

DatenMetzgerX hat geschrieben:Prinzipiel must du nicht nur auf deinem lokalen Rechner die Ports öffnen sondern auch noch auf deinem Modem / Router. Wenn du das ganze auf dem Modem Router machst musst du auch noch angeben wo hin der Router die Packete routen soll...
Hallo,

ich habe das probiert, den Port im Router durchgeleitet und in der Firewall freigegeben. Ohne Erfolg.
Mal rein interessenhalber: hast Du das schonmal hinbekommen? Mit Pychat oder generel Socketverbindung über Internet?

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Michael Schneider hat geschrieben:Mal rein interessenhalber: hast Du das schonmal hinbekommen? Mit Pychat oder generel Socketverbindung über Internet?
Hi Michael!

Wenn es zwischen zwei Computern in deinem lokalen Netz funktioniert, dann funktioniert es auch über das Internet. Du musst dich nur darum kümmern, dass die Signale auch wirklich die Gegenstelle erreichen und umgekehrt.

- Funktioniert ``ping`` in beide Richtungen?
- Zeigt ``tracert`` eine realistische Route an?
- Zeigt ``netstat -a -n -p TCP`` auch wirklich an, dass dein Programm auf dem gewünsten Port horcht?
- Ist dein Router (falls du so etwas hast) so eingestellt, dass er den gewünschten Port auch wirklich zu deinem Computer durchreicht? (Und umgekehrt natürlich auch...)

Zum Testen kannst du ja auch einen einfachen HTTP-Server verwenden.

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

from BaseHTTPServer import HTTPServer
from CGIHTTPServer import CGIHTTPRequestHandler

server = HTTPServer(("", 8888), CGIHTTPRequestHandler)

print "Der Server horcht unter http://localhost:8888"
server.serve_forever()
Ändere den Port (8888) auf deinen gewünschten Port um und starte das Programm auf einem der Computer.
Auf einem anderen Computer kannst du dann über den Browser prüfen, ob der HTTP-Server erreichbar ist.

Code: Alles auswählen

http://<ip-adresse-des-servers>:8888/asdf
Es müsste zumindest eine Fehlerseite erscheinen. Achte aber darauf, dass zum Testen die IP-Adresse nicht über einen Proxy umgeleitet wird.

Dieser Test muss in beiden Richtungen funktionieren, dann sollte es auch mit anderen Socketverbindungen hinhauen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Gerold,

viiilen Dank, genau eine solche Erklärung habe ich gesucht! Im lokalen Netzwerk hat es bislang auch noch nicht funktioniert (nur auf dem Localhost) und ich vermute, dass die Verbindung irgendwo unterwegs gestört wird. Nur eben wo konnte ich durch eine Verbindung-konnte-nicht-aufgebaut-werden Exception nicht herausfinden. Ich werde mal die Checkliste durchgehen und schauen, wo der Hase im Pfeffer liegt.

Grüße,
Michael

p.s. Ich habe Antwort auf meine Nachfrage beim Programmierer von PyChat erhalten und er meinte, dass auch er keine Verbindung herstellen konnte.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Michael Schneider hat geschrieben:Im lokalen Netzwerk hat es bislang auch noch nicht funktioniert (nur auf dem Localhost)
Hi Michael!

Code: Alles auswählen

netstat -a -n -p TCP
Dieser Dos-Befehl zeigt die offenen Ports an. Wenn dein Server (z.B. auf Port 5555) läuft und du diesen Befehl ausführst, dann muss in irgendeiner der Ergebniszeilen das da zu finden sein:

Code: Alles auswählen

TCP   0.0.0.0:5555    0.0.0.0:0    ABHÖREN
Wenn du nur so etwas findest:

Code: Alles auswählen

TCP   127.0.0.1:5555    X.X.X.X:X    ABHÖREN
dann horcht dein Server nur auf "localhost". Dann musst du in deinem Programm irgendwo "0.0.0.0" statt "localhost" eingeben.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Und die Windows XP Firewall würde ich zum Testen auch kurz mal ausschalten.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

gerold hat geschrieben:

Code: Alles auswählen

netstat -a -n -p TCP
Dieser Dos-Befehl zeigt die offenen Ports an. Wenn dein Server (z.B. auf Port 5555) läuft und du diesen Befehl ausführst, dann muss in irgendeiner der Ergebniszeilen das da zu finden sein:

Code: Alles auswählen

TCP   0.0.0.0:5555    0.0.0.0:0    ABHÖREN
Wenn du nur so etwas findest:

Code: Alles auswählen

TCP   127.0.0.1:5555    X.X.X.X:X    ABHÖREN
dann horcht dein Server nur auf "localhost". Dann musst du in deinem Programm irgendwo "0.0.0.0" statt "localhost" eingeben.
Hi Gerold,

meine Hoffnung wird wieder größer. :-) Ich fasse mal kurz zusammen:
- Ping ist super: Verbindung da, minimale Antwortzeit
- tracert zeigt (im lokalen Netz) eine ein-Schritt-Verbindung
- netstat -a -n -p TCP: die Funktion ist einfach genial (habe genau sowas gesucht um zu sehen, welche Ports gerade offen sind). Ich kann sehen, dass auf dem Port gelauscht wird und offenbar wird dann auch der client eingeloggt. Jetzt läuft das zumindest über das lokale Netzwerk. Im Code habe ich "localhost" durch die IP des Hosts ersetzt, unter vielem anderem. Ob es jetzt nur daran lag, kann ich spontan nicht sagen. Morgen probiere ich das dann mit dem Internet. Der Test mit dem CGI-Server lief einwandfrei.

Ihr seid großartig, Leute! Danke Gerold!

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hallo Gerold,
hallo Python-Gemeinde!

Ich habe es endlich geschafft, der PyChat läuft im LAN und via Internet. Im Server gebe ich statt 127.0.0.1 die LAN-IP-Adresse an und im Client dieselbe bzw. die Internet-IP-Adresse.

Vielen Dank an alle an der Lösung Beteiligten!

Gruß,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten