简介
SOCKS是一个优良的网络协议,次要被用来做代理,它的两个次要版本是SOCKS4和SOCKS5,其中SOCKS5提供了对认证的反对。通常来说咱们应用SSH工具能够构建简略的SOCKS协定通道,那么对于netty来说,是怎么提供对SOCKS的反对呢?一起来看看吧。
SocksMessage
首先是代表SOCKS音讯对象的SocksMessage。SocksMessage是一个接口,它外面只有一个返回SocksVersion的version办法。
SocksVersion示意的是Socks的版本号。在netty中,反对三个版本,别离是:
SOCKS4a((byte) 0x04), SOCKS5((byte) 0x05), UNKNOWN((byte) 0xff);
其对应的数值是SOCKS协定中的VER字段,咱们以SOCKS4协定为例,再温习一下SOCKS的协定构造:
含意 | VER | CMD | DSTPORT | DSTIP | ID |
---|---|---|---|---|---|
字节个数 | 1 | 1 | 2 | 4 | 可变 |
既然netty中SOCKS有两个版本,绝对于的SocksMessage接口就有两个实现,别离是Socks4Message和Socks5Message。
Socks4Message
Socks4Messag继承自SocksMessage,示意的是SOCKS4的音讯。
事实上,Socks4Messag是一个tag interface,它外面什么内容都没有。
public interface Socks4Message extends SocksMessage { // Tag interface}
对于SOCKS4来说,有两种数据申请类型,别离是CONNECT和BIND,这两种申请类型被定义在Socks4CommandType中:
public static final Socks4CommandType CONNECT = new Socks4CommandType(0x01, "CONNECT"); public static final Socks4CommandType BIND = new Socks4CommandType(0x02, "BIND");
有申请就有响应,对应的有两个类,别离是Socks4CommandRequest和Socks4CommandResponse。
对于Request来说,咱们须要申请类型,USERID,DSTIP和DSTPORT这几个数据:
Socks4CommandType type(); String userId(); String dstAddr(); int dstPort();
对于响应来说,有四个不同的状态,别离是SUCCESS、REJECTED_OR_FAILED、IDENTD_UNREACHABLE、IDENTD_AUTH_FAILURE。
public static final Socks4CommandStatus SUCCESS = new Socks4CommandStatus(0x5a, "SUCCESS"); public static final Socks4CommandStatus REJECTED_OR_FAILED = new Socks4CommandStatus(0x5b, "REJECTED_OR_FAILED"); public static final Socks4CommandStatus IDENTD_UNREACHABLE = new Socks4CommandStatus(0x5c, "IDENTD_UNREACHABLE"); public static final Socks4CommandStatus IDENTD_AUTH_FAILURE = new Socks4CommandStatus(0x5d, "IDENTD_AUTH_FAILURE");
除了Socks4CommandStatus之外,响应申请还有DSTIP和DSTPORT两个属性。
Socks4CommandStatus status(); String dstAddr(); int dstPort();
Socks5Message
同样的,对于SOCKS5来说,也有一个对应的接口Socks5Message,这个接口也是一个Tag interface,它外面什么都没有:
public interface Socks5Message extends SocksMessage { // Tag interface}
对于SOCKS5来说,它的申请要比SOKCS4要简单,首先的申请是一个初始化申请Socks5InitialRequest,该申请蕴含了能够承受的认证列表。
这个列表用Socks5AuthMethod来示意,它蕴含4个办法:
public static final Socks5AuthMethod NO_AUTH = new Socks5AuthMethod(0x00, "NO_AUTH"); public static final Socks5AuthMethod GSSAPI = new Socks5AuthMethod(0x01, "GSSAPI"); public static final Socks5AuthMethod PASSWORD = new Socks5AuthMethod(0x02, "PASSWORD"); public static final Socks5AuthMethod UNACCEPTED = new Socks5AuthMethod(0xff, "UNACCEPTED");
对于Socks5InitialRequest来说,它蕴含了一个authMethods的列表:
public interface Socks5InitialRequest extends Socks5Message { List<Socks5AuthMethod> authMethods();}
对于InitialRequest来说,对应的也有Socks5InitialResponse,它蕴含了服务端抉择的Socks5AuthMethod,所以对Socks5InitialResponse来说,它外面只蕴含了一个Socks5AuthMethod:
public interface Socks5InitialResponse extends Socks5Message { Socks5AuthMethod authMethod();}
客户端和服务器端协商好抉择的认证协定之后,接下来就是认证的过程,如果应用的是用户名明码的模式,则对应的是Socks5PasswordAuthRequest:
public interface Socks5PasswordAuthRequest extends Socks5Message { String username(); String password();}
password认证的后果只有两种后果,别离是SUCCESS和FAILURE:
public static final Socks5PasswordAuthStatus SUCCESS = new Socks5PasswordAuthStatus(0x00, "SUCCESS"); public static final Socks5PasswordAuthStatus FAILURE = new Socks5PasswordAuthStatus(0xFF, "FAILURE");
对于Socks5PasswordAuthResponse来说,它蕴含了一个认证的status:Socks5PasswordAuthStatus。
认证结束之后,接下来就能够发送CommandRequest了。对应的Socks5CommandRequest蕴含上面几个属性:
Socks5CommandType type(); Socks5AddressType dstAddrType(); String dstAddr(); int dstPort();
对应的Socks5CommandResponse蕴含上面的属性:
Socks5CommandStatus status(); Socks5AddressType bndAddrType(); String bndAddr(); int bndPort();
总结
以上就是netty对SOCKS4和SOCKS5协定的音讯封装。基本上netty中的对象是和SOCKS协定统一的。
本文已收录于 http://www.flydean.com/36-netty-socks-support/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!