从java SOCKS套接字检测协议

时间:2016-03-06 06:37:24

标签: java sockets socks

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

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

1 个答案:

答案 0 :(得分:1)

  那么

是否可以通过任何方式检查后续消息以确定数据的协议?...有一种方法可以查看数据是说HTTPS,还是FTP,还是“NetFlix streaming”等等?

基本上,您有目标端口,目标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)。

正如您所看到的,所有这些都使用了大量的启发式方法,这些启发式方法适用于大多数但不是所有情况。除此之外,根据您所需的流量分类质量,这可能是一项非常复杂的任务。