SOCKSv5 協議通信的完整階段與報文格式詳解

SOCKSv5 協議的通信通常分為以下幾個主要階段:

  1. 方法協商階段 (Method Negotiation)
  2. 方法依賴的子協商階段 (Method-Dependent Sub-negotiation) - 本例為用戶名/密碼認證
  3. 請求發送階段 (Request Sending)
  4. 請求回復階段 (Request Reply)
  5. 數據傳輸階段 (Data Transfer)

場景設定回顧

  • 客戶端 IP: 192.168.1.10
  • SOCKS 服務器 IP: 10.0.0.1 (SOCKS 端口 1080)
  • 目標服務器 IP: 203.0.113.5 (Web 服務器,端口 80)
  • 認證憑據: 用戶名 myuser,密碼 mypass

階段一:方法協商 (Method Negotiation)

這是 SOCKSv5 會話的開始。客戶端與 SOCKS 服務器建立 TCP 連接后,首先會告訴服務器它支持哪些認證方法。服務器則會從中選擇一個并通知客戶端。

1.1 客戶端發送方法選擇報文 (Client Method Selection Message)

目的: 客戶端向 SOCKS 服務器聲明其支持的 SOCKS 版本和可用的認證方法列表。

報文格式:

+----+----------+----------+
|VER | NMETHODS | METHODS  |
+----+----------+----------+
| 1  |    1     | 1 to 255 | (單位:字節)
+----+----------+----------+
  • VER (1 字節): SOCKS 協議版本。對于 SOCKSv5,此字段固定為 X'05' (十進制 5)。

  • NMETHODS (1 字節): METHODS 字段中包含的方法標識符八位字節的數量。范圍是 1 到 255。

  • METHODS (1 到 255 字節): 一個或多個方法標識符的列表,每個標識符占用一個字節。

    • X'00' (0): 無需認證 (NO AUTHENTICATION REQUIRED)
    • X'01' (1): GSSAPI
    • X'02' (2): 用戶名/密碼 (USERNAME/PASSWORD)
    • X'03'X'7F' (3-127): IANA 分配的公共方法
    • X'80'X'FE' (128-254): 保留用于私有方法
    • X'FF' (255): 無可接受的方法 (NO ACCEPTABLE METHODS)

示例報文 (客戶端 -> SOCKS 服務器):

假設客戶端支持“無需認證”和“用戶名/密碼認證”。

十六進制: 05 02 00 02

報文內容解析:

  • 05: SOCKSv5。
  • 02: 客戶端提供了 2 種認證方法。
  • 00: 第一個方法,X'00' (無需認證)。
  • 02: 第二個方法,X'02' (用戶名/密碼認證)。
1.2 SOCKS 服務器回復方法選擇報文 (Server Method Selection Message)

目的: SOCKS 服務器告知客戶端它將使用哪種認證方法。

報文格式:

+----+--------+
|VER | METHOD |
+----+--------+
| 1  |   1    | (單位:字節)
+----+--------+
  • VER (1 字節): SOCKS 協議版本。固定為 X'05' (十進制 5)。
  • METHOD (1 字節): SOCKS 服務器從客戶端提供的列表中選擇的認證方法。如果服務器無法接受任何方法,則此字段為 X'FF' (255),此時客戶端必須關閉連接。

示例報文 (SOCKS 服務器 -> 客戶端):

服務器選擇“用戶名/密碼認證”。

十六進制: 05 02

報文內容解析:

  • 05: SOCKSv5。
  • 02: 服務器選擇了 X'02' (用戶名/密碼認證)。

階段二:方法依賴的子協商 (Method-Dependent Sub-negotiation) - 用戶名/密碼認證

由于服務器選擇了用戶名/密碼認證,客戶端和服務器將根據 RFC 1929 定義的用戶名/密碼認證子協議進行交互。

2.1 客戶端發送用戶名/密碼認證請求 (Username/Password Authentication Request)

目的: 客戶端向 SOCKS 服務器提交用于認證的用戶名和密碼。

報文格式:

+----+--------+----------+--------+----------+
|VER | ULEN   | UNAME    | PLEN   | PASSWD   |
+----+--------+----------+--------+----------+
| 1  | 1      | 1 to 255 | 1      | 1 to 255 | (單位:字節)
+----+--------+----------+--------+----------+
  • VER (1 字節): 用戶名/密碼認證子協議的版本。目前固定為 X'01' (十進制 1)。
  • ULEN (1 字節): UNAME 字段的長度(字節數)。
  • UNAME (1 到 255 字節): 用戶名,可以是任何 ASCII 字符。
  • PLEN (1 字節): PASSWD 字段的長度(字節數)。
  • PASSWD (1 到 255 字節): 密碼,可以是任何 ASCII 字符。

示例報文 (客戶端 -> SOCKS 服務器):

用戶名 myuser (6 字節),密碼 mypass (8 字節)。

十六進制: 01 06 6D 79 75 73 65 72 08 6D 79 70 61 73 73 77 64

報文內容解析:

  • 01: 用戶名/密碼認證子協議版本 1。
  • 06: 用戶名長度為 6 字節。
  • 6D 79 75 73 65 72: myuser 的 ASCII 碼。
  • 08: 密碼長度為 8 字節。
  • 6D 79 70 61 73 73 77 64: mypasswd 的 ASCII 碼。(這里假設密碼是’mypasswd’而非’mypass’以匹配提供的十六進制長度,即08對應8個字符)
2.2 SOCKS 服務器回復用戶名/密碼認證結果 (Username/Password Authentication Reply)

目的: SOCKS 服務器告知客戶端認證是否成功。

報文格式:

+----+--------+
|VER | STATUS |
+----+--------+
| 1  |   1    | (單位:字節)
+----+--------+
  • VER (1 字節): 用戶名/密碼認證子協議的版本。固定為 X'01' (十進制 1)。
  • STATUS (1 字節): 認證狀態碼。
    • X'00' (0): 認證成功。
    • X'01' (1): 認證失敗。

示例報文 (SOCKS 服務器 -> 客戶端):

認證成功。

十六進制: 01 00

報文內容解析:

  • 01: 用戶名/密碼認證子協議版本 1。
  • 00: 狀態碼 X'00' 表示認證成功

階段三:請求發送 (Request Sending)

認證成功后,客戶端可以向 SOCKS 服務器發送實際的操作請求,例如建立連接、綁定端口或關聯 UDP。

3.1 客戶端發送 SOCKS 請求報文 (SOCKS Request Message)

目的: 客戶端請求 SOCKS 服務器執行特定操作(例如,建立到目標服務器的連接)。

報文格式:

+----+-----+-------+------+----------+----------+
|VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     | (單位:字節)
+----+-----+-------+------+----------+----------+
  • VER (1 字節): SOCKS 協議版本。固定為 X'05' (十進制 5)。
  • CMD (1 字節): 命令碼,表示客戶端請求的操作類型。
    • X'01' (1): CONNECT (建立 TCP 連接)
    • X'02' (2): BIND (綁定端口,用于接受服務器發起的連接,如 FTP 的數據通道)
    • X'03' (3): UDP ASSOCIATE (關聯 UDP 中繼服務)
  • RSV (1 字節): 保留字段,必須設置為 X'00' (0)。
  • ATYP (1 字節): DST.ADDR 字段的地址類型。
    • X'01' (1): IPv4 地址DST.ADDR 字段長度為 4 字節。
    • X'03' (3): 域名DST.ADDR 字段的第一個字節表示域名長度,后續是域名本身。
    • X'04' (4): IPv6 地址DST.ADDR 字段長度為 16 字節。
  • DST.ADDR (可變長度): 目標地址。長度由 ATYP 字段決定。
  • DST.PORT (2 字節): 目標端口號(網絡字節序,即大端序)。

示例報文 (客戶端 -> SOCKS 服務器):

請求連接到目標服務器 203.0.113.5 的端口 80

十六進制: 05 01 00 01 CB 00 71 05 00 50

報文內容解析:

  • 05: SOCKSv5。
  • 01: 命令 X'01',表示 CONNECT
  • 00: 保留字段。
  • 01: 地址類型 X'01',表示 IPv4 地址。
  • CB 00 71 05: 目標 IP 地址 203.0.113.5 (203.0.113.5 的十六進制)。
  • 00 50: 目標端口 80 (80 的十六進制)。

階段四:請求回復 (Request Reply)

SOCKS 服務器處理客戶端的請求,并返回操作結果。

4.1 SOCKS 服務器回復請求結果 (SOCKS Reply Message)

目的: SOCKS 服務器告知客戶端其請求(如 CONNECT)的執行結果,并提供服務器綁定的地址和端口(僅在成功時有意義)。

報文格式:

+----+-----+-------+------+----------+----------+
|VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     | (單位:字節)
+----+-----+-------+------+----------+----------+
  • VER (1 字節): SOCKS 協議版本。固定為 X'05' (十進制 5)。
  • REP (1 字節): 回復碼,表示請求的結果。
    • X'00' (0): 成功 (succeeded)
    • X'01' (1): 通用 SOCKS 服務器故障 (general SOCKS server failure)
    • X'02' (2): 規則集不允許連接 (connection not allowed by ruleset)
    • X'03' (3): 網絡不可達 (Network unreachable)
    • X'04' (4): 主機不可達 (Host unreachable)
    • X'05' (5): 連接被拒絕 (Connection refused)
    • X'06' (6): TTL 過期 (TTL expired)
    • X'07' (7): 命令不支持 (Command not supported)
    • X'08' (8): 地址類型不支持 (Address type not supported)
    • X'09'X'FF' (9-255): 未分配
  • RSV (1 字節): 保留字段,必須設置為 X'00' (0)。
  • ATYP (1 字節): BND.ADDR 字段的地址類型。與請求中的 ATYP 定義相同。
  • BND.ADDR (可變長度): SOCKS 服務器為客戶端綁定的地址。在 CONNECT 請求成功時,這是 SOCKS 服務器用于連接到目標主機的源 IP 地址
  • BND.PORT (2 字節): SOCKS 服務器為客戶端綁定的端口。在 CONNECT 請求成功時,這是 SOCKS 服務器用于連接到目標主機的源端口號(網絡字節序)。

示例報文 (SOCKS 服務器 -> 客戶端):

CONNECT 請求成功,SOCKS 服務器使用其 IP 10.0.0.1 和端口 49168 進行連接。

十六進制: 05 00 00 01 0A 00 00 01 C0 10

報文內容解析:

  • 05: SOCKSv5。
  • 00: 回復碼 X'00',表示成功
  • 00: 保留字段。
  • 01: 綁定地址類型 X'01',表示 IPv4 地址。
  • 0A 00 00 01: 服務器綁定地址 10.0.0.1 (SOCKS 服務器自身的 IP)。
  • C0 10: 服務器綁定端口 49168 (C010 的十六進制值)。

階段五:數據傳輸 (Data Transfer)

如果 SOCKS 請求成功 (例如,CONNECT 成功),SOCKS 服務器和客戶端之間的 TCP 連接就建立成了代理通道。此后,客戶端發送到此連接的數據會被 SOCKS 服務器透明地轉發到目標服務器,反之亦然。

這一階段不再有 SOCKS 協議特定的報文頭,而是直接傳輸應用層數據。

5.1 客戶端發送應用數據

目的: 客戶端向目標服務器發送其應用層數據(例如,HTTP GET 請求)。

報文格式: 無 SOCKS 協議頭。直接是應用層協議數據。

示例報文 (客戶端 -> SOCKS 服務器 -> 目標 Web 服務器):

客戶端發送 HTTP GET 請求。

原始文本 (或其字節流表示):
GET / HTTP/1.1<CRLF>
Host: 203.0.113.5<CRLF>
Connection: close<CRLF>
<CRLF>
5.2 SOCKS 服務器轉發應用數據

目的: SOCKS 服務器將從目標服務器收到的應用層響應轉發給客戶端。

報文格式: 無 SOCKS 協議頭。直接是應用層協議數據。

示例報文 (目標 Web 服務器 -> SOCKS 服務器 -> 客戶端):

目標 Web 服務器回復 HTTP 響應。

原始文本 (或其字節流表示):
HTTP/1.1 200 OK<CRLF>
Content-Type: text/html<CRLF>
Content-Length: 1234<CRLF>
<CRLF>
<html>...網頁內容...</html>

至此,一個完整的 SOCKSv5 代理通信過程就完成了。理解這些詳細的報文格式有助于調試和實現 SOCKSv5 客戶端或服務器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88803.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

??Git提交代碼Commit消息企業級規范

??Git Commit 類型完整指南?? 類型用途示例??feat??新增功能&#xff08;面向用戶的功能性變更&#xff09;git commit -m "feat: 添加用戶登錄功能"??fix??修復 Bug&#xff08;解決代碼中的問題&#xff09;git commit -m "fix: 修復首頁加載崩潰…

TiDB AUTO_RANDOM 超大主鍵前端精度丟失排查:JavaScript Number 限制與解決方案

前端長整型主鍵“失蹤”記 ——一次 ArrayIndexOutOfBoundsException 的排查全過程 一、事故現場 最近在維護 SMS-OFFICE 后臺系統時&#xff0c;運維同事反饋&#xff1a; 點擊「短信詳情」或「郵箱賬號詳情」時&#xff0c;偶爾彈窗空白、日志報錯&#xff1a; java.lang.A…

在postgresql使用mybatis動態創建數據庫分區表

在postgresql使用mybatis動態創建數據庫分區表 1. 整體描述2. 前期準備2.1 創建主表語句2.2 創建分表語句2.3 xxl-job 3. 代碼實現3.1 mapper.xml層3.2 mapper.java層3.3 service接口層3.4 service實現層3.5 controller層 4. 總結 1. 整體描述 在java下實現&#xff1a;創建分…

Python網安-zip文件暴力破解

目錄 源碼在這里 需要的模塊 準備一個密碼本和需要破解的ZIP文件 一行一行地從密碼文件中讀取每個密碼。 核心部分 注意&#xff0c;需要修改上段代碼注釋里的這段具有編碼問題的代碼&#xff1a; 源碼在這里 https://github.com/Wist-fully/Attack/tree/cracker 需要的…

聊聊Golang開發工程師

誕生背景 Go由Google三位頂尖工程師&#xff08;Ken Thompson、Rob Pike、Robert Griesemer&#xff09;設計&#xff0c;目標是解決兩大行業痛點&#xff1a; 硬件利用率不足&#xff1a;多核CPU普及&#xff0c;但C/C等語言難以高效利用并發能力&#xff1b; 開發效率低下&a…

機器學習6——線性分類函數

線性分類函數 分類問題的兩種決策方法&#xff1a; 概率方法&#xff1a;通過計算后驗概率進行分類。優點是在概率分布已知的情況下可以得到最優解&#xff0c;缺點是實際中概率密度通常未知&#xff0c;需要通過大量數據估計。判別方法&#xff1a;假設判別函數的形式已知&…

Sentinel(三):Sentinel熔斷降級

一、Sentinel熔斷概念介紹 官方文檔網址&#xff1a;circuit-breaking | Sentinel 1、Sentinel熔斷基本介紹 除了流量控制以外&#xff0c;對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措 施之一。一個服務常常會調用別的模塊&#xff0c;可能是另外的一個遠程服…

PostgreSQL 主從集群搭建

下面是 PostgreSQL 主從復制&#xff08;Streaming Replication&#xff09;環境的安裝與配置指南&#xff0c;適合在兩臺或多臺服務器之間構建一主一從&#xff08;或一主多從&#xff09;的高可用讀寫分離系統。 環境準備 角色主機名/IP說明主庫192.168.1.10可讀寫&#xff…

STM32安全固件升級:使用自定義 bootloader 實現SD卡固件升級,包含固件加密

前言 在 STM32 嵌入式開發中&#xff0c;Bootloader 是一個不可或缺的模塊。ST 公司為 STM32 提供了功能完備的官方 Bootloader&#xff0c;支持多種通信接口&#xff08;如 USART、USB DFU、I2C、SPI 等&#xff09;&#xff0c;適用于標準的固件更新方案。 然而&#xff0c…

一步部署APache編譯安裝腳本

接下來我來介紹以下編譯安裝的好處 編譯安裝的優點與缺點 一、優點 高度可定制 可根據實際需求啟用或關閉特性&#xff08;如 Apache 的模塊、MySQL 的引擎等&#xff09;。 靈活控制編譯參數、優化性能&#xff08;如 --enable-xxx、--with-xxx&#xff09;。 更高的性能…

[Linux]mmap()函數內存映射原理及用法

一、內存映射 內存映射&#xff0c;簡而言之就是將用戶空間的一段內存區域映射到內核空間&#xff0c;映射成功后&#xff0c;用戶對這段內存區域的修改可以直接反映到內核空間&#xff0c;同樣&#xff0c;內核空間對這段區域的修改也直接反映用戶空間。那么對于內核空間和用…

通信無BUG,ethernet ip轉profinet網關,汽車焊接設備通信有心機

在運用“激光釬焊”對汽車車頂、側面板、后行李箱蓋等位置進行接合時&#xff0c;必須配備能夠沿著復雜車身線條&#xff0c;對細窄焊接線實施高精度快速檢測及模仿控制的“焊縫跟蹤控制”。 那么汽車生產線的系統升級改造迫在眉睫&#xff0c;當西門子PLC和庫卡機器人無法通信…

python腳本ETH獲取最新發行版本并將是否更新信息發送到釘釘

import requests import json import time import hmac import hashlib import base64 import urllib.parse# 1. 配置釘釘機器人 webhook "https://oapi.dingtalk.com/robot/send?access_tokenXXX" secret "XXX" # 如果沒有加簽驗證&#xff0c;請設…

【Docker基礎】Docker容器管理:docker ps及其參數詳解

目錄 1 docker ps命令概述 1.1 命令定位與作用 1.2 命令基本語法 2 基礎參數詳解 2.1 默認輸出解析 2.2 核心參數解析 2.2.1 -a, --all 2.2.2 -q, --quiet 2.2.3 --no-trunc 3 高級過濾與格式化 3.1 過濾器(--filter)詳解 3.1.1 常用過濾條件 3.1.2 實際應用示例 …

應急響應-感染Neshta病毒

病毒確定&#xff1a; 根據感染現象確定為Virus/Win32.Neshta家族病毒 病毒表現&#xff1a; 該病毒為感染式病毒。該病毒會在系統%SystemRoot%目錄下釋放svchost.com文件&#xff0c;并通過添加注冊表的方式確保每個exe文件執行的時候都會先執行這個文件。該病毒還會收集系統信…

Hyperledger Fabric 入門筆記(二十)Fabric V2.5 測試網絡進階之Tape性能測試

文章目錄 前言一、介紹二、架構三、安裝說明四、使用方法4.1. 修改配置文件4.2. 啟動測試網絡4.3. 運行測試 前言 本文介紹由Hyperledger中國技術工作組提供的另一款區塊鏈網絡性能測試工具Tape的架構、安裝和在Fabric測試網絡中的使用。 一、介紹 Tape是一款輕量級的、可以快…

怎樣在 VS Code 中快速創建 Vue 單文件組件(SFC)的基礎模板結構?

問題 在Vue項目的開發中&#xff0c;我們經常遇到一個問題&#xff0c;創建新組件時要自己輸入基本的框架&#xff0c;比如&#xff1a; <template><div class"page-box"></div> </template><script> export default {name: ,data()…

高防IP在服務器中的作用都有哪些?

高防IP作為一種通過技術手段讓用戶網絡服務更加安全的一種IP地址&#xff0c;有著更高的防御能力&#xff0c;有著強大的流量清洗中心和防御系統&#xff0c;幫助企業實時監控網絡流量&#xff0c;將惡意的用戶請求識別并過濾掉&#xff0c;保護目標服務器不會受到網絡攻擊&…

實戰 X-AnyLabeling:構建高效自動標注系統的工程實踐

文章目錄 一、項目背景與目標二、系統架構與模塊劃分2.1 模塊組成說明2.2 架構圖 三、模型封裝與平臺對接3.1 模型封裝接口3.2 接入 X-AnyLabeling 平臺 四、可視化與預測驗證4.1 UI 預測標簽預覽 五、性能優化與工程經驗5.1 模型加速與推理優化5.2 經驗總結5.3 實際效果 本文將…

UC3842/UC3843反激教程教學開關電源 反激設計步驟,每一關鍵元器件計算

資料下載地址&#xff1a;UC3842/UC3843反激教程教學開關電源 反激設計步驟&#xff0c;每一關鍵元器件計算 1、原理圖 2、PCB圖 3、變壓器設計資料 4、開關電源設計資料 5、主要元器件說明書 6、系統整體資料 7、說明文檔 7.1、電源設計概述 電源規格&#xff1a;設計一款 2…