XML-RPC Server hört nur im lokalen Netzwerk

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hi, wie kann ich denn dem SimpleXMLRPCServer sagen, dass er nur auf Anfragen aus dem lokalen Netzwerk hören soll? Mit "localhost" hört er logischerweise nur auf eigene Anfragen, gebe ich nur "" an hört er auf alles.

Er soll aber nur auf den Bereich 192.168.1.x hören. Ich habe aber noch nicht herausgefunden, wie das geht.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

So etwas solltest du auf ebene deines Netzwerkes regeln (Firewall, Routing etc).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Rebecca hat geschrieben:So etwas solltest du auf ebene deines Netzwerkes regeln (Firewall, Routing etc).
Das tut das Netzwerk nach außen hin. Es wäre aber zusätzlich nicht schlecht, wenn der Server selbst schon nur auf bestimmte IP Bereiche reagiert.

Die Frage ist: kann der SocketServer sowas oder müsste ich das selbst erweitern? In der Python Dokumentation hab ich dazu noch nichts gefunden.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hast du es schon mit "192.168.1.0" versucht?
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

ms4py hat geschrieben:Hast du es schon mit "192.168.1.0" versucht?
Ja, der Server startet, aber der Client kann nicht darauf zugreifen

Code: Alles auswählen

Traceback (most recent call last):
  File "client_example1.py", line 4, in <module>
    print "3 is even: %s" % str(proxy.is_even(3))
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1235, in request
    self.send_content(h, request_body)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1349, in send_content
    connection.endheaders()
  File "/usr/lib/python2.6/httplib.py", line 904, in endheaders
    self._send_output()
  File "/usr/lib/python2.6/httplib.py", line 776, in _send_output
    self.send(msg)
  File "/usr/lib/python2.6/httplib.py", line 735, in send
    self.connect()
  File "/usr/lib/python2.6/httplib.py", line 716, in connect
    self.timeout)
  File "/usr/lib/python2.6/socket.py", line 514, in create_connection
    raise error, msg
socket.error: [Errno 111] Connection refused

Code: Alles auswählen

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer

def is_even(n):
    return n%2 == 0

server = SimpleXMLRPCServer(("192.168.1.0", 8765))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.serve_forever()

Code: Alles auswählen

import xmlrpclib

proxy = xmlrpclib.ServerProxy("http://192.168.1.xxx:8765/")
print "3 is even: %s" % str(proxy.is_even(3))
print "100 is even: %s" % str(proxy.is_even(100))
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Auf Socket-Ebene kannst du nichts tun, die Verbindung zu verhindern. Wenn du eine Verbindung hast, kannst du sehen, woher die kommt und koenntest sie wieder unterbrechen (Socket-Objekte haben dafuer die Methode getpeername). Wie einfach man das jetzt in den XML-RPC-Server einbauen kann, weiss ich nicht.

Alles in allem ist das eher ein ungewoehnliches Vorgehen. Den einzigen sinnvollen Anwendungsfall, den ich mir vorstellen kann, ist z.B. Admin-Zugang nur von bestimmten IPs zuzulassen (als zusaetzliche Barriere zur Authentifizierung/Authorisierung) wenn ansonsten der Service offen bleiben soll.
Hast du es schon mit "192.168.1.0" versucht?
Wie soll das funktionieren?
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Rebecca hat geschrieben:
Hast du es schon mit "192.168.1.0" versucht?
Wie soll das funktionieren?
Bei anderen Serversystemen wie MySQL ist das die übliche Vorgehensweise. ".0" heißt, es soll der gesamte IP Raum von 1-255 berücksichtigt werden. 0.0.0.0 würde dem gesamten IP Raum entsprechen
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
lunar

@burli: Das ist eine, nunja, "unübliche" Interpretation einer IP-Adresse. So etwas wie eine "Bereichsadresse" gibt es nicht. "0" steht nicht für einen Bereich, sondern für "0". "10.0.0.5" bezeichnet genau eine einzige Adresse, nämlich 10.0.0.5. Es gibt allenfalls Netzadressen. Eine Adresse, die auf 0 endet, ist zwar mit Sicherheit eine Netzadresse, aber man braucht die Netzmaske, um das zugehörige Netz herauszufinden.

Ich bezweifele daher, dass mysql (oder irgendein beliebiger Dienst) mit "--bind-address=192.168.1.0" etwas anfangen kann. MySQL akzeptiert als Argument für diesen Parameter eine einfache IP-Adresse, an die der Dienst anschließend bindet.

Auf der Ebene eines Sockets kann 192.168.1.0 jedenfalls gar nicht funktionieren. Wie Rebecca schon sagte, kannst Du allenfalls nachträglich Verbindungen verwerfen. Dazu musst Du eben den Quelltext der Serverklasse lesen, um herauszufinden, an welcher Stelle eingehende Verbindungen behandelt werden, und Dir einen Weg ausdenken, um das lokale Subnetz zu definieren. Samba beispielsweise fragt den Kernel nach der Netzwerkmaske der Schnittstelle, auf welcher der Dienst lauscht.

Besser als der Paketfilter Deines Systems bekommst Du das allerdings eh nicht hin, also wozu die Mühe? Konfiguriere den Paketfilter entsprechend, das ist einfacher.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

lunar hat geschrieben:@burli: Das ist eine, nunja, "unübliche" Interpretation einer IP-Adresse.
Gut, vielleicht nicht üblich, aber häufig anzutreffen. Wenn etwas vergleichbares nicht implementiert ist muss ich einen anderen Weg suchen.

Danke für die Antworten
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
lunar

@burli: "Unüblich" war ein Euphemismus für "falsch". Eine "0" alleine steht nicht für einen Bereich. Deswegen ist diese Interpretation auch nicht häufig anzutreffen, ich habe sie noch nie gesehen.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

naja, wie man am Kommentar von ms4py sieht ist es nicht unbedingt unbekannt. Aber egal
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

burli hat geschrieben:naja, wie man am Kommentar von ms4py sieht ist es nicht unbedingt unbekannt.
Also ich kenne sie auch nicht. Kommt mir aber auch irgendwie sehr suspekt vor.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

0 für Netz und 255 für Broadcast (bei Class-C Netzen) :)

Das ist das was man mir in der Schule beigebracht hat.

Wobei man ja auch auf 0.0.0.0 lauschen kann. Hat die Adresse nicht auch verschiedene Funktionen?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
lunar

@jbs: Genauer gesagt: In der Netzadresse sind alle Bits des Host-Teils 0. Man braucht aber die Netzmaske, um zwischen Host und Netzteil unterscheiden zu können. Bei 10.0.0.0 kann für alle Netze von 10.0.0.0/8 bis 10.0.0.0/31 stehen. Ebenso gibt es Netzadresse ohne 0 (e.g. 192.168.2.240/28).

0.0.0.0 ist einfach nur die Netzadresse des gesamten Netzes.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Weil ich es gerade sehe: in der /etc/exports steht für die Freigabe von NFS Laufwerken z.B.

Code: Alles auswählen

/srv/Musik 192.168.1.0/255.255.255.0(rw)
Aber da steht auch die Subnet Maske dabei. Darum ging es vermutlich. Die IP Adresse mit .0 ergibt nur in Verbindung mit der Subnet Mask einen Sinn
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
lunar

@burli: Genau darum ging es.

Eine solche Filterung geschieht zudem immer auf Applikationsebene, man kann keinen Socket erzeugen, der nur Pakete eines bestimmten Subnetzes akzeptiert. Man muss für jeden Client einzeln prüfen, ob dessen IP-Adresse im erlaubten Bereich liegt (der in Deinem NFS-Beispiel von 192.168.2.1 bis 192.168.2.254 geht).
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

lunar hat geschrieben:@jbs: Genauer gesagt: In der Netzadresse sind alle Bits des Host-Teils 0. Man braucht aber die Netzmaske, um zwischen Host und Netzteil unterscheiden zu können. Bei 10.0.0.0 kann für alle Netze von 10.0.0.0/8 bis 10.0.0.0/31 stehen. Ebenso gibt es Netzadresse ohne 0 (e.g. 192.168.2.240/28).

0.0.0.0 ist einfach nur die Netzadresse des gesamten Netzes.
Mir klar. Aber gilt nicht auch 0.0.0.0 als Standartgateway zum routen?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

jbs hat geschrieben:0 für Netz und 255 für Broadcast (bei Class-C Netzen)
Genau! Dass das natürlich nur bei C-Class funktioniert und deshalb allegmein natürlich nicht sein kann, habe ich nicht bedacht :oops:
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten