Wie kann ich ein socket akzeptiert verbindungen nur vom localhost (in Java)?
Ich habe eine java app (läuft nicht in jeder Anwendung, die container), die hört auf einer ServerSocket-verbindungen. Ich möchte, dass es nur verbindungen von localhost. Derzeit, wenn eine Verbindung akzeptiert wird, prüft es die peer-IP und lehnt Sie ab, wenn Sie nicht die loopback-Adresse, aber ich weiß, dass peer-IP-Adressen können gefälscht werden. Also, wenn möglich, würde ich lieber eine Bindung an eine Steckdose, die nur lauscht auf dem loopback-interface; ist das möglich?
Habe ich versucht, ein paar andere Dinge (wie die Angabe "127.0.0.1" als die lokale Adresse beim Aufruf von bind ()), ohne Glück. Vielen Dank im Voraus.
Danke Euch allen für Eure Hilfe. Ich bin peinlich zugeben, dass das alles war mein Fehler. Unsere Anwendung hört auf zwei verschiedene ports, und ich war maßgeblich an der loopback-Schnittstelle, aber die Tests gegen die anderen. Wenn ich tatsächlich versuchen, mit telnet auf den entsprechenden port, funktioniert alles einwandfrei (d.h., die Bindung an die "127.0.0.1" genau das tut, was es soll).
Als für spoofing die loopback-Adresse, die Sie Jungs haben Recht. Ich sollte nicht gemacht haben, es Klang wie das primäre Anliegen. Wirklich, das gewünschte Verhalten nur lokale verbindungen und die Bindung an nur die lokale Schnittstelle ist ein direkter Weg, dies zu erreichen, als die Annahme alle verbindungen schließen nicht-einheimischen.
- Wo hast du die information, dass 127.0.0.1 manipuliert werden können? Ich bin skeptisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Peer-IP-Adressen nicht gefälscht werden auf diese Weise, haben Sie nichts zu befürchten, die mit der Technik der Inspektion der peer-und der Entscheidung, um die drop-Verbindung während der Einrichtung.
Aber: Bindung an 127.0.0.1 funktioniert, und verursachen, das Betriebssystem zu sagen, die den Anschluss von host, dass da nichts zu hören, wenn Sie eine Verbindung auf einem der Systeme, die anderen ip-Adressen. Können Sie ändern Sie diese Frage mit einem kompilierbare Beispiel? Vielleicht haben Sie einen einfachen Fehler.
Wenn die peer-Adresse gefälscht ist, dann gibt es nichts mehr, dass Sie tun können.
Jedoch vorzutäuschen, um die 127.0.0.1 ist nicht einfach. Sie haben ein TCP/IP-stack, die dumm genug, zu akzeptieren solche ein Paket. Gäbe es keine Möglichkeit der spoofer empfangen von Paketen zurück. Auf eine gute TCP/IP-stack, es sollte nicht in der Lage zu erraten, die Reihenfolge von zahlen, so dass es nicht mithalten kann mit dem erwarteten Gespräch.
Kann man, wie du schon scheinen zu tun, accept() wird die Verbindung sowieso dann verwenden getInetAddress (), um sicherzustellen, die Adresse ist ein autorisierter man. Wenn nicht, einfach schließen() der socket sofort.
127.0.0.1
ist nicht eine Adresse, die manipuliert werden können.Alternativ können Sie installieren Ihre eigenen security-manager, die haben Ihren checkAccept () - Methode aufgerufen, wobei die Adresse und der port des remote-site. Thet ist ein wenig schwieriger - ich habe das nie ausprobiert, da die erste Lösung hat immer ausreichend für mich.
Wenn Sie binden Ihre ServerSocket unter Angabe localhost sollte die TCP/IP-stack verwerfen die Verbindung. Auch wenn dies nicht auf Ihrem system funktioniert, kann localhost nicht (okay, vielleicht, wenn jemand gehackt Ihre TCP/IP-stack und die Standard-gateway-router) manipuliert werden, da diese Adresse nicht geroutet, die über die physische Schnittstelle.
Ich bin neugierig, warum Sie Ihre Bindung nicht erfolgreich, was ist Ihr OS, Java version, etc?