简介

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的协定构造:

含意VERCMDDSTPORTDSTIPID
字节个数1124可变

既然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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!