如何仅使用localhost(Java)中的套接字接受连接?

时间:2008-09-19 02:38:58

标签: java sockets localhost loopback serversocket

我有一个java应用程序(不在任何应用程序容器中运行),它监听ServerSocket上的连接。我希望它只接受来自localhost的连接。目前,在接受连接后,它会检查对等IP并拒绝它,如果它不是环回地址,但我知道对等IP地址可能是欺骗性的。所以,如果可能的话,我宁愿绑定到只监听环回接口的套接字;这有可能吗?

我尝试了一些不同的东西(例如在调用bind()时将“127.0.0.1”指定为本地地址)没有运气。提前谢谢。


谢谢大家的帮助。我很尴尬地承认这完全是我的错。我们的应用程序侦听两个不同的端口,我将一个绑定到loopback接口,但是测试另一个。当我实际尝试telnet到正确的端口时,一切正常(即绑定到“127.0.0.1”完全符合预期)。

至于欺骗环回地址,你们是对的。我不应该把它听起来像是主要关注点。实际上,期望的行为是仅采用本地连接,并且仅绑定到本地接口是比接受所有连接然后关闭非本地连接更直接的实现方式。

5 个答案:

答案 0 :(得分:7)

对等IP地址不能以这种方式欺骗,您不必担心使用检查对等方的技术并决定在建立期间断开连接。

但是:绑定到127.0.0.1应该可以工作,并且如果它们在其中一个系统上连接其他IP地址,则会导致操作系统告诉连接主机没有任何监听。你能用一个可编辑的例子修改这个问题吗?也许你犯了一个简单的错误。

答案 1 :(得分:3)

你可以,正如你已经做过的那样,无论如何都接受()连接,然后使用getInetAddress()来确保地址是经过授权的。如果没有,只需直接关闭()插座即可。 127.0.0.1 不是可以欺骗的地址。

或者,您可以安装自己的安全管理器,该管理器将使用远程站点的地址和端口调用其checkAccept()方法。这有点难 - 我从来没有尝试过,因为第一个解决方案对我来说一直都足够了。

答案 2 :(得分:3)

如果对等地址被欺骗,那么你就无法做更多事情。

然而,欺骗127.0.0.1并不容易。您必须具有足够的TCP / IP堆栈才能接受此类数据包。欺骗者无法接收数据包。在一个好的TCP / IP堆栈上,它应该无法猜测序列号,因此它无法跟上预期的对话。

答案 3 :(得分:2)

if (socket.getInetAddress().isLoopbackAddress()){
    //Your code goes here
}

答案 4 :(得分:1)

绑定ServerSocket时,指定localhost应该使TCP / IP堆栈拒绝连接。即使这不适用于您的系统,localhost也不能(好吧,可能是有人攻击您的TCP / IP堆栈和默认网关路由器)被欺骗,因为该地址不通过物理接口路由。

我很好奇为什么你的绑定没有成功,你的操作系统,Java版本等是什么?