从 java SOCKS 套接字检测协议

Posted

技术标签:

【中文标题】从 java SOCKS 套接字检测协议【英文标题】:Detect protocol from java SOCKS socket 【发布时间】:2016-03-06 06:37:23 【问题描述】:

我正在用 Java 开发一个自定义 SOCKS5 服务器。除了包含 HOST 和 PORT 的第一个 CONNECT 消息之外,还有什么方法可以检查后续消息以确定数据的协议?例如,如果应用程序数据以“GET /...”开头,则请求很可能是超文本传输​​协议 (HTTP),但这远不是一个完整的解决方案。有没有办法查看数据是 HTTPS、FTP 还是“NetFlix 流媒体”等...?

其次,如果数据是 http 或 https,我将如何将请求转发到专用的 HTTP 代理?

【问题讨论】:

【参考方案1】:

那么有什么方法可以检查后续消息以确定数据的协议吗?...有没有办法查看数据是 HTTPS、FTP 还是“NetFlix 流媒体”等...?

基本上你有目标端口、目标 IP 地址和主机名(如果 DNS 解析也通过 SOCKS5 服务器完成)和有效负载。基于众所周知的目标主机、目标端口和典型有效负载的知识,您可以构建启发式方法来猜测协议。

您会在当今的入侵检测系统、更好的防火墙和流量分类器中发现这样的启发式方法,它们在检测质量方面存在很大差异,而坚定的用户通常可以欺骗这些启发式方法。这是一个非常广泛的主题,但您可能会开始查看免费的深度检查 (DPI) 库,例如 nDPI,并阅读更多关于 DPI at Wikipedia 的信息。

其次,如果数据是 http 或 https,我将如何将请求转发到专用 HTTP 代理?

首先将目标从客户端请求的目标更改为代理。当然,这必须在传输任何可能与您在数据流上执行的 DPI 冲突的数据之前完成,因为某些连接首先从服务器(如 SMTP)获取数据,而其他连接(如 HTTP(S)首先从客户端获取数据)。因此,您可能需要在获取任何有效负载之前确定这是否是 HTTP(S),即仅基于目标端口。对于 HTTPS,您需要使用 CONNECT 请求建立隧道,如RFC 2817 中所述。对于 HTTP,您将修改请求以不仅包括路径,还包括完整的 URL(即http://host[:port]/path)。

正如您所见,所有这些都使用了许多适用于大多数但并非所有情况的启发式方法。除此之外,这可能是一项非常复杂的任务,具体取决于您需要的流量分类质量。

【讨论】:

感谢您的周到回复。我已经查看了 nDPI,如果我能让它工作,我可能会使用它。他们的示例显示了命令行工具的工作原理,但我没有太多运气在 API 上找到详细信息。正如我所提到的,我想在数据包通过网络时实时执行此操作。

以上是关于从 java SOCKS 套接字检测协议的主要内容,如果未能解决你的问题,请参考以下文章

SOCKS和socket有啥关系?

带有 Socks4 代理的 Java Socket 更改为 Socks5

在 Java 中使用 HTTP 代理作为 SOCKS

通过 socks 代理的 SSL 套接字 - 客户端 <---> 服务器数据是不是加密?

Android,错误套接字异常 (SOCKS)

Java-UDP Socket编程