%% # 纲要 > 主干纲要、Hint/线索/路标 # Q&A #### 已明确 #### 待明确 > 当下仍存有的疑惑 **❓<font color="#c0504d"> 有什么问题?</font>** %% # SOCKS 代理协议 SOCKS(Socket Secure)是一种 **==代理协议==**,用于在客户端和服务器之间 **中继网络数据包**,支持**代理转发所有 TCP 和 UDP 流量**。 **SOCKS 不解析应用层数据**,能够**转发所有 TCP/UDP 流量**,可支持 HTTP、HTTPS、FTP 、P2P 等各种应用层协议。 工作原理: 1. SOCKS 客户端与 SOCKS 代理服务器 **建立 "==SOCKS 连接=="**(通过 SOCKS 协议定义的握手方式,确定 SOCKS 协议版本、认证方式等) 2. SOCKS 客户端向 SOCKS 代理服务器发送 "**SOCKS 报文**,传达"**目标地址请求**"(包含目标地址类型、目标地址 IP or 域名、端口号等信息) 3. SOCKS 代理服务器与 "**目标服务器**" 建立连接,然后向客户端**返回响应状态**(是否成功建立连接) 4. 若成功建立连接,则用户的后续网络请求,**由 SOCKS 客户端发往 SOCKS 代理服务器**,**代理服务器==转发请求==**、获取**响应数据包**后回发给客户端。 > [!example] 浏览器中 SOCKS 代理的工作原理 > > 例如,在浏览器中设置了 SOCKS5 代理后,**当用户访问网站时**,浏览器**不会直接 "目标服务器" 发出请求**。 > > - 浏览器将于代理服务器建立 TCP 连接,在此基础上,**通过 SOCKS 握手,建立 SOCKS 连接。** > - 浏览器将用户想要访问的目标地址,**发送给 SOCKS 代理服务器**(即发送 "目标地址请求") > - **由 "SOCKS 代理服务器" 与 "目标服务器" 建立连接 & 发送请求**,充当中介进行数据包转发。 > SOCKS 协议有两个常见版本: | | 代理范围 | 身份验证 | 远程域名解析 | | ---------------- | ------------------- | ---- | ------------------- | | SOCKS4 | 仅支持 TCP 代理,不支持 UDP | ❌ | ❌(必须由客户端解析出 IP 地址) | | **SOCKS5**(当前主流) | 支持 **TCP & UDP 代理** | ✔️ | ✔️(DNS 解析可由代理服务器完成) | 缺点: - **==无加密机制==**,数据明文传输。 - **流量特征明显**,容易被检测和封锁; <br><br> # "协议伪装" 与 "数据混淆" "**协议伪装**" 与 "**数据混淆**" 是用于**降低==代理流量==的 "可识别性"** 的手段,防止**协议识别**和**流量特征检测**,旨在提高抗封锁能力。 | | 作用 | 实现方式 | | ---- | ------------------------------------------------------- | ------------------------------------------ | | 协议伪装 | 将 **代理流量** 伪装成 **其他普通协议的流量** (如 HTTPS、WebSocket、QUIC 等) | 使用 **TLS、WebSocket、gRPC** 等协议封装代理流量,模拟合法通信 | | 流量混淆 | 使**数据包的大小、时序**等变得**随机、不规则**,防止特征检测 | 随机包长度(**随机拆包**、**随机数据填充**)、动态端口 | > [!info] 深度包检测 > > 许多国际或机构会使用**深度包检测**技术(DPI,Deep Packet Inspection) 来 **==检测和封锁代理流量==**。 > 如果 **代理流量的==特征==** 过于明显,则可**被防火墙直接识别并阻止**。 <br><br><br> # 代理工具总结 - SS/SSR - V2Ray - Clash - Tarjon # Shadowsocks / ShadowsocksR 工具(SS/SSR) **Shadowsocks(SS)** 和 **ShadowsocksR(SSR)** 是两个基于 **==SOCKS5 代理协议==** 的 **==加密==代理工具**。 | 加密代理工具 | 说明 | | ----------------- | ----------------------------------------------------------- | | Shadowsocks(SS) | 基于 SOCKS5 协议实现,增加了 "**加密**" 功能,支持 AEAD、Chacha20 等**强加密算法** | | ShadowsocksR(SSR) | SS 的改进版本,增加了 **协议伪装**、**流量混淆**功能,提高抗封锁能力 | > [!NOTE] SOCKS 协议本身没有 "加密" 机制,是明文传输。这两个工具以 SOCKS5 为基础,**引入了==加密==功能**。 > [!NOTE] SS 与 SSR 目前已被 V2Ray 取代,推荐使用 V2Ray 或 Trojan > > - SS 由 clowwindy 采用 Python 开发,原作者仓库已于 2015 年删除。 > - SSR 由 breakwa11 开发,原作者仓库已于 2017 年删除。 > > 两个工具都是开源项目,但原作者已删库不再维护,仍存有社区维护版本,例如: > > - [shadowsocks-libev](https://github.com/shadowsocks/shadowsocks-libev) ,SS 的 C 语言实现,轻量高效 > - [shadowsocks-windows](https://github.com/shadowsocks/shadowsocks-windows) , Windows GUI 客户端 > - [shadowsocks-android](https://github.com/shadowsocks/shadowsocks-android),Android 客户端版本 > ### SS/SSR 工作流程 SS/SSR **工作流程**:(下面统称 SS) 1. **SS 客户端** 与 **SS 服务器** 建立加密通信隧道(TLS 或 UDP 加密隧道)。 2. **SS 客户端** 监听本地 **==SOCKS5 端口==**(如 `127.0.0.1:1080`),等待**浏览器/应用**向该端口发送 "**目标地址请求**"。 3. 当 **==浏览器/应用==** 需访问目标地址时,不自行请求,而是向其配置的 **SOCKS5 代理端口** 发送 "**==目标地址请求==**"(通过 **SOCKS5 报文**)。 4. **SS 客户端接收目标地址请求,并将其==加密==后发送给 SS 服务器**,由其**解密后转发至目标网站**。 5. **目标服务器** 返回数据 -> **SS 服务器**,后者 **==加密==** 后传回给 SS 客户端。 6. **SS 客户端** 解密数据,获取**原始数据包**,转发给 **==浏览器或应用==**(通过 **SOCKS5 报文**) <br><br> # V2Ray 工具 V2Ray 是一个当下常用的代理工具,其支持 **==自有代理协议==**,支持**更多协议伪装和流量混淆方式**,相较于 SS/SSR 而言提供了更强大的代理功能和抗封锁能力。 V2Ray 主要特性: - **多协议支持**: - **==VMess==**(V2Ray 自有协议) - **==VLESS==**(轻量化的 VMess,去掉了身份认证机制) - Shadowsocks - **SOCKS5**(兼容传统代理,可用作为 SS/SSR 客户端或服务器) - **HTTP 代理** - mKCP(UDP 传输,可伪装为视频流) - QUIC(UDP 传输) - gRPC(企业级伪装,使其表现为像云 API 调用) - **多协议伪装** - **TLS 伪装**(让流量看起来像正常 HTTPS 访问) - **WebSocket 伪装**(流量通过 WebSocket) - **XTLS**(更高效的 TLS 传输,减少延迟) - **mKCP 伪装**(流量看起来像 UDP 视频流) - **流量混淆** - **动态端口**(端口随机变化,防止封锁) - **流量填充**(随机数据,防止特征检测) - **==路由规则配置== & 流量分流** - 可根据 **域名、IP、用户 ID、协议** 等设置 **==路由规则==**,例如:**国内网站走直连,国际流量走代理** - **多出口支持** - 可配置多个代理节点,自动选择最快的线路 - 负载均衡,提高可靠性 - **DNS 配置** - 支持 **DOH(DNS over HTTPS)和 DOT(DNS over TLS)** - 避免 DNS 污染,防止泄露访问记录 - **反向代理** - 类似于 **Nginx 反向代理**,支持穿透防火墙访问内网资源 - **跨平台支持** - 支持 **Windows、Linux、macOS、Android、iOS** > [!tip] 推荐的 V2Ray 混淆方案:「VMess + TSL + WebSocket」 > > - 所有数据经过 TLS 传输,TLS 伪装使流量表现为**正常 HTTPS 流量**,而难以被判断出是代理流量; > - WebSocket 流量可以**被 CDN 转发**,进一步**隐藏代理服务器 IP**(而只可见 CDN 的 IP),降低被封的风险。 > > 缺点: > > - 代理服务器需要 **TLS 证书**; > - **WebSocket 增加了一定的延迟**:相比于 TCP 直连(如 VMess + TCP),**WebSocket 需要额外的封装和握手过程**,会增加一定的延迟。 > - CDN 本身可能会检测代理流量。 ### V2Ray 工作流程 V2Ray 工作流程与 SS/SSR 类同: 1. **V2Ray 客户端** 与 **V2Ray 服务器**建立**加密通信隧道**; 3. **V2Ray 客户端** 在本地运行,**监听代理端口**(SOCKS5、HTTP 等)。 4. **浏览器 / 其他应用** 通过本地 V2Ray 代理连接目标网站。 5. **V2Ray 客户端** 将流量加密,并通过 **VMess、VLESS、SOCKS5** 等协议发送到 V2Ray 服务器。 6. **V2Ray 服务器** 解密数据,并与目标网站通信,获取数据。 7. **V2Ray 服务器** 再次加密数据,返回给客户端。 8. **V2Ray 客户端** 解密后,将数据转发给浏览器,最终完成网页加载。 <br><br><br> # Clash 工具 Clash 是一个当下常用的跨平台代理工具,支持多种代理协议。 - **多协议支持**: - V2Ray 的 VMess、VLESS; - Trojan 工具的协议 - SOCKS5(兼容传统代理,可用作为 SS/SSR 客户端或服务器) - HTTP/HTTPS 代理 - **进阶混淆和伪装** - 支持 TLS 伪装 - 支持 WebSocket 伪装 - 支持 Cloudflare CDN 代理 - **==路由规则配置== & 流量分流** - 可根据 **域名、IP、端口、协议** 等设置 **==路由规则==**,对流量进行分流。例如:**国内网站走直连,国际流量走代理** - 支持 **GEOIP 规则**,自动判断 IP 归属地,并选择最佳线路。 - **负载均衡和自动测速** - Clash 支持多个代理节点,并可以根据 **Ping 值、延迟、带宽** 自动选择最快的节点。 - 支持 **URL 测速**,定期检测代理的可用性。 - **DNS 代理(防止 DNS 污染)** - **支持 DoH(DNS over HTTPS)和 DoT(DNS over TLS)**,避免 DNS 泄露。 - **自定义 DNS 解析**,可以强制特定域名解析到某些 IP(如屏蔽广告)。 - **支持==全局代理==** - 可将整个设备的流量(包括系统应用)通过代理,而**不仅仅是发往 SOCKS、HTTP 监听端口的流量**。 ## clash 版本 clash 作为开源项目,有多个不同的分支和 **GUI 版本**: | **版本** | **适用平台** | **特点** | | --------------------- | ------------------- | -------------------------- | | **Clash (Core)** | macOS/Linux/Windows | **纯命令行**,需要手动配置 | | **Clash for Windows** | Windows | 提供 GUI 界面 | | **ClashX** | macOS | 提供 GUI 界面 | | **Clash for Android** | Android | 提供 GUI 界面 | | **Clash Verge** | 多平台 | 支持更强大的协议(Reality、Hysteria) | | **Clash Meta** | 多平台 | 进阶版 Clash,支持更好的混淆和流量优化 | ## clash 配置文件 Clash 使用 **YAML 配置文件**(`config.yaml`)来定义代理规则,字段如下: - `ort: 7890` → HTTP 代理端口 - `socks-port: 7891` → SOCKS5 代理端口 - `mode: Rule` → 采用规则模式 - `proxies:` → 代理服务器列表(支持 VMess、Shadowsocks、Trojan 等) - `proxy-groups:` → 自动测速,选择最快的代理 - `rules:` → 规则匹配(国内直连,国外走代理) ```yaml port: 7890 socks-port: 7891 allow-lan: false mode: Rule proxies: - name: "日本节点" type: vmess server: jp.example.com port: 443 uuid: "your-uuid" alterId: 0 cipher: auto tls: true network: ws ws-path: "/ws" ws-headers: Host: "jp.example.com" proxy-groups: - name: "自动选择" type: url-test proxies: - "日本节点" url: "https://www.google.com" interval: 300 rules: - GEOIP,CN,DIRECT - MATCH,自动选择 ``` <br> ## clash 工作流程 Clash 开启后: 1. 其将作为 "**代理协议的客户端**" 与 "**代理服务器**"(所选节点) 建立连接; 2. 同时**监听本机的 `127.0.0.1:7890` 端口**(可自定义端口),等待流量进入; 3. 所有发往 `127.0.0.1:7890` 端口的流量,将**由 Clash 充当客户端,根据==规则匹配==,==直连目标服务器==或==转发给代理服务器==**。 4. 若转发给代理服务器,则**再由代理服务器发往 "目标服务器"**,待其获取目标服务器的 "**响应报文**" 后,回发给 Clash,再**由 Clash 传回给应用程序**。 > [!info] Chrome 的 Switch Omega 插件 > > SwitchOmega 提供了为浏览器 **==配置== & ==切换==不同代理服务器**的功能。 > > ![[_attachment/02-开发笔记/07-计算机网络/应用层/虚拟私人网络 VPN.assets/IMG-虚拟私人网络 VPN-31C87C205BEB4C4C1A60BA99B852D2A0.png|176]] > > - `Direct`:直连,浏览器的所有 Web 请求直接发往**目标服务器**。 > - `System Proxy`:系统代理,浏览器的所有 Web 请求将发往 "**操作系统**" 上所配置的 "**代理服务器 IP 及端口**"(要求 **==系统代理开启==**) > - **自定义代理**:例如上图中的 `clash`,配置为 `127.0.0.1:7890`(即 Clash 的监听端口),即是**让浏览器将所有 Web 请求发往 `127.0.0.1:7890`**。 <br> ## clash 代理模式 即 Proxies 页面下的 **4 种模式**: - **全局**(Global):监听到的所有请求**全部发往代理服务器**; - **规则**(Rule):监听到的所有请求**根据==配置文件规则==进行分流**,仅将对配置中网站发起的访问请求走代理。 - 直连(Direct):监听到的所有请求**直接发往目的地址**,即不走代理 - 脚本(Script):未知。 > ![[_attachment/02-开发笔记/07-计算机网络/应用层/虚拟私人网络 VPN.assets/IMG-虚拟私人网络 VPN-E0E3C861048B565506713F2825B4EF14.png|658]] <br> ## System Proxy 系统代理 在 **系统层面** 设置 **全局的 HTTP/HTTPS/SOCKS 代理服务器**。 开启系统代理后: - 部分软件(如**浏览器**、Telegram)会**自动识别** "系统代理" 中设置的**代理 IP 地址及端口**,将软件流量发往该 IP 地址及端口。 - 部分软件不会自动识别系统代理,但提供了设置选项,则**可在软件设置中手动配置**。 > [!example] Windows 系统代理 > > Clash for Windows 中的 "**System Proxy**" 选项实际上即是打开 **Windows 的系统代理**。 > > ![[_attachment/02-开发笔记/07-计算机网络/应用层/虚拟私人网络 VPN.assets/IMG-虚拟私人网络 VPN-992CAA7A19F2B6EB5474EE93C2E621C9.png|488]] > > 如下所示: > ![[_attachment/02-开发笔记/07-计算机网络/应用层/虚拟私人网络 VPN.assets/IMG-虚拟私人网络 VPN-37FBE73B4F893129C3422FAAD5E6086A.png|499]] > > <br> ## Tun 模式 Tun Mode 开启后,Clash 将会创建一个**虚拟网卡**,拦截**整个系统的 TCP/UDP 流量**,并发送到 Clash 代理。 <br><br><br> # Buffer ## 闪念 > sudden idea ## 候选资料 > Read it later # ♾️参考资料 # Footnotes