Port Weiterleitung funktioniert nicht

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Kamik423
User
Beiträge: 93
Registriert: Donnerstag 28. März 2013, 16:53

Ich versuche einen kleinen Chat Server-Client zu basteln. Das ist aller Code den ich bisher habe:

Code: Alles auswählen

#Server
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
prt = int(input('PORT: '))
s.bind(('', prt))
#s.bind((socket.gethostbyname(socket.gethostname()), prt))
print('Hosted at ' + str(s.getsockname()))
s.listen(2)
while 1:
    cli_sock, cli_addr = s.accept()
    print('New connection: ' + str(cli_addr))
    cli_sock.send('TEST to ' + str(cli_addr))

Code: Alles auswählen

#Client
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),int(input('Client Port: '))))
s.connect((input('IP: '),int(input('SRVR Port: '))))
print(s.recv(4096))
Ich habe meinen Router (Speedport W 504V) auf eine Postweiterleitung programmiert
Bild
Es funktioniert problemlos auf meinem lokalen Netzwerk, aber sobald ich von meinem Client die (externe) IP unseres Routers und den Port eingebe bekomme ich timeout. Mein Windows Freund bekommt folgenden Fehler:

Code: Alles auswählen

 line 4, in <module>
    s.connect((input('IP: '),int(input('SRVR Port: '))))
OSError: [WinError 10051] Ein Socketvorgang bezog sich auf ein nicht verfügbares Netzwerk
telnet auf meinem Computer sagt:

Code: Alles auswählen

telnet: connect to address XX.XXX.XX.X: Operation timed out
telnet: Unable to connect to remote host
(Mir wurde empfohlen ich soll telnet zum verbindungsfesten verwenden)
Mir ist folgende Diskrepanz aufgefallen: Links die Info meines routers, rechts mein Programm
Bild
Ich habe verschiedene IPs für den server verwendet: '', '0.0.0.0', socket.gethostbyname(socket.gethostname()), socket.gethostname(), meine Lokale und meine Globale IP Adresse (refused)

Was mache ich falsch?
0x4c65742773206d616b652073757265207468617420686973746f7279206e6576657220666f726765747320746865206e616d6520656e746572707269736521
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

So wie ich deine Programmsnippets verstehe, machst du den Port eingebbar, obwohl genau der konstant sein muesste (denn du hast ja nur eine Portforwarding-Regel), aber die IP ist hart verdrahtet.

Das muss in meinen Augen umgekehrt sein. Der server kann so bleiben, weil er an alle interfaces bindet, also auch die IP fuer die du das forwarding eingerichtet hast.

Der client hingegen muss per Eingabe die IP deines Routers von aussen erhalten.
Kamik423
User
Beiträge: 93
Registriert: Donnerstag 28. März 2013, 16:53

Wie ist das genau gemeint?
Der Server fragt nach einem Port. Zur zeit verwende ich dafür 24117, weil ich den geforwarded habe, aber ich möchte auch einen anderen beliebig eingeben können

Der Client fragt auch nach eine Port, den ich binde. (Für ausgehende Nachrichten, so wie ich es verstehe, und der muss nicht geforwarded sein, oder?)
Dann nach der Server IP, die ich eingebe
und dann nach dem Port des servers, also 24117
0x4c65742773206d616b652073757265207468617420686973746f7279206e6576657220666f726765747320746865206e616d6520656e746572707269736521
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@ Kamik423: das bind beim Client ist unnötig. Der bekommt automatisch einen freien Port. Statt send möchtest Du wahrscheinlich sendall verwenden und das recv wird hoffentlich noch durch ein ordentliches Protokoll ersetzt. Beim Port-Weiterleiden muß nicht nur Dein Router sondern auch Dein Provider mitspielen. Hast Du da schon geschaut, wie man es einrichten muß? Hast Du schon mal andere Programme von außen angesprochen?
Kamik423
User
Beiträge: 93
Registriert: Donnerstag 28. März 2013, 16:53

@Sirius3: Die Tutorials die ich gesehen habe machen auch "bind" beim Client, wenn ich es entferne bekomme ich immer noch den timeout.
Das Programm soll erst einmal nur eine Verbindung aufbauen, am Kommunikationsprotokoll arbeite ich später... Aber trotzdem schon einmal vielen Dank
Daran kann es aber noch nicht liegen, denn bevor das erste send oder recieve stattfindet soll er erst einmal was printen. Aber bis dahin kommt es nicht ein mal. Es scheitert schon am connect / listen / accept
Ich glaube mein Provider ist T..Home... (mein Router Speedport W 504V von Telekom), wie mache ich, dass die "mitspielen"?
http://www.yougetsignal.com/tools/open-ports/ sagt mein port wäre "closed" also liegt es wahrscheinlich daran.
Nein, das ist das erste mal, dass ich so ein Netzwerk versuche. Ich habe nur schon einem mit FTP mit einem anderen Server "gesprochen"
Vielen Dank
0x4c65742773206d616b652073757265207468617420686973746f7279206e6576657220666f726765747320746865206e616d6520656e746572707269736521
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah, ich bin verwirrt worden von dem code. Dein client hat ein voellig nutzloses (oder eher schaedliches) `s.bind` vor dem `s.connect(...)` in dem du die IP abfragst. Das solltest du entfernen, das hat da nix zu suchen. Vielleicht hilft das schon, glaube ich aber nicht - denn telnet hat das sicher nicht so gemacht.

Mit

Code: Alles auswählen

 lsof -iTCP -sTCP:LISTEN -n -P
solltest du bei laufendem server sicherstellen, das er auf allen Adressen lauscht. Da sollte getsockname auch eine '0.0.0.0' ausliefern.
Kamik423
User
Beiträge: 93
Registriert: Donnerstag 28. März 2013, 16:53

Ja, das bind ist schon entfernt.

Code: Alles auswählen

hansSeiMac:~ Hans$ lsof -iTCP -sTCP:LISTEN -n -P
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Dropbox  612 Hans   26u  IPv4 0xdf0443ea02c0dc2f      0t0  TCP *:17500 (LISTEN)
Dropbox  612 Hans   38u  IPv4 0xdf0443ea027076cf      0t0  TCP 127.0.0.1:17600 (LISTEN)
Dropbox  612 Hans   44u  IPv4 0xdf0443ea0262e34f      0t0  TCP 127.0.0.1:17603 (LISTEN)
Python  4142 Hans   16u  IPv4 0xdf0443ea04b1c6cf      0t0  TCP 127.0.0.1:65357 (LISTEN)
Skype   4323 Hans   43u  IPv4 0xdf0443e9f34e018f      0t0  TCP 192.168.2.109:57867 (LISTEN)
Python  5534 Hans    3u  IPv4 0xdf0443ea04b3c50f      0t0  TCP *:24117 (LISTEN)
Das untere Python ist so ok?
0x4c65742773206d616b652073757265207468617420686973746f7279206e6576657220666f726765747320746865206e616d6520656e746572707269736521
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kamik423: ja, auf der Pythonseite ist jetzt soweit alles in Ordnung. Zum Thema Routerkonfiguration gibt es schon etliche Tutorials im Netz. Ich gehe da immer nach dem Prinzip vor, alle Varianten durchprobieren, bis es funktioniert.
Kamik423
User
Beiträge: 93
Registriert: Donnerstag 28. März 2013, 16:53

Ja, das habe ich gestern von 12-24 Uhr gemacht...
Aber ich schaue noch einmal
Vielen Dank
0x4c65742773206d616b652073757265207468617420686973746f7279206e6576657220666f726765747320746865206e616d6520656e746572707269736521
Antworten