2012-08-25 166 views
0

我有一台用Java编写的ServerSocket服务器。Java + ServerSocket +防火墙

而且我有一个客户端,它是一个企业防火墙,它阻止了除公共端口之外的所有内容。

我已经在SMTP端口上启动了服务器(#25)。

带防火墙的用户连接到它,到目前为止一切正常。

然后服务器处理ServerSocket.accept()。据我了解,它在随机端口上创建一个套接字(每次端口号不同)。由于防火墙而失败。

我的问题是 - 我如何让ServerSocket.accept()从我的白名单中选择一个套接字端口?我知道它不适合大规模在线使用,但我想让我的朋友能够连接到我的服务器。

可能吗?如何?

+0

我认为你需要使用像朋友一边的袜子:http://en.wikipedia.org/wiki/SOCKS。假设您的家中没有配置问题,您必须允许出站服务器通信。 – Picarus

回答

0

服务器套接字不选择随机端口。它是选择随机端口的客户端套接字。我的猜测是,你的防火墙是聪明的,它知道检测连接是否通过某种类型的DPI(深度包检测)。

如果你想误导它,你可以尝试运行在前2-3个数据包中看起来像smtp的数据,然后切换到你的协议。

另一种选择是用一种连接器的系统之外,在这种情况下,两台机器,它们通过第三客户端连接的客户端(有很多这样的代理服务器)

+0

我不同意,@soulbuner的假设是对的,定义的端口只用于建立连接。接受第二个随机端口后,超过1024用于数据传输。 – Picarus

+0

作为DPI引擎的前开发人员,我认为这是正确的,您可以使用wireshark记录一些http流量,然后查看。有一些使用多个通道的协议如FTP,但事实并非如此。 – roni

+0

然后我们中的一个人没有正确理解这个问题,因为我的经历与@soulburner解释相同 – Picarus