socks5代理软件
要了解SOCKS5协议的全部内容,请移步 RFC 1928 - SOCKS Protocol Version 5 ,内容很短,一共才 8 页,建议大家浏览一遍。
协议描述
SOCKS 服务端缺省侦听在 TCP 1080 端口。
客户端发起连接之后,首先需要和服务端协商认证方法,请求格式为:
VER | NMETHODS | METHODS |
---|---|---|
1 | 1 | 1 to 255 |
- VER : 协议版本号,固定取值 0x05
- NMETHODS : 客户端支持的认证机制数目
- METHODS : 客户端支持的认证机制列表
服务端收到认证协商请求后,会从客户端提供的列表中选择一个方法,然后把结果返回客户端,响应格式为:
VER | METHOD |
---|---|
1 | 1 |
- VER : 协议版本号
- METHOD : 服务端选择的认证方法
- 0x00 : NO AUTHENTICATION requireD
- 0x01 : GSSAPI
- 0x02 : USERNAME/PASSword
- 0x03-0x7F : IANA assigned
- 0x80-0xFE : RESERVED FOR PRIVATE METHODS
- 0xFF : NO ACCEPTABLE METHODS
认证协商完成以后,客户端开始发送具体的请求,请求格式为:
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | Variable | 2 |
- VER : 协议版本号
- CMD : 请求类型
- 0x01 : CONNECT
- 0x02 : BIND
- 0x03 : UDP ASSOCIATE
- RSV : 保留字段,固定取值 0x00
- ATYP : DST.ADDR地址类型
- 0x01 : IPV4
- 0x03 : 域名
- 0x04 : IPV6
- DST.ADDR : 请求目的地址
- DST.PORT : 请求目的端口
备注:CONNECT 用于 TCP 场景,BIND 主要用于 FTP 等罕见场景,UDP ASSOCIATE 用于 UDP 场景。
服务端收到请求后,处理后返回,响应格式为:
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | Variable | 2 |
- VER : 协议版本号
- REP : 返回值
- 0x00 : succeeded
- 0x01 : general SOCKS server failure
- 0x02 : connection not allowed by ruleset
- 0x03 : Network unreachable
- 0x04 : host unreachable
- 0x05 : Connection refused
- 0x06 : TTL expired
- 0x07 : command not supported
- 0x08 : Address type not supported
- 0x09-0xFF : unassigned
- RSV : 保留字段,固定取值 0x00
- ATYP : BND.ADDR地址类型
- 0x01 : IPV4
- 0x03 : 域名
- 0x04 : IPV6
- BND.ADDR : 服务端绑定地址
- BND.PORT : 服务端绑定端口
至此,客户端和服务端的连接已经建立完成,后续客户端可以通过 SOCKS5 服务端与目的地址进行数据传输。
实验分析
环境搭建
shadowsocks 服务端
腾讯云主机(外网 : 139.199.76.147 内网 : 10.186.8.226)
yum install Python-setuptools && easy_install pip
pip install shadowsocks
ssserver -s 10.186.8.226 -p 8388 -k HdkeKDd389io -m aes-256-cfb -t 300
shadowsocks 客户端
sudo apt install shadowsocks
sslocal -s 139.199.76.147 -p 8388 -b 127.0.0.1 -l 1080 -k HdkeKDd389io -m aes-256-cfb -t 300
TCP 分析
tcp_echo_server
# tcp_echo_server.py
import sys, socket
host = sys.argv[1]
port = int(sys.argv[2])
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(1)
while True:
connection, client_address = sock.accept()
try:
print >>sys.stderr, 'connection from', client_address
while True:
data = connection.recv(16)
print >>sys.stderr, 'received "%s"' % data
if data:
print >>sys.stderr, 'sending data back to the client'
connection.sendall(data)
else:
print >>sys.stderr, 'no more data from', client_address
break
finally:
connection.close()
腾讯云主机部署
tcp_echo_client
# tcp_echo_client.py
import sys, socket, socks
host = sys.argv[1]
port = int(sys.argv[2])
sock = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
sock.set_proxy(socks.SOCKS5, "127.0.0.1", 1080)
sock.connect((host, port))
try:
# Send data
message = 'This is the message. It will be repeated.'
print >>sys.stderr, 'sending "%s"' % message
sock.sendall(message)
# Look for the response
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(16)
amount_received += len(data)
print >>sys.stderr, 'received "%s"' % data
finally:
print >>sys.stderr, 'closing socket'
sock.close()
本地机器部署
Wireshark 抓包
认证协商请求
认证协议响应
CONNECT 请求
CONNECT 响应
client -> server 发送数据
server -> client 发送数据 Part1
server -> client 发送数据 Part2
UDP 分析
udp_echo_server
# udp_echo_server.py
import sys, socket
host = sys.argv[1]
port = int(sys.argv[2])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
while True:
message, client_address = sock.recvfrom(65535)
print >>sys.stderr, 'connection from', client_address
print >>sys.stderr, 'received "%s"' % message
print >>sys.stderr, 'sending data back to the client'
sock.sendto(message, client_address)
print >>sys.stderr, 'finish', client_address
腾讯云主机部署
udp_echo_client
# udp_echo_client.py
import sys, socket, socks
host = sys.argv[1]
port = int(sys.argv[2])
sock = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
sock.set_proxy(socks.SOCKS5, "127.0.0.1", 1080)
sock.connect((host, port))
message = 'This is the message. It will be repeated.'
print >>sys.stderr, 'sending "%s"' % message
sock.send(message)
data = sock.recv(65535)
print >>sys.stderr, 'received "%s"' % data
sock.close()
本地机器部署
Wireshark 抓包
认证协商请求
认证协议响应
UDP ASSOCIATE 请求
备注:DST.PORT = 56081,表示后续客户端会通过56081端口向SOCKS5服务端发送UDP报文,服务端可以针对该信息做一些数据过滤
UDP ASSOCIATE 响应
备注:BND.ADDR = “127.0.0.1”,BND.PORT = 1080,表示后续SOCKS5服务端将通过 127.0.0.1:1080 对客户端的UDP报文进行转发
client -> server 发送数据
备注:UDP报文格式
RSV FRAG ATYP DST.ADDR DST.PORT DATA 2 1 1 Variable 2 Variable - RSV : 保留字段,固定取值 0x0000
- FRAG : 分片序号
- ATYP : DST.ADDR地址类型
- 0x01 : IPV4
- 0x03 : 域名
- 0x04 : IPV6
- DST.ADDR : 请求目的地址
- DST.PORT : 请求目的端口
- DATA : 用户数据
server -> client 发送数据
相关阅读
大多费尔公用模块都需要连接互联网,但有时可能因为网络问题而无法正常连接,这时可以尝试使用代理服务器。但首先您必需知道代理服务
相机标定(Camera calibration)原理、步骤 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉
Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note tha
Cable Modem的一些参数321物理层 下行通道的频率范围为88~860MHz,每个通道的带宽为6MHz(NTSC 6 G-MHz,PAL 8MHz),采用64QAM或2
windows系统下Shadowsocks代理共享给移动设备的方法
本篇为Windows系统下用电脑把Shadowsocks代理共享给局域网里的其他设备的教程(iPhone为例)。shadowsocks使用教程及账号就在这里不