从 java SOCKS 套接字检测协议
Detect protocol from java SOCKS socket
我正在 Java 中开发自定义 SOCKS5 服务器。除了包含 HOST 和 PORT 的第一个 CONNECT 消息之外,还有什么方法可以检查后续消息以确定数据协议?例如,如果应用程序数据以 "GET /..." 开头,请求可能是超文本传输协议 (HTTP),但这远非完整的解决方案。有没有办法查看数据是 HTTPS、FTP 还是 "NetFlix streaming" 等...?
其次,如果数据是 http 或 https,我如何将请求转发到专用的 HTTP 代理?
is then any way to inspect the subsequent messages to determine the protocol of the data?... s there a way to see if the data is say HTTPS, or FTP, or "NetFlix streaming", etc...?
基本上你有目标端口、目标 IP 地址和主机名(如果 DNS 解析也通过 SOCKS5 服务器完成)和有效负载。基于众所周知的目标主机、目标端口和典型负载的知识,您可以构建启发式算法来猜测协议。
您会在当今的入侵检测系统、更好的防火墙和流量分类器中发现此类启发式方法,它们在检测质量上有很大差异,坚定的用户通常可以愚弄这些启发式方法。这是一个非常广泛的主题,但您可能会开始查看免费的深度检查 (DPI) 库,例如 nDPI and read more about DPI at Wikipedia.
Secondarily, if the data is http or https how would I forward the request to a dedicated HTTP proxy?
首先将目标从客户端请求的目标更改为代理。当然,这必须在传输任何数据之前完成,这可能与您在数据流上执行的 DPI 冲突,因为某些连接首先从服务器(如 SMTP)获取数据,而其他连接(如 HTTP(S))首先从客户端获取数据。因此,您可能需要在获取任何负载之前查明这是否是 HTTP(S),即仅基于目标端口。对于 HTTPS,您随后需要使用 CONNECT 请求建立隧道,如 RFC 2817 中所述。对于 HTTP,您将修改请求以不仅包括路径,还包括完整的 URL(即 http://host[:port]/path
)。
如您所见,所有这些都使用了很多适用于大多数但并非所有情况的启发式方法。除此之外,这可能是一项非常复杂的任务,具体取决于您需要的流量分类质量。
我正在 Java 中开发自定义 SOCKS5 服务器。除了包含 HOST 和 PORT 的第一个 CONNECT 消息之外,还有什么方法可以检查后续消息以确定数据协议?例如,如果应用程序数据以 "GET /..." 开头,请求可能是超文本传输协议 (HTTP),但这远非完整的解决方案。有没有办法查看数据是 HTTPS、FTP 还是 "NetFlix streaming" 等...?
其次,如果数据是 http 或 https,我如何将请求转发到专用的 HTTP 代理?
is then any way to inspect the subsequent messages to determine the protocol of the data?... s there a way to see if the data is say HTTPS, or FTP, or "NetFlix streaming", etc...?
基本上你有目标端口、目标 IP 地址和主机名(如果 DNS 解析也通过 SOCKS5 服务器完成)和有效负载。基于众所周知的目标主机、目标端口和典型负载的知识,您可以构建启发式算法来猜测协议。
您会在当今的入侵检测系统、更好的防火墙和流量分类器中发现此类启发式方法,它们在检测质量上有很大差异,坚定的用户通常可以愚弄这些启发式方法。这是一个非常广泛的主题,但您可能会开始查看免费的深度检查 (DPI) 库,例如 nDPI and read more about DPI at Wikipedia.
Secondarily, if the data is http or https how would I forward the request to a dedicated HTTP proxy?
首先将目标从客户端请求的目标更改为代理。当然,这必须在传输任何数据之前完成,这可能与您在数据流上执行的 DPI 冲突,因为某些连接首先从服务器(如 SMTP)获取数据,而其他连接(如 HTTP(S))首先从客户端获取数据。因此,您可能需要在获取任何负载之前查明这是否是 HTTP(S),即仅基于目标端口。对于 HTTPS,您随后需要使用 CONNECT 请求建立隧道,如 RFC 2817 中所述。对于 HTTP,您将修改请求以不仅包括路径,还包括完整的 URL(即 http://host[:port]/path
)。
如您所见,所有这些都使用了很多适用于大多数但并非所有情况的启发式方法。除此之外,这可能是一项非常复杂的任务,具体取决于您需要的流量分类质量。