Socket over Lan

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
LUCKYONE
User
Beiträge: 5
Registriert: Mittwoch 31. März 2021, 23:31

Hallo,

da ich jetzt schon seit einer weile nach einer Lösung für dieses Problem suche, aber leider nicht fündig geworden bin, schreibe ich jetzt diesen Beitrag.
Und zwar habe ich das Problem, dass ich mich mit meinem Programm nur Lokal, und nicht mit einem physisch getrennten PC verbinden kann.(Der auch nicht im gleichen Netzwerk ist)
Ich zeige hier einmal den Code vor:
Ps Beim ausführen des Programms gibt es immer einen Tracebackfehler. Dieser wird aber nur angezeigt, wenn ich es mit einer Internetaddresse versuche..

#Server

import os
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
host = '79.248.***.**' #Die * nur zur Verdeckung der IP
port = 80
server_socket.bind((host, port))
print("")
print("Ich bin die Backdoor! Server ist Online", host)
print("")
print("Warte auf Verbindungen...")
server_socket.listen(1)
conn, addr = server_socket.accept()
print("")
print(addr, " Erfolgreiche Verbindung zu dem Server hergestellt! ")


#Client

import os
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket = socket.socket()
port = 80
host = input(str("Ich bin der Client! Bitte gebe nun die Serveraddresse an: "))
client_socket.connect((host,port))
print("")
print("Erfolgreich mit dem Server verbunden!")
print("")


#Fehlercode

server.py", line 8, in <module>
server_socket.bind((host, port))
OSError: [WinError 10049] Die angeforderte Adresse ist in diesem Kontext ungültig
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Für `host` sind bei bind eigentlich nur zwei Werte sinnvoll 127.0.0.1 oder 0.0.0.0. Du wirst keine direktes Gateway zu 79.248.*.* haben.
Port 80 ist zudem ein reservierter Port, benutze einen >1024.
`str` auf einen literalen String aufzurufen, ist Unsinn.
LUCKYONE
User
Beiträge: 5
Registriert: Mittwoch 31. März 2021, 23:31

@Sirius3 Ok.. Aber wenn ich den Wert 0.0.0.0 oder 127.0.0.1 beim Host eingebe und meine Internet IP im client, kommt ein Timeout..
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du denn prinzipiell Zugriff von einem Rechner auf den anderen?
LUCKYONE
User
Beiträge: 5
Registriert: Mittwoch 31. März 2021, 23:31

Sie sind in einem Raum, aber nicht in einem Netzwerk.. So gesehen möchte ich einfach nur wissen, wie ich in Python physikalisch getrennte Pcs dazu bringe Daten auszutauschen(mit physikalisch getrennten Pcs meine ich Pcs, die nicht in ein und dem selben Netzwerk sind) . Also deswegen die Frage, wie ich mich mit einem Pc verbinde, der nicht in meinem Netzwerk ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LUCKYONE: Wenn die nicht im gleichen Netzwerk sind, dann geht eine Verbindung so ganz allgemein gar nicht, deswegen trennt man Rechner ja in verschiedene Netzwerke. Ob und wie das nun in deinen beiden Netzwerken vielleicht doch geht, weil es beispielsweise einen Router gibt, kann Dir ohne allwissende Glaskugel niemand sagen. Das ist jetzt auch nicht wirklich eine Python-Frage.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
LUCKYONE
User
Beiträge: 5
Registriert: Mittwoch 31. März 2021, 23:31

@blackjack Das Problem ist das du die Antwort offensichtlich nicht kennst. :-)Dann würde ich an deiner Stelle auch keine Antwort geben ;-). Natürlich muss das funktionieren ! Und es interessiert auch nicht, wie man das allgemein oder in C# oder Java löst. Es geht auch nicht um eine Glaskugel. Es soll ja hier nicht geraten werden. Entweder kennt jemand ne Antwort, oder weiß wie man Client, Server oder Backdoors über Rechner in verschiedenen Netzwerken programmiert oder nicht. Ich meine irgendwie funktionieren ja auch Trojaner oder Viren ? Vg
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Wenn du schon solche Dinge programmieren willst solltest du dich vielleicht selbst erstmal mit den Grundlagen von Netzwerken vertraut machen. Auch Trojaner/Viren/whatever sind auf Router oder Bridges angewiesen da sie sonst nicht ins internet kommen und haben irgendeine Kontrollinstanz auf irgendeinem Server der entweder direkt ober vielleicht auch über eine VPN-Verbindung erreichbar ist. Zaubern können die auch nicht...
LUCKYONE
User
Beiträge: 5
Registriert: Mittwoch 31. März 2021, 23:31

@paddie Genau deswegen bin ich doch hier.. Ich möchte lediglich wissen, wie ich es erreiche mich mit meinem Socket erfolgreich ins Internet zu Verbinden.
Bedeutet, dass ich nur wissen möchte, was ich im Quellcode verändern muss, damit ich mich auf meinen zweit Pc verbinden kann, und das wie gesagt nicht Lokal.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Das Internet ist ein Netzwerk. Wenn beide Computer mit dem Internet verbunden sind, sind sie im selben Netzwerk und auch physisch miteinander verbunden. Blackjack ist wahrscheinlich davon ausgegangen dass du mit solchen Grundlagen vertraut ist und hat dementsprechend vollkommen zurecht darauf hingewiesen dass voneinander physisch getrennte Computer unmöglich miteinander kommunizieren können.

Nun zu deinem Problem: Das was du vorhast ist i.d.R. nicht möglich weil es Router durch NAT, Firewalls usw. verhindern. Trojaner oder Viren funktionieren so auch nicht, sondern verbinden sich mit einem (oder mehreren) zentralen Server(n). Das machen effektiv auch P2P Lösungen die i.d.R. hole punching nutzen und einen dritten Server miteinbeziehen um Verbindungen aufzubauen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LUCKYONE: ”Das” muss natürlich nicht funktionieren. Du hast gesagt Du hast zwei Rechner in zwei unterschiedlichen Netzwerken. Die können nicht miteinander kommunizieren. Es sei denn die Netzwerke sind beispielsweise über einen Router verbunden. Solange Du aber nichts weiter über Deine beiden Netzwerke verrätst kann man nur raten wie das dann konkret geht. Oder ob es überhaupt geht, denn da kommt es dann ja immer noch darauf an wie der Router konfiguriert ist, also in welche Richtung der was weiterleitet oder eben auch nicht. Und das ist völlig unabhängig von der Programmiersprache. Python, C#, Java, und fast alles andere bietet letztlich genau die gleiche Socket-API an, weil das die Schnittstelle ist, die vom Betriebssystem angeboten wird.

Viren haben erst einmal nichts mit Netzwerken zu tun, die verbreiten sich klassischerweise dadurch, dass man eine infinzierte ausführbare Datei von irgendwo her hat, die ausführt, und dabei dann weitere ausführbare Dateien infiziert werden. Der Benutzer muss halt irgendwo ”erstinfiziert” werden. Normalerweise weil er sich von jemand anderem eine infizierte Datei kopiert hat. Nicht selten irgendwelche dubiosen Quellen aus dem Netz. Manchmal auch nicht-dubiose Quellen.

Trojaner funktionieren ähnlich. Der Benutzer führt irgend etwas aus dubioser Quelle aus, das nach etwas tollem, nützlichen aussieht, und holt sich damit selbstständig die Schadsoftware in sein Netz, hinter die Schutzmauern. Eben wie beim Holzpferd in der Geschichte um Troja.

Und dann ist da auch gar kein grosses Geheimnis mehr wie sich die Rechner verbinden, denn der Trojaner ist in Deinem Netz und der Steuerrechner im grossen bösen Internet, und von einem Rechner in Deinem Netz eine Verbindung zu Port 80 zu einem Rechner im Internet aufzubauen ist überhaupt nichts besonderes. Das geht einfach so. Sonst würde der Webbrowser nicht funktionieren, denn der macht auch genau das. In die Richtung und auf dem Port lässt Dein Router nämlich Verbindungen zu und leitet antworten aus dem Internet auch wieder zu dem Rechner in deinem Netzwerk weiter. Auch da wieder: sonst würde ein Webbrowser nicht funktionieren.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@LUCKYONE: Vielleicht noch zur weiteren Verdeutlichung des Problems: Üblich sind lokale Netzwerke in denen private ip-Addressbereiche genutzt werden und die über einen Router Zugang zum Internet haben. Es ist möglicherweise bei Dir der Fall, dass zwei solche Netzwerke aufgesetzt sind, die jeweils über einen eigenen Router Verbindung mit dem Internet haben und somit Bestandteil *eines* Netzwerkes sind.

Um nun von einem lokalen Netzwerk aus das andere anzusprechen, müssen die ip-Adressen der Router bekannt sein. Wenn dies der Fall ist, kann von beiden lokalen Netzwerken aus aber nur der Zugriff auf den Router des jeweils anderen lokalen Netzwerkes erfolgen; ein direkter Durchgriff auf die privaten ip-Adressen der Rechner hinter dem Router ist nicht möglich. Das lässt sich wenn, dann nur durch eine entsprechende Konfiguration der Router ermöglichen – also selektiv den Schutz durch NAT und Firewall deaktivieren. Der Rechner, auf den so der Zugriff ermöglicht wird, ist ab dann allen Zugriffen aus dem Netz direkt ausgesetzt und befindet sich gleichfalls *im* lokalen Netzwerk.

So etwas überlegt man sich dreimal, lässt es anschließend bleiben, und setzt stattdessen ein weiteres Netzwerk auf, das dann geöffnet (und angreifbar) wird. Das könnte dann aber auch direkt ein Server im Internet sein, der dementsprechend konfiguriert ist.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei bei dem Szenario auch ein Router ausreichen könnte, denn auch in normalen Heimnetzen ist ein Gastnetz über den Router der den Zugang zum Internet bereit stellt, nichts ungewöhnliches. Und auch da will man ja gerade *nicht* das die Geräte aus dem Gastnetz und dem restlichen Heimnetz in Berührung kommen. Das ist ja der Sinn und Zweck ein Gastnetz aufzusetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das stimmt, dieses Szenario wäre gleichfalls möglich. Wie es wirklich ausschaut, wissen wir nicht; könnte aber zutreffend sein, wenn sich die Rechner im gleichen Raum befinden.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

LUCKYONE hat geschrieben: Freitag 2. April 2021, 13:23 @blackjack Das Problem ist das du die Antwort offensichtlich nicht kennst. :-)Dann würde ich an deiner Stelle auch keine Antwort geben ;-). Natürlich muss das funktionieren ! Und es interessiert auch nicht, wie man das allgemein oder in C# oder Java löst. Es geht auch nicht um eine Glaskugel. Es soll ja hier nicht geraten werden.
Hallo LUCKYONE,

Also erstmal muss ich sagen, dass Dein anmaßender Ton gegenüber einem unserer erfahrensten Forenmitglieder völlig unangemessen ist und ich zolle Blackjack größten Respekt, dass er sich weiterhin so sachlich auf Deine Frage eingelassen hat. Inhaltlich hat er völlig recht, ich hätte genau das gleiche geschrieben. Anstatt gleich zu widersprechen, hättest Du Dir erst einmal demütig Gedanken machen sollen, was er mit der Glaskugelmetapher sagen wollte. Mit den Informationen, die Du uns gegeben hast, ist nicht mehr an sinnvoller Antwort möglich.

Kurz zusammengefasst: In Deinem Ansatz möchest Du über Betriebssystemsockets eine Verbindung mit einem Rechner in einem anderen Netzwerk aufnehmen. Voraussetzung dafür ist, dass Dein Rechner irgendwie Zugriff auf das andere Netzwerk hat. Deine Fehlermeldung deutet darauf hin, dass das nicht der Fall ist. Sofern Du Deine Router und andere Netzwerkhardware nicht per Python steuerst, wirst Du an dieser Stelle (rein programmatisch) nicht weiterkommen. Das ist die Antwort auf Deine Frage.
Blacky sagte zu recht, dass wir ohne weitere Hinweise auf Deine Hard- und Software keine weitere Hilfe leisten können. Ja, er kennt die Antwort nicht und kann sie nicht kennen. Aber das liegt an Deinen unzureichenden Angaben, nicht an seinem mangelnden Wissen und ihm zu untersagen, dann überhaupt zu antworten, ist schon dreist.

Es gibt übrigens auch andere Möglichkeiten, zwei lokale Rechner zu verbinden. Z.B. USB, COM-ports (wenn Dein Rechner sowas noch hat), etc., aber die bringt man dann entweder in ein gemeinsames Netzwerk, oder nutzt andere Software.

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