必威体育Betway必威体育官网
当前位置:首页 > IT技术

SOCKS5代理原理探索

时间:2019-06-01 11:41:01来源:IT技术作者:seo实验室小编阅读:78次「手机版」
 

socks5代理软件

要了解SOCKS5协议的全部内容,请移步 RFC 1928 - SOCKS Protocol Version 5 ,内容很短,一共才 8 页,建议大家浏览一遍。

备注:相比 SOCKS5 , SOCKS4 不支持 UDP、认证、域名解析等

协议描述

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)

操作系统 : centos

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 客户端

网络连接 : Tencent-DevWiFi

操作系统 : ubuntu

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()

腾讯云主机部署

image

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()

本地机器部署

image

Wireshark 抓包

认证协商请求

image

认证协议响应

image

CONNECT 请求

image

CONNECT 响应

image

client -> server 发送数据

image

server -> client 发送数据 Part1

image

server -> client 发送数据 Part2

image

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

腾讯云主机部署

image

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()

本地机器部署

image

Wireshark 抓包

认证协商请求

image

认证协议响应

image

UDP ASSOCIATE 请求

image

备注:DST.PORT = 56081,表示后续客户端会通过56081端口向SOCKS5服务端发送UDP报文,服务端可以针对该信息做一些数据过滤

UDP ASSOCIATE 响应

image

备注:BND.ADDR = “127.0.0.1”,BND.PORT = 1080,表示后续SOCKS5服务端将通过 127.0.0.1:1080 对客户端的UDP报文进行转发

client -> server 发送数据

image

备注: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 发送数据

image

相关阅读

代理服务器的常用使用方法介绍(图文教程)

大多费尔公用模块都需要连接互联网,但有时可能因为网络问题而无法正常连接,这时可以尝试使用代理服务器。但首先您必需知道代理服务

相机标定(Camera calibration)原理、步骤

相机标定(Camera calibration)原理、步骤 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 在图像测量过程以及机器视觉

HandlerThread 的使用及原理

Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note tha

CableModem原理

Cable Modem的一些参数321物理层 下行通道的频率范围为88~860MHz,每个通道的带宽为6MHz(NTSC 6 G-MHz,PAL 8MHz),采用64QAM或2

windows系统下Shadowsocks代理共享给移动设备的方法

本篇为Windows系统下用电脑把Shadowsocks代理共享给局域网里的其他设备的教程(iPhone为例)。shadowsocks使用教程及账号就在这里不

分享到:

栏目导航

推荐阅读

热门阅读