Wie kann ich mit einem Socket Verbindungen nur vom localhost (in Java) akzeptieren?

8

Ich habe eine Java App (die nicht in irgendeinem Anwendungscontainer läuft), die auf einem ServerSocket nach Verbindungen lauscht. Ich möchte nur Verbindungen akzeptieren, die von localhost kommen. Momentan, nachdem eine Verbindung akzeptiert wurde, überprüft sie die Peer-IP und weist sie zurück, wenn sie nicht die Loopback-Adresse ist, aber ich weiß, dass Peer-IP-Adressen gefälscht werden können. Also, wenn möglich, würde ich lieber an einen Socket binden, der nur auf der Loopback-Schnittstelle lauscht; Ist das möglich?

Ich habe ein paar verschiedene Dinge ausprobiert (zum Beispiel die Angabe von "127.0.0.1" als lokale Adresse beim Aufruf von bind ()) ohne Erfolg. Vielen Dank im Voraus.

Vielen Dank für Ihre Hilfe. Es ist mir peinlich zuzugeben, dass dies alles mein Fehler war. Unsere Anwendung hört zwei verschiedene Ports ab, und ich habe einen an die Loopback-Schnittstelle gebunden, aber gegen den anderen getestet. Wenn ich tatsächlich versuche, an den richtigen Port zu telnet, funktioniert alles einwandfrei (d. H. Bindung an "127.0.0.1" macht genau das, was es tun soll).

Was die Loopback-Adresse betrifft, haben Sie recht. Ich hätte es nicht wie die Hauptsorge klingen lassen sollen. Wirklich, das gewünschte Verhalten besteht darin, nur lokale Verbindungen einzugehen, und eine Bindung an nur die lokale Schnittstelle ist eine direktere Möglichkeit, dies zu erreichen, als alle Verbindungen zu akzeptieren und dann nicht-lokale zu schließen.

    
Kev 19.09.2008, 02:38
quelle

5 Antworten

7

Peer-IP-Adressen können auf diese Weise nicht gefälscht werden. Haben Sie nichts zu befürchten, wenn Sie die Technik der Überprüfung des Peers verwenden und entscheiden, die Verbindung während der Einrichtung zu trennen.

Allerdings: Die Bindung an 127.0.0.1 sollte funktionieren und das Betriebssystem veranlassen, dem verbindenden Host mitzuteilen, dass nichts zuhören kann, wenn sie sich mit einer der anderen IP-Adressen des Systems verbinden. Kannst du diese Frage mit einem kompilierbaren Beispiel ändern? Vielleicht haben Sie einen einfachen Fehler gemacht.

    
Jerub 19.09.2008 02:41
quelle
3

Wenn die Peer-Adresse gefälscht ist, können Sie nichts weiter tun.

Es ist jedoch nicht einfach, 127.0.0.1 zu spoofen. Sie müssten einen TCP / IP-Stack haben, der dumm genug ist, ein solches Paket zu akzeptieren. Es gäbe keine Möglichkeit für den Spoofer, Pakete zurück zu empfangen. Auf einem guten TCP / IP-Stack sollte es nicht in der Lage sein, die Sequenznummern zu erraten, so dass es nicht mit der erwarteten Konversation mithalten kann.

    
Tom Hawtin - tackline 19.09.2008 10:05
quelle
3

Sie könnten, wie Sie bereits zu tun scheinen, die Verbindung sowieso akzeptieren () und dann getInetAddress () verwenden, um sicherzustellen, dass die Adresse autorisiert ist. Wenn nicht, schließen Sie einfach () die Steckdose sofort. 127.0.0.1 ist nicht eine Adresse, die gefälscht werden kann.

Alternativ können Sie Ihren eigenen Sicherheitsmanager installieren, dessen checkAccept () -Methode mit der Adresse und dem Port der Gegenstelle aufgerufen wird. Das ist ein bisschen schwieriger - ich habe es nie versucht, da die erste Lösung für mich immer ausreichend war.

    
paxdiablo 19.09.2008 03:51
quelle
2
%Vor%     
Selfmade Javaman 14.02.2012 04:37
quelle
1

Wenn Sie Ihren ServerSocket binden, sollte localhost angeben, dass der TCP / IP-Stack die Verbindung ablehnt. Selbst wenn dies auf Ihrem System nicht funktioniert, kann localhost (okay, vielleicht, wenn jemand Ihren TCP / IP-Stack und den Standard-Gateway-Router gehackt hat) gefälscht werden, da diese Adresse nicht über die physikalische Schnittstelle geroutet wird. p>

Ich bin neugierig, warum Ihre Bindung nicht erfolgreich ist, was ist Ihr Betriebssystem, Java-Version, etc?

    
Steve Moyer 19.09.2008 02:43
quelle