代码之家  ›  专栏  ›  技术社区  ›  Domenic D.

从java SOCKS套接字检测协议

  •  3
  • Domenic D.  · 技术社区  · 8 年前

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Steffen Ullrich    8 年前

    那么是否有任何方法可以检查后续消息以确定数据的协议?。。。有没有一种方法可以查看数据是否是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 ).

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