当前位置: 首页 > 后端技术 > Java

netty系列:netty对SOCKS协议的支持

时间:2023-04-01 15:03:26 Java

简介SOCKS是一个优秀的网络协议,主要用作代理,它的两个主要版本是SOCKS4和SOCKS5,其中SOCKS5提供了对认证的支持。一般来说,我们可以使用SSH工具搭建一个简单的SOCKS协议通道,那么netty是如何提供对SOCKS的支持的呢?一起来看看吧。SocksMessage首先是表示SOCKS消息对象的SocksMessage。SocksMessage是一个接口,它只有一个返回SocksVersion的版本方法。SocksVersion表示Socks的版本号。netty中支持三个版本,分别是:SOCKS4a((byte)0x04),SOCKS5((byte)0x05),UNKNOWN((byte)0xff);对应的值为SOCKS协议中的VER字段,我们以SOCKS4协议为例,再回顾一下SOCKS协议结构:含义VERCMDDSTPORTDSTIPID字节数1124变量由于netty中SOCKS有两个版本,所以有两种实现SocksMessage接口,即Socks4Message和Socks5Message。Socks4MessageSocks4Messag继承自SocksMessage,代表SOCKS4消息。实际上,Socks4Messag是一个标签接口,里面什么都没有。publicinterfaceSocks4MessageextendsSocksMessage{//Taginterface}对于SOCKS4,有两种数据请求类型,分别是CONNECT和BIND,在Socks4CommandType中定义:publicstaticfinalSocks4CommandTypeCONNECT=newSocks4CommandType(0x01,"CONNECT");publicstaticfinalSocks4CommandTypeBIND=newSocks4CommandType(0x02,"BIND");有请求就会有响应,对应的类有两个,分别是Socks4CommandRequest和Socks4CommandResponse。对于Request,我们需要请求类型、USERID、DSTIP和DSTPORT:Socks4CommandTypetype();字符串userId();字符串dstAddr();intdstPort();对于响应,有四种不同的Status,分别是SUCCESS、REJECTED_OR_FAILED、IDENTD_UNREACHABLE、IDENTD_AUTH_FAILURE。publicstaticfinalSocks4CommandStatusSUCCESS=newSocks4CommandStatus(0x5a,"SUCCESS");publicstaticfinalSocks4CommandStatusREJECTED_OR_FAILED=newSocks4CommandStatus(0x5b,"REJECTED_OR_FAILED");publicstaticfinalSocks4CommandStatusIDENTD_UNREACHABLE=newSocks4CommandStatus(0x5c,"IDENTD_UNREACHABLE");publicstaticfinalSocks4CommandStatusIDENTD_AUTH_FAILURE=newSocks4CommandStatus(0x5d,"IDENTD_AUTH_FAILURE");除了Socks4CommandStatus,响应请求还有两个属性,DSTIP和DSTPORT。Socks4CommandStatus状态();字符串dstAddr();intdstPort();Socks5Message同样,对于SOCKS5,也有一个对应的接口Socks5Message,也是一个Tag接口,里面什么都没有:publicinterfaceSocks5MessageextendsSocksMessage{//Tag接口}对于SOCKS5,它的请求比SOKCS4。第一个请求是初始化请求Socks5InitialRequest,其中包含可接受的身份验证列表。这个列表由Socks5AuthMethod表示,它包含4个方法:publicstaticfinalSocks5AuthMethodNO_AUTH=newSocks5AuthMethod(0x00,"NO_AUTH");publicstaticfinalSocks5AuthMethodGSSAPI=newSocks5AuthMethod(0x01,"GSSAPI");=新的Socks5AuthMethod(0x02,“密码”);publicstaticfinalSocks5AuthMethodUNACCEPTED=newSocks5AuthMethod(0xff,"UNACCEPTED");对于Socks5InitialRequest,它包含了一个authMethods列表:publicinterfaceSocks5InitialRequestextendsSocks5authMethods();}对于InitialRequest,有对应的Socks5InitialResponse,其中包含了服务器选择的Socks5AuthMethod,所以对于Socks5InitialResponse,它只包含一个Socks5AuthMethod:publicinterfaceSocks5InitialResponse扩展Socks5Message{Socks5AuthMethodauthMethod);客户端和服务器端协商选定的认证协议后,下一步就是认证过程。如果使用用户名密码方式,对应的是Socks5PasswordAuthRequest:publicinterfaceSocks5PasswordAuthRequestextendsSocks5Message{Stringusername();字符串密码();}密码验证的结果只有两种,分别是SUCCESS和FAILURE:publicstaticfinalSocks5PasswordAuthStatusSUCCESS=newSocks5PasswordAuthStatus(0x00,"SUCCESS");publicstaticfinalSocks5PasswordAuthStatusFAILURE=newSocks5PasswordAuthStatus(0xFF,"FAILURE)对于Socks5PasswordAuthResponse,包含一个认证状态:Socks5PasswordAuthStatus认证完成后,接下来可以发送CommandRequest。对应的Socks5CommandRequest包含如下属性:Socks5CommandTypetype();Socks5AddressTypedstAddrType();StringdstAddr();intdstPort();对应的Socks5CommandResponse包含以下属性:Socks5CommandStatusstatus();Socks5AddressTypebndAddrType();StringbndAddr();intbndPort();总结以上是netty对SOCKS4的消息封装和SOCKS5协议。基本上netty中的对象都是和SOCKS协议一致的。这篇文章已经收录在http://www.flydean.com/36-netty-socks-support/最通俗的解读,最深刻的干货货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事》,懂技术,更懂你!