1. Socks5概述
Socks5协议是一款广泛使用的代理协议,它在使用TCP/IP协议通讯的客户端和服务器之间扮演一个中介角色,使得内部网中的客户端变得能够访问Internet网中的服务器,或者使C/S(Client和Server)之间的通讯更加安全。SOCKS5 代理服务器通过将客户端发来的请求转发给真正的目标服务器, 模拟了一个客户端请求操作。在这里,客户端和SOCKS5代理服务器之间也是通过TCP/IP协议进行通讯,客户端将原本要发送给真正服务器的请求先发送给SOCKS5服务器,然后SOCKS5服务器再将请求转发给真正的服务器。Socks5代理工作流程如下图所示:
2. Socks5代理优点
1)绕过互联网块
由于代理服务器充设备和互联网之间的中继,因此它们可以轻松绕过互联网块。例如,如果客户端IP被某个网站列入黑名单(或者使用VPN并且其服务器IP已被列入黑名单),则可以通过SOCKS5代理路由客户端的流量,从而绕过此块。但是,它无法规避国家防火墙,因为大多数防火墙都使用深度数据包检测(DPI)。这意味着客户端的ISP在到达网站之前就已经阻止了客户端的流量。
2)没有程序,协议或流量限制
与只能解释和使用HTTP和HTTPS网页的HTTP代理不同,SOCKS5代理可以处理任何流量。HTTP代理是通常为特定协议设计的高级代理。虽然这意味着可以获得更好的连接速度,但它们并不像SOCKS代理那样灵活和安全。 SOCKS代理是低级代理,可以处理任何程序或协议以及任何流量。
3)更快,更可靠的连接
与仅使用TCP协议的前代产品不同,SOCKS5代理服务器可以使用UDP协议,确保可靠的连接和高效的性能。TCP互联网协议在客户端和服务器之间形成连接,确保所有数据包从一端到达另一端。它需要将内容拟合为固定格式,以便可以轻松传输。另一方面,UDP不关注来自客户端或服务器的所有数据包是否到达另一方以及它们是否以相同的顺序传输。 UDP不会浪费时间将数据包转换为固定包流。因此,有了这些UDP,SOCKS5可以提供更快的速度和可靠的连接。
4)错误减少,整体性能提升
许多其他代理重写数据包标头。因此,错误路由或错误标记数据的可能性很高。但SOCKS5代理服务器不会重写数据包标头,因此错误的可能性较低。由于错误少得多,性能会自动提高。但是,这会以客户端的隐私和安全为代价,因为数据包标头包含客户端的个人信息,并且可以轻松识别。
5)在P2P平台上表现更好
SOCKS5比其他代理更快,因为它传输较小的数据包。因此,它提供更快的下载速度,这就是许多用户使用它连接到P2P共享网站和平台的原因。
3. Socks5交互流程
当 TCP 客户端想要建立必须透过防火墙(取决于具体的情况)的连接时,客户端必须与合适的 SOCKS 服务建立连接。SOCKS 服务默认监听 1080 端口,如果连接成功,客户端需要与服务端协商认证方式并完成认证,之后便可以发送中继请求。SOCKS 服务端会执行请求,要么建立起合适的连接,要么拒绝请求。
3.1 认证
客户端向代理服务器发送代理请求,其中包含了代理的版本和认证方式:
VER | NMETHODS | METHODS |
1 | 1 | 1 to 255 |
- VER:版本号
- X’04’:Socks4协议
- X’05’:Socks5协议
- NMETHODS:方法数目,该字段包含了METHODS中锁包含了方法识别码的个数
- METHOD :方法列表
代理服务器从给定的方法列表中选择一个方法并返回选择报文
VER | METHOD |
1 | 1 |
如果 METHOD (方法)字段为 X’FF‘, 表示方法列表中的所有方法均不可用,客户端收到此信息必须关闭连接。
目前已定义方法如下:
- X’00‘ 无需认证
- X’01‘ GSSAPI
- X’02‘ 用户名/密码
- X’03‘ 到 X’7F’ IANA 指定
- X’80‘ 到 X’FE’ 为私有方法保留
- X’FF‘ 无可接受方法
随后,客户端与服务端开始协商该方法对应的后续认证,后续认证方法因方法而异,在此不进行展开。
3.2 请求
一旦认证方法对应的协商完成,客户端就可以发送请求细节了。如果认证方法为了完整性或者可信性的校验,需要对后续请求报文进行封装,则后续请求报文都要按照对应规定进行封装。
SOCKS请求格式如下:
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
1 | 1 | X’00’ | 1 | Variable | 2 |
字段含义:
- VER:协议版本: X‘05’
- CMD:命令
- CONNECT 连接, X‘01’
- BIND 监听X‘02’
- UDP ASSOCIATE UDP关联 X‘03’
- RSV:保留字段
- ATYP:地址类型
- X‘01’: 表明地址字段为一个 IPV4 地址,长度为 4 个字节
- X‘03’ :表明地址字段为一个(合法的)域名,且第一个字节为域名长度标识,(显然)其不以 NULL 作为结束标识
- X‘04’ :表明地址字段为一个 IPV6 地址,长度为 16 个字节
- DST.ADDR:目标地址
- DST.PORT目标端口 (网络字节序)
SOCKS 服务端会根据请求类型和源、目标地址,执行对应操作,并且返回对应的一个或多个报文信息。
回复报文,客户端与服务端建立连接并完成认证之后就会发送请求信息,服务端执行对应请求并返回如下格式的报文:
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
1 | 1 | X’00’ | 1 | Variable | 2 |
字段含义:
- VER协议版本: X‘05’
- REP 回复字段(回复类型):
- X‘00’ 成功
- X‘01’ 常规 SOCKS 服务故障
- X‘02’ 规则不允许的连接
- X‘03’ 网络不可达
- X‘04’ 主机无法访问
- X‘05’ 拒绝连接
- X‘06’ 连接超时
- X‘07’ 不支持的命令
- X‘08’ 不支持的地址类型
- X‘09’ 到 X’FF’ 未定义
- RSV 保留字段
- ATYP 地址类型
- IPV4 X‘01’
- 域名 X‘03’
- IPV6 X‘04’
- BND.ADDR 服务端绑定地址
- BND.PORT 服务端绑定端口 (网络字节序)
其中,标记为保留字段( RSV )的值必须设定为 X‘00’ 。
如果协商的方法为了完整性、可信性的校验需要封装数据包,则返回的数据包也会进行对应的封装。
3.3 通信
当连接建立后,客户端就可以和正常一样访问服务端通信了,此时通信的数据除了目的地址是发往代理程序以外,所有内容都是和普通连接一模一样。对代理程序而言,后面所有收到的来自客户端的数据都会原样转发到服务读端。
3.4 Socks5交互流程图
4. 搭建步骤
sudo su #进入root模式
apt update #更新apt(或者是apt-get,本次使用的下载工具是apt)
apt install dante-server #安装dante服务,后续是使用此服务配置代理
mv /etc/danted.conf /etc/danted.conf.bak #备份原配置文件
touch /etc/danted.conf /新建配置文件,也可直接进入下一步
vi /etc/danted.conf /配置dante文件
danted.conf配置信息如下:
logoutput: /var/log/danted.log #日志输出文件
internal: ens38 port = 1080 #内网IP(或网卡)和监听端口
external: ens33 #外网IP(或网卡)
socksmethod: username none #不设置用户验证,若设置则改成用户名
user.privileged: proxy #特权用户,也可是root
user.notprivileged: nobody
user.libwrap: nobody
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect disconnect
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0 port gt 1023
command: bind
log: connect disconnect
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: connect udpassociate
log: connect disconnect
}
socks block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
mkdir /var/log/danted.log #创建输出log文件(日志)
/etc/init.d/danted start #启动dante服务,若dante服务处于启动状态,且配置文件经过更
#改,可以使用/etc/init.d/danted restart重启服务
netstat -anp | grep 1080 #检查是否启动成功,用户连接后也可用此命令查看连接情况
/etc/init.d/danted shutdown #停止dante服务
5. 使用sock5代理
1.下载安装proxifier;
2.点击proxy servers ->Add ->填入服务器IP和商品,选择sock5协议,不选择身份验证;
3.检查点击Check,检查sock5是否可用,如果配置的外网本身不能访问google,则在Test Settings里将www.google.com改成www.baidu.com;
4.在第二步后点击OK,然后一直下一步,再点击Profile -> Proxification Rules ->add ->配置下面的各个选项,记得在最下面的Action中选择在2中添加的socks5代理服务器;
5.打开浏览器访问网络。