有了SOCKS消息的封装之后,我们还需要做些什么工作才能搭建一个SOCKS服务器呢?
使用SSH搭建SOCKS服务器
其实最简单的办法就是使用SSH工具来建立SOCKS代理服务器。
先看下SSH建立SOCKS服务的命令:
ssh -f -C -N -D bindaddress:port name@server
复制代码
-f 表示SSH作为守护进程进入后台执行。
-N 表示不执行远程命令,只用于端口转发。
-D 表示是端口上的动态转发。这个命令支持SOCKS4和SOCKS5。
-C 表示发送前压缩数据。
bindaddress 本地服务器的绑定地址。
port 表示本地服务器的指定侦听端口。
name 表示ssh服务器登录名。
server表示ssh服务器地址。
上面命令的意思是,在本机建立端口绑定,然后将其转发到远程的代理服务器上。
比如我们可以在本机开一个2000的端口,将其转发到远程168.121.100.23这台机子上:
ssh -f -N -D 0.0.0.0:2000 root@168.121.100.23
复制代码
有了代理服务器之后,就可以使用了,首先介绍一个怎么在curl命令中使用SOCKS代理。
我们想通过代理服务器,访问www.flydean.com,该怎么做呢?
curl -x socks5h://localhost:2000 -v -k -X GET http://www.flydean.com:80
复制代码
要想检测SOCKS的连接,还可以使用netcat命令如下:
ncat –proxy 127.0.0.1:2000 –proxy-type socks5 www.flydean.com 80 -nv
复制代码
使用netty搭建SOCKS服务器
使用netty搭建SOCKS服务器的关键是使用netty服务器做中继,它需要建立两个连接,一个是客户端到代理服务器的连接,一个是代理服务器到目标地址的连接。接下来,我们一步一步探讨如何在netty中构建SOCKS服务器。
搭建服务器的基本步骤和普通的服务器基本一致,要注意的就是对消息的编码、解码和在消息读取处理过程中的转发。
encoder和decoder
对于一种协议来说,最终要的就是对应的encoder和decoder,用于协议对象和ByteBuf之间进行转换。
netty提供的SOCKS转换器叫做SocksPortUnificationServerHandler。先看下它的定义: