9

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

我尝试了一些不同的方法(例如在调用 bind() 时将“127.0.0.1”指定为本地地址),但都没有成功。提前致谢。


谢谢大家的帮助。我很尴尬地承认这都是我的错。我们的应用程序监听两个不同的端口,我将一个绑定到环回接口,但对另一个进行测试。当我真正尝试远程登录到正确的端口时,一切正常(即绑定到“127.0.0.1”完全符合它的预期)。

至于欺骗环回地址,你们是对的。我不应该让它听起来像主要关注点。确实,所需的行为是只接受本地连接,并且只绑定到本地接口是一种比接受所有连接然后关闭非本地连接更直接的方法。

4

5 回答 5

8

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

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

于 2008-09-19T02:41:53.803 回答
3

如果对等地址被欺骗,那么您将无能为力。

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

于 2008-09-19T10:05:31.973 回答
3
if (socket.getInetAddress().isLoopbackAddress()){
    //Your code goes here
}
于 2012-02-14T04:37:51.500 回答
3

正如您似乎已经在做的那样,您可以无论如何都接受()连接,然后使用 getInetAddress() 来确保该地址是经过授权的地址。如果没有,只需立即关闭()套接字。127.0.0.1不是可以被欺骗的地址。

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

于 2008-09-19T03:51:46.913 回答
1

当您绑定 ServerSocket 时,指定 localhost 应该会使 TCP/IP 堆栈拒绝连接。即使这在您的系统上不起作用,localhost 也不能​​被欺骗(好吧,也许如果有人入侵了您的 TCP/IP 堆栈和默认网关路由器),因为该地址不是通过物理接口路由的。

我很好奇为什么您的绑定不成功,您的操作系统、Java 版本等是什么?

于 2008-09-19T02:43:38.947 回答