[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f63FoQ7UFWLtM_TjcT1bSLL1QLZpY8w1wwnKGctaMg3A":3,"$fJU-4tot_gC5fDkujNeoE-cGsdMy5V_KcdUXLuAnTFgw":15,"$fb2eQ1BgyScNpciNFSSOjbYss32yC49k4Cyu7EeeiIFw":423},{"slug":4,"title":5,"description":6,"content":7,"content_html":8,"pub_date":9,"tags":10,"draft":14},"network-proxy-vpn-guide","代理与翻墙技术原理：从 HTTP 代理到现代协议","深入解析代理与 VPN 的本质区别，梳理从 SOCKS5 到 Shadowsocks、V2Ray\u002FXray、Hysteria2 的协议演进，以及机场订阅的技术本质。","# 代理与翻墙技术原理：从 HTTP 代理到现代协议\n\n网络代理是互联网世界中绕不开的基础技术。无论是企业内网的访问控制、开发者的调试工具，还是突破地理限制访问资源，代理技术都在背后发挥着关键作用。本文从基础原理出发，系统介绍各类代理协议的工作方式、优缺点及实际应用场景。\n\n---\n\n## 一、网络代理的基本概念\n\n### 什么是代理\n\n代理服务器（Proxy Server）是位于客户端和目标服务器之间的中间节点。所有流量先经过代理，再转发到目的地。\n\n```\n没有代理：\n客户端 ──────────────────────→ 目标服务器\n\n有代理：\n客户端 ──→ 代理服务器 ──→ 目标服务器\n```\n\n### 代理的核心功能\n\n1. **访问控制**：企业防火墙通过代理过滤不允许访问的网站\n2. **隐藏真实 IP**：目标服务器看到的是代理 IP，而非客户端 IP\n3. **缓存加速**：代理可以缓存静态资源\n4. **绕过地理限制**：使用境外代理访问被限制的内容\n5. **流量监控**：中间人分析加密前的流量\n\n---\n\n## 二、HTTP\u002FHTTPS 代理\n\n### HTTP 代理（明文）\n\n最基础的代理类型，只能代理 HTTP 流量。\n\n**请求格式**：\n\n```http\nGET http:\u002F\u002Fexample.com\u002Fpath HTTP\u002F1.1\nHost: example.com\nProxy-Authorization: Basic dXNlcjpwYXNz\n```\n\n注意：普通 HTTP 请求发给代理时，URL 必须包含完整的 `http:\u002F\u002F` 前缀，代理用这个判断目标地址。\n\n### HTTPS 代理（CONNECT 隧道）\n\nHTTPS 流量不能被代理直接查看内容（加密的），但可以通过 CONNECT 方法建立隧道：\n\n```http\nCONNECT example.com:443 HTTP\u002F1.1\nHost: example.com:443\nProxy-Authorization: Basic dXNlcjpwYXNz\n```\n\n代理收到后，在客户端和目标服务器之间建立 TCP 隧道，此后的 TLS 握手和 HTTPS 通信直接穿越，代理只做转发，不解密内容。\n\n### 代码示例\n\n```python\nimport requests\n\nproxies = {\n    'http': 'http:\u002F\u002Fproxy.example.com:8080',\n    'https': 'http:\u002F\u002Fproxy.example.com:8080',\n}\n\nresponse = requests.get('https:\u002F\u002Fhttpbin.org\u002Fip', proxies=proxies)\nprint(response.json())\n```\n\n```bash\n# curl 使用代理\ncurl -x http:\u002F\u002Fproxy.example.com:8080 https:\u002F\u002Fhttpbin.org\u002Fip\n\n# 环境变量方式（很多程序自动识别）\nexport http_proxy=http:\u002F\u002Fproxy.example.com:8080\nexport https_proxy=http:\u002F\u002Fproxy.example.com:8080\ncurl https:\u002F\u002Fhttpbin.org\u002Fip\n```\n\n---\n\n## 三、SOCKS 代理\n\n### SOCKS4 vs SOCKS5\n\nSOCKS 代理工作在更底层（会话层），可以代理任何 TCP 连接，不限于 HTTP。\n\n| 特性 | SOCKS4 | SOCKS5 |\n|------|--------|--------|\n| 认证 | 不支持 | 用户名\u002F密码 |\n| IPv6 | 不支持 | 支持 |\n| UDP | 不支持 | 支持 |\n| DNS 解析 | 本地 | 可在代理端解析 |\n\n### SOCKS5 的 DNS 解析优势\n\n这是个关键区别。SOCKS5 可以让代理服务器做 DNS 解析：\n\n```\nSOCKS4（DNS 泄漏）：\n客户端 → DNS 查询 example.com → 本地 DNS 服务器（暴露了你在访问什么）\n客户端 → 连接 93.184.216.34:443 → SOCKS4 代理 → 目标\n\nSOCKS5（无 DNS 泄漏）：\n客户端 → SOCKS5 代理（请求连接 \"example.com:443\"）\n代理 → DNS 查询 example.com → 代理侧 DNS\n代理 → 连接 93.184.216.34:443 → 目标\n```\n\n### SOCKS5 代码示例\n\n```python\nimport socks\nimport socket\n\n# 设置 SOCKS5 代理\nsocks.set_default_proxy(socks.SOCKS5, \"127.0.0.1\", 1080)\nsocket.socket = socks.socksocket\n\n# 之后所有 socket 连接都走代理\nimport urllib.request\nresponse = urllib.request.urlopen('https:\u002F\u002Fhttpbin.org\u002Fip')\nprint(response.read())\n```\n\n---\n\n## 四、Shadowsocks：第一代现代化代理协议\n\n### 设计背景\n\n传统代理（HTTP\u002FSOCKS）有明显的协议特征，很容易被防火墙识别和阻断。Shadowsocks（SS）由 clowwindy 于 2012 年创建，核心目标是：**让流量看起来像随机字节，无法被识别为代理流量**。\n\n### 工作原理\n\n```\n客户端本地运行 ss-local（SOCKS5 代理）\n    ↓\n将流量加密（AES-256-CFB 等）\n    ↓\n发送给 ss-server（流量看起来像随机数据）\n    ↓\nss-server 解密，转发到目标\n```\n\n### 加密方式\n\n```\n原始数据：[目标地址][端口][数据内容]\n加密后：  [随机字节流，无任何明文特征]\n```\n\n不同于 VPN 有固定的握手特征，Shadowsocks 的流量从统计学上很难与普通 HTTPS 流量区分（取决于加密方式）。\n\n### 配置示例\n\n```json\n\u002F\u002F 服务端 config.json\n{\n    \"server\": \"0.0.0.0\",\n    \"server_port\": 8388,\n    \"password\": \"your-password\",\n    \"method\": \"aes-256-gcm\",\n    \"timeout\": 300\n}\n```\n\n```bash\n# 启动服务端\nss-server -c config.json\n\n# 客户端连接\nss-local -s server_ip -p 8388 -l 1080 -k your-password -m aes-256-gcm\n```\n\n---\n\n## 五、V2Ray\u002FXray：更强的流量混淆\n\n### 为什么需要 V2Ray\n\n随着墙的检测能力增强，Shadowsocks 的随机字节流也被识别（通过流量统计特征）。V2Ray 在此基础上增加了更多伪装手段。\n\n### VMess 协议\n\nV2Ray 的主要协议，核心特性：\n\n1. **动态端口**：可以定期切换端口\n2. **时间戳认证**：服务端验证请求时间（防止重放攻击）\n3. **WebSocket 传输**：将流量伪装成普通 WebSocket 请求\n4. **TLS 包装**：在标准 TLS 层之上，流量特征与 HTTPS 完全一致\n\n### WebSocket + TLS + CDN 方案\n\n这是目前最稳定的方案：\n\n```\n客户端 → TLS → CDN（如 Cloudflare）→ 你的服务器\n```\n\n从防火墙看，只是访问了 Cloudflare 的 IP，无法区分是代理流量还是正常 HTTPS 请求。即使服务器 IP 被封，CDN IP 无法被封（会影响大量正常网站）。\n\n### 配置示例（简化）\n\n```json\n\u002F\u002F 入站（服务端）\n{\n  \"inbounds\": [{\n    \"port\": 443,\n    \"protocol\": \"vmess\",\n    \"settings\": {\n      \"clients\": [{\"id\": \"uuid-here\", \"level\": 1}]\n    },\n    \"streamSettings\": {\n      \"network\": \"ws\",\n      \"security\": \"tls\",\n      \"wsSettings\": {\"path\": \"\u002Fws\"},\n      \"tlsSettings\": {\"certificates\": [{\"...\": \"...\"}]}\n    }\n  }]\n}\n```\n\n---\n\n## 六、Trojan：伪装成 HTTPS 流量\n\n### 原理\n\nTrojan 的思路更激进：直接运行一个真实的 HTTPS 服务器，代理协议藏在 TLS 层之后。\n\n```\n正常 HTTPS 请求 → 转发给真实网站（通过验证）\n代理请求（含密码） → 提供代理服务\n```\n\n从外部看，服务器就是一个普通的 HTTPS 网站，只有知道密码的用户才能使用代理功能。即使防火墙主动探测，也会收到正常的 HTTPS 响应。\n\n---\n\n## 七、分流与规则\n\n代理不是所有流量都需要走，合理分流可以提升速度并降低代理服务器负担。\n\n### 三种分流策略\n\n1. **全局代理**：所有流量走代理（简单，浪费带宽）\n2. **PAC 文件**：浏览器根据规则列表决定哪些域名走代理\n3. **规则代理（TUN\u002FTAP 模式）**：系统级接管，更细粒度控制\n\n### 常见规则格式（Clash）\n\n```yaml\nrules:\n  - DOMAIN-SUFFIX,google.com,Proxy\n  - DOMAIN-SUFFIX,github.com,Proxy\n  - DOMAIN-SUFFIX,baidu.com,Direct\n  - GEOIP,CN,Direct          # 国内 IP 直连\n  - MATCH,Proxy              # 默认走代理\n```\n\n### 域名分流工具\n\n- **GeoIP 数据库**（MaxMind GeoLite2）：判断 IP 归属地\n- **geosite 列表**（Project V \u002F Loyalsoldier）：分类的域名列表\n- **自定义规则**：针对特定需求手动配置\n\n---\n\n## 八、DNS 防泄漏\n\n### 什么是 DNS 泄漏\n\n即使使用了代理，DNS 查询可能仍然走本地 DNS，导致你访问的域名被 ISP 记录。\n\n```bash\n# 检测 DNS 泄漏\ncurl https:\u002F\u002Fdnsleaktest.com\u002Ftest\n```\n\n### 解决方案\n\n1. **使用 SOCKS5 的远端 DNS 解析**（前文已提）\n2. **DNS over HTTPS (DoH)**：\n\n```bash\n# 使用 Cloudflare DoH\ncurl -H 'accept: application\u002Fdns-json'   'https:\u002F\u002F1.1.1.1\u002Fdns-query?name=example.com&type=A'\n```\n\n3. **代理软件的 Fake IP 模式**：本地返回假 IP，实际 DNS 解析在代理服务器完成\n\n---\n\n## 九、各协议特征对比\n\n| 协议 | 抗检测 | 速度 | 配置复杂度 | 适用场景 |\n|------|--------|------|-----------|---------|\n| HTTP 代理 | ❌ 极低 | 快 | 简单 | 企业内网 |\n| SOCKS5 | ❌ 低 | 快 | 简单 | 本地工具链 |\n| Shadowsocks | ⚠️ 中 | 中 | 中 | 日常使用 |\n| V2Ray VMess | ✅ 高 | 中 | 复杂 | 高对抗场景 |\n| Trojan | ✅ 极高 | 快 | 中 | 高对抗场景 |\n| VLESS+XTLS | ✅ 极高 | 最快 | 复杂 | 高性能需求 |\n\n---\n\n## 十、实际部署注意事项\n\n### 服务器选择\n\n- **延迟**：香港、新加坡、日本延迟低（\u003C 50ms）\n- **带宽**：至少 100Mbps，防止多人使用时拥堵\n- **IP 质量**：避免使用被滥用过的 IP 段（检查 IP 声誉）\n\n### 安全配置\n\n```bash\n# 修改 SSH 默认端口\nsed -i 's\u002F#Port 22\u002FPort 22222\u002F' \u002Fetc\u002Fssh\u002Fsshd_config\n\n# 禁用密码登录，只用密钥\nsed -i 's\u002FPasswordAuthentication yes\u002FPasswordAuthentication no\u002F' \u002Fetc\u002Fssh\u002Fsshd_config\n\n# 配置 fail2ban 防暴力破解\napt install fail2ban -y\n```\n\n### 流量混淆最佳实践\n\n1. 使用非标准端口（但 443 最安全，因为封了会影响所有 HTTPS）\n2. 开启 TLS，证书用 Let's Encrypt 免费证书\n3. 配置真实的 Web 服务（Nginx 反向代理）作为掩护\n\n---\n\n## 总结\n\n代理技术从简单的 HTTP 代理演进到今天的 Trojan\u002FVLESS，本质上是攻防双方的技术博弈：\n\n- **防火墙**：基于特征识别 → 流量统计分析 → 主动探测\n- **代理协议**：明文 → 加密 → 随机化 → 完美伪装成 HTTPS\n\n理解这些底层原理，不仅有助于选择合适的工具，也能在出现问题时快速定位和解决。\n\n对于日常开发者：\n- 本地调试 → HTTP\u002FSOCKS5 代理\n- 访问 GitHub\u002FGoogle → Shadowsocks 或 V2Ray\n- 高对抗场景 → Trojan + CDN\n","\u003Ch1>代理与翻墙技术原理：从 HTTP 代理到现代协议\u003C\u002Fh1>\n\u003Cp>网络代理是互联网世界中绕不开的基础技术。无论是企业内网的访问控制、开发者的调试工具，还是突破地理限制访问资源，代理技术都在背后发挥着关键作用。本文从基础原理出发，系统介绍各类代理协议的工作方式、优缺点及实际应用场景。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"一-网络代理的基本概念\">一、网络代理的基本概念\u003C\u002Fh2>\n\u003Ch3 id=\"什么是代理\">什么是代理\u003C\u002Fh3>\n\u003Cp>代理服务器（Proxy Server）是位于客户端和目标服务器之间的中间节点。所有流量先经过代理，再转发到目的地。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>没有代理：\n客户端 ──────────────────────→ 目标服务器\n\n有代理：\n客户端 ──→ 代理服务器 ──→ 目标服务器\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"代理的核心功能\">代理的核心功能\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>访问控制\u003C\u002Fstrong>：企业防火墙通过代理过滤不允许访问的网站\u003C\u002Fli>\n\u003Cli>\u003Cstrong>隐藏真实 IP\u003C\u002Fstrong>：目标服务器看到的是代理 IP，而非客户端 IP\u003C\u002Fli>\n\u003Cli>\u003Cstrong>缓存加速\u003C\u002Fstrong>：代理可以缓存静态资源\u003C\u002Fli>\n\u003Cli>\u003Cstrong>绕过地理限制\u003C\u002Fstrong>：使用境外代理访问被限制的内容\u003C\u002Fli>\n\u003Cli>\u003Cstrong>流量监控\u003C\u002Fstrong>：中间人分析加密前的流量\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"二-http-https-代理\">二、HTTP\u002FHTTPS 代理\u003C\u002Fh2>\n\u003Ch3 id=\"http-代理-明文\">HTTP 代理（明文）\u003C\u002Fh3>\n\u003Cp>最基础的代理类型，只能代理 HTTP 流量。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>请求格式\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-http\">GET http:\u002F\u002Fexample.com\u002Fpath HTTP\u002F1.1\nHost: example.com\nProxy-Authorization: Basic dXNlcjpwYXNz\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>注意：普通 HTTP 请求发给代理时，URL 必须包含完整的 \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> 前缀，代理用这个判断目标地址。\u003C\u002Fp>\n\u003Ch3 id=\"https-代理-connect-隧道\">HTTPS 代理（CONNECT 隧道）\u003C\u002Fh3>\n\u003Cp>HTTPS 流量不能被代理直接查看内容（加密的），但可以通过 CONNECT 方法建立隧道：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-http\">CONNECT example.com:443 HTTP\u002F1.1\nHost: example.com:443\nProxy-Authorization: Basic dXNlcjpwYXNz\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>代理收到后，在客户端和目标服务器之间建立 TCP 隧道，此后的 TLS 握手和 HTTPS 通信直接穿越，代理只做转发，不解密内容。\u003C\u002Fp>\n\u003Ch3 id=\"代码示例\">代码示例\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-python\">import requests\n\nproxies = {\n    'http': 'http:\u002F\u002Fproxy.example.com:8080',\n    'https': 'http:\u002F\u002Fproxy.example.com:8080',\n}\n\nresponse = requests.get('https:\u002F\u002Fhttpbin.org\u002Fip', proxies=proxies)\nprint(response.json())\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-bash\"># curl 使用代理\ncurl -x http:\u002F\u002Fproxy.example.com:8080 https:\u002F\u002Fhttpbin.org\u002Fip\n\n# 环境变量方式（很多程序自动识别）\nexport http_proxy=http:\u002F\u002Fproxy.example.com:8080\nexport https_proxy=http:\u002F\u002Fproxy.example.com:8080\ncurl https:\u002F\u002Fhttpbin.org\u002Fip\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"三-socks-代理\">三、SOCKS 代理\u003C\u002Fh2>\n\u003Ch3 id=\"socks4-vs-socks5\">SOCKS4 vs SOCKS5\u003C\u002Fh3>\n\u003Cp>SOCKS 代理工作在更底层（会话层），可以代理任何 TCP 连接，不限于 HTTP。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>特性\u003C\u002Fth>\n\u003Cth>SOCKS4\u003C\u002Fth>\n\u003Cth>SOCKS5\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>认证\u003C\u002Ftd>\n\u003Ctd>不支持\u003C\u002Ftd>\n\u003Ctd>用户名\u002F密码\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>IPv6\u003C\u002Ftd>\n\u003Ctd>不支持\u003C\u002Ftd>\n\u003Ctd>支持\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>UDP\u003C\u002Ftd>\n\u003Ctd>不支持\u003C\u002Ftd>\n\u003Ctd>支持\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>DNS 解析\u003C\u002Ftd>\n\u003Ctd>本地\u003C\u002Ftd>\n\u003Ctd>可在代理端解析\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"socks5-的-dns-解析优势\">SOCKS5 的 DNS 解析优势\u003C\u002Fh3>\n\u003Cp>这是个关键区别。SOCKS5 可以让代理服务器做 DNS 解析：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>SOCKS4（DNS 泄漏）：\n客户端 → DNS 查询 example.com → 本地 DNS 服务器（暴露了你在访问什么）\n客户端 → 连接 93.184.216.34:443 → SOCKS4 代理 → 目标\n\nSOCKS5（无 DNS 泄漏）：\n客户端 → SOCKS5 代理（请求连接 &quot;example.com:443&quot;）\n代理 → DNS 查询 example.com → 代理侧 DNS\n代理 → 连接 93.184.216.34:443 → 目标\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"socks5-代码示例\">SOCKS5 代码示例\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-python\">import socks\nimport socket\n\n# 设置 SOCKS5 代理\nsocks.set_default_proxy(socks.SOCKS5, &quot;127.0.0.1&quot;, 1080)\nsocket.socket = socks.socksocket\n\n# 之后所有 socket 连接都走代理\nimport urllib.request\nresponse = urllib.request.urlopen('https:\u002F\u002Fhttpbin.org\u002Fip')\nprint(response.read())\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"四-shadowsocks-第一代现代化代理协议\">四、Shadowsocks：第一代现代化代理协议\u003C\u002Fh2>\n\u003Ch3 id=\"设计背景\">设计背景\u003C\u002Fh3>\n\u003Cp>传统代理（HTTP\u002FSOCKS）有明显的协议特征，很容易被防火墙识别和阻断。Shadowsocks（SS）由 clowwindy 于 2012 年创建，核心目标是：\u003Cstrong>让流量看起来像随机字节，无法被识别为代理流量\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3 id=\"工作原理\">工作原理\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>客户端本地运行 ss-local（SOCKS5 代理）\n    ↓\n将流量加密（AES-256-CFB 等）\n    ↓\n发送给 ss-server（流量看起来像随机数据）\n    ↓\nss-server 解密，转发到目标\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"加密方式\">加密方式\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>原始数据：[目标地址][端口][数据内容]\n加密后：  [随机字节流，无任何明文特征]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>不同于 VPN 有固定的握手特征，Shadowsocks 的流量从统计学上很难与普通 HTTPS 流量区分（取决于加密方式）。\u003C\u002Fp>\n\u003Ch3 id=\"配置示例\">配置示例\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-json\">\u002F\u002F 服务端 config.json\n{\n    &quot;server&quot;: &quot;0.0.0.0&quot;,\n    &quot;server_port&quot;: 8388,\n    &quot;password&quot;: &quot;your-password&quot;,\n    &quot;method&quot;: &quot;aes-256-gcm&quot;,\n    &quot;timeout&quot;: 300\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 启动服务端\nss-server -c config.json\n\n# 客户端连接\nss-local -s server_ip -p 8388 -l 1080 -k your-password -m aes-256-gcm\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"五-v2ray-xray-更强的流量混淆\">五、V2Ray\u002FXray：更强的流量混淆\u003C\u002Fh2>\n\u003Ch3 id=\"为什么需要-v2ray\">为什么需要 V2Ray\u003C\u002Fh3>\n\u003Cp>随着墙的检测能力增强，Shadowsocks 的随机字节流也被识别（通过流量统计特征）。V2Ray 在此基础上增加了更多伪装手段。\u003C\u002Fp>\n\u003Ch3 id=\"vmess-协议\">VMess 协议\u003C\u002Fh3>\n\u003Cp>V2Ray 的主要协议，核心特性：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>动态端口\u003C\u002Fstrong>：可以定期切换端口\u003C\u002Fli>\n\u003Cli>\u003Cstrong>时间戳认证\u003C\u002Fstrong>：服务端验证请求时间（防止重放攻击）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>WebSocket 传输\u003C\u002Fstrong>：将流量伪装成普通 WebSocket 请求\u003C\u002Fli>\n\u003Cli>\u003Cstrong>TLS 包装\u003C\u002Fstrong>：在标准 TLS 层之上，流量特征与 HTTPS 完全一致\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"websocket-tls-cdn-方案\">WebSocket + TLS + CDN 方案\u003C\u002Fh3>\n\u003Cp>这是目前最稳定的方案：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>客户端 → TLS → CDN（如 Cloudflare）→ 你的服务器\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>从防火墙看，只是访问了 Cloudflare 的 IP，无法区分是代理流量还是正常 HTTPS 请求。即使服务器 IP 被封，CDN IP 无法被封（会影响大量正常网站）。\u003C\u002Fp>\n\u003Ch3 id=\"配置示例-简化\">配置示例（简化）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-json\">\u002F\u002F 入站（服务端）\n{\n  &quot;inbounds&quot;: [{\n    &quot;port&quot;: 443,\n    &quot;protocol&quot;: &quot;vmess&quot;,\n    &quot;settings&quot;: {\n      &quot;clients&quot;: [{&quot;id&quot;: &quot;uuid-here&quot;, &quot;level&quot;: 1}]\n    },\n    &quot;streamSettings&quot;: {\n      &quot;network&quot;: &quot;ws&quot;,\n      &quot;security&quot;: &quot;tls&quot;,\n      &quot;wsSettings&quot;: {&quot;path&quot;: &quot;\u002Fws&quot;},\n      &quot;tlsSettings&quot;: {&quot;certificates&quot;: [{&quot;...&quot;: &quot;...&quot;}]}\n    }\n  }]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"六-trojan-伪装成-https-流量\">六、Trojan：伪装成 HTTPS 流量\u003C\u002Fh2>\n\u003Ch3 id=\"原理\">原理\u003C\u002Fh3>\n\u003Cp>Trojan 的思路更激进：直接运行一个真实的 HTTPS 服务器，代理协议藏在 TLS 层之后。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>正常 HTTPS 请求 → 转发给真实网站（通过验证）\n代理请求（含密码） → 提供代理服务\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>从外部看，服务器就是一个普通的 HTTPS 网站，只有知道密码的用户才能使用代理功能。即使防火墙主动探测，也会收到正常的 HTTPS 响应。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"七-分流与规则\">七、分流与规则\u003C\u002Fh2>\n\u003Cp>代理不是所有流量都需要走，合理分流可以提升速度并降低代理服务器负担。\u003C\u002Fp>\n\u003Ch3 id=\"三种分流策略\">三种分流策略\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>全局代理\u003C\u002Fstrong>：所有流量走代理（简单，浪费带宽）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PAC 文件\u003C\u002Fstrong>：浏览器根据规则列表决定哪些域名走代理\u003C\u002Fli>\n\u003Cli>\u003Cstrong>规则代理（TUN\u002FTAP 模式）\u003C\u002Fstrong>：系统级接管，更细粒度控制\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"常见规则格式-clash\">常见规则格式（Clash）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-yaml\">rules:\n  - DOMAIN-SUFFIX,google.com,Proxy\n  - DOMAIN-SUFFIX,github.com,Proxy\n  - DOMAIN-SUFFIX,baidu.com,Direct\n  - GEOIP,CN,Direct          # 国内 IP 直连\n  - MATCH,Proxy              # 默认走代理\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"域名分流工具\">域名分流工具\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>GeoIP 数据库\u003C\u002Fstrong>（MaxMind GeoLite2）：判断 IP 归属地\u003C\u002Fli>\n\u003Cli>\u003Cstrong>geosite 列表\u003C\u002Fstrong>（Project V \u002F Loyalsoldier）：分类的域名列表\u003C\u002Fli>\n\u003Cli>\u003Cstrong>自定义规则\u003C\u002Fstrong>：针对特定需求手动配置\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"八-dns-防泄漏\">八、DNS 防泄漏\u003C\u002Fh2>\n\u003Ch3 id=\"什么是-dns-泄漏\">什么是 DNS 泄漏\u003C\u002Fh3>\n\u003Cp>即使使用了代理，DNS 查询可能仍然走本地 DNS，导致你访问的域名被 ISP 记录。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 检测 DNS 泄漏\ncurl https:\u002F\u002Fdnsleaktest.com\u002Ftest\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"解决方案\">解决方案\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>使用 SOCKS5 的远端 DNS 解析\u003C\u002Fstrong>（前文已提）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>DNS over HTTPS (DoH)\u003C\u002Fstrong>：\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 使用 Cloudflare DoH\ncurl -H 'accept: application\u002Fdns-json'   'https:\u002F\u002F1.1.1.1\u002Fdns-query?name=example.com&amp;type=A'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col start=\"3\">\n\u003Cli>\u003Cstrong>代理软件的 Fake IP 模式\u003C\u002Fstrong>：本地返回假 IP，实际 DNS 解析在代理服务器完成\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"九-各协议特征对比\">九、各协议特征对比\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>协议\u003C\u002Fth>\n\u003Cth>抗检测\u003C\u002Fth>\n\u003Cth>速度\u003C\u002Fth>\n\u003Cth>配置复杂度\u003C\u002Fth>\n\u003Cth>适用场景\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>HTTP 代理\u003C\u002Ftd>\n\u003Ctd>❌ 极低\u003C\u002Ftd>\n\u003Ctd>快\u003C\u002Ftd>\n\u003Ctd>简单\u003C\u002Ftd>\n\u003Ctd>企业内网\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>SOCKS5\u003C\u002Ftd>\n\u003Ctd>❌ 低\u003C\u002Ftd>\n\u003Ctd>快\u003C\u002Ftd>\n\u003Ctd>简单\u003C\u002Ftd>\n\u003Ctd>本地工具链\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Shadowsocks\u003C\u002Ftd>\n\u003Ctd>⚠️ 中\u003C\u002Ftd>\n\u003Ctd>中\u003C\u002Ftd>\n\u003Ctd>中\u003C\u002Ftd>\n\u003Ctd>日常使用\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>V2Ray VMess\u003C\u002Ftd>\n\u003Ctd>✅ 高\u003C\u002Ftd>\n\u003Ctd>中\u003C\u002Ftd>\n\u003Ctd>复杂\u003C\u002Ftd>\n\u003Ctd>高对抗场景\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Trojan\u003C\u002Ftd>\n\u003Ctd>✅ 极高\u003C\u002Ftd>\n\u003Ctd>快\u003C\u002Ftd>\n\u003Ctd>中\u003C\u002Ftd>\n\u003Ctd>高对抗场景\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>VLESS+XTLS\u003C\u002Ftd>\n\u003Ctd>✅ 极高\u003C\u002Ftd>\n\u003Ctd>最快\u003C\u002Ftd>\n\u003Ctd>复杂\u003C\u002Ftd>\n\u003Ctd>高性能需求\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2 id=\"十-实际部署注意事项\">十、实际部署注意事项\u003C\u002Fh2>\n\u003Ch3 id=\"服务器选择\">服务器选择\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>延迟\u003C\u002Fstrong>：香港、新加坡、日本延迟低（&lt; 50ms）\u003C\u002Fli>\n\u003Cli>\u003Cstrong>带宽\u003C\u002Fstrong>：至少 100Mbps，防止多人使用时拥堵\u003C\u002Fli>\n\u003Cli>\u003Cstrong>IP 质量\u003C\u002Fstrong>：避免使用被滥用过的 IP 段（检查 IP 声誉）\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"安全配置\">安全配置\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 修改 SSH 默认端口\nsed -i 's\u002F#Port 22\u002FPort 22222\u002F' \u002Fetc\u002Fssh\u002Fsshd_config\n\n# 禁用密码登录，只用密钥\nsed -i 's\u002FPasswordAuthentication yes\u002FPasswordAuthentication no\u002F' \u002Fetc\u002Fssh\u002Fsshd_config\n\n# 配置 fail2ban 防暴力破解\napt install fail2ban -y\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"流量混淆最佳实践\">流量混淆最佳实践\u003C\u002Fh3>\n\u003Col>\n\u003Cli>使用非标准端口（但 443 最安全，因为封了会影响所有 HTTPS）\u003C\u002Fli>\n\u003Cli>开启 TLS，证书用 Let’s Encrypt 免费证书\u003C\u002Fli>\n\u003Cli>配置真实的 Web 服务（Nginx 反向代理）作为掩护\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2 id=\"总结\">总结\u003C\u002Fh2>\n\u003Cp>代理技术从简单的 HTTP 代理演进到今天的 Trojan\u002FVLESS，本质上是攻防双方的技术博弈：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>防火墙\u003C\u002Fstrong>：基于特征识别 → 流量统计分析 → 主动探测\u003C\u002Fli>\n\u003Cli>\u003Cstrong>代理协议\u003C\u002Fstrong>：明文 → 加密 → 随机化 → 完美伪装成 HTTPS\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>理解这些底层原理，不仅有助于选择合适的工具，也能在出现问题时快速定位和解决。\u003C\u002Fp>\n\u003Cp>对于日常开发者：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>本地调试 → HTTP\u002FSOCKS5 代理\u003C\u002Fli>\n\u003Cli>访问 GitHub\u002FGoogle → Shadowsocks 或 V2Ray\u003C\u002Fli>\n\u003Cli>高对抗场景 → Trojan + CDN\u003C\u002Fli>\n\u003C\u002Ful>\n","2026-04-30",[11,12,13],"网络","代理","协议",false,[16,29,40,52,62,69,76,83,90,97,107,116,126,135,143,151,160,169,178,188,195,205,211,217,223,226,233,240,248,258,267,276,286,296,306,314,324,335,345,354,362,368,376,384,392,400,408,415],{"slug":17,"title":18,"description":19,"pub_date":20,"tags":21,"draft":14,"word_count":28},"ide-skills-guide","Agent Skills 完全指南：21 款第三方 Skill 深度评测与使用心得","全面评测 21 款第三方 Agent Skills，涵盖 Vue 生态、前端设计、构建工具、实用工具四大分类。从安装配置到实际使用场景，带你了解每个 Skill 的功能特点、最佳实践与使用心得。","2026-06-15",[22,23,24,25,26,27],"agent","skills","AI","效率工具","前端","Vue",4169,{"slug":30,"title":31,"description":32,"pub_date":33,"tags":34,"draft":14,"word_count":39},"linux-kernel-skeleton-struct-funcptr-container_of","Linux 内核骨架：struct、函数指针与 container_of","读懂 Linux 内核源码的三件套：巨大的 struct 组合代替继承、函数指针表实现虚派发、container_of 宏从嵌入成员找回完整对象。","2026-05-09",[35,36,37,38],"linux","kernel","C","container_of",1369,{"slug":41,"title":42,"description":43,"pub_date":44,"tags":45,"draft":14,"word_count":51},"astro-complete-guide-2025","Astro 5 深度剖析：Islands 架构原理、构建优化与 Cloudflare Workers 边缘部署","从编译器视角解析 Astro 5 的 Islands 架构实现原理，Content Layer API 的 Vite 插件机制，Server Islands 的流式渲染，以及如何在 Cloudflare Workers + D1 边缘环境下榨干性能。","2026-05-08",[46,47,48,49,50],"astro","frontend","cloudflare","performance","architecture",3663,{"slug":53,"title":54,"description":55,"pub_date":56,"tags":57,"draft":14,"word_count":61},"llm-prompt-engineering","Prompt Engineering 实战：让 LLM 真正听话的技巧","System prompt 怎么写、Few-shot 怎么设计、Chain-of-Thought 原理，以及常见失败模式和调试方法。","2026-05-03",[58,59,60],"ai","llm","工程实践",1723,{"slug":63,"title":64,"description":65,"pub_date":56,"tags":66,"draft":14,"word_count":68},"rag-system-design","RAG 系统设计：从 naive 到 production-ready","Retrieval-Augmented Generation 不只是「向量数据库 + LLM」，分块策略、召回质量、重排序、缓存才是工程核心。",[58,67,59,60],"rag",1613,{"slug":70,"title":71,"description":72,"pub_date":56,"tags":73,"draft":14,"word_count":75},"git-advanced-workflow","Git 进阶工作流：rebase、cherry-pick、bisect 的正确使用","merge 会了，但 rebase 总搞错？bisect 找 bug 提交？interactive rebase 整理历史？这篇一次说清楚。",[74,60],"git",1396,{"slug":77,"title":78,"description":79,"pub_date":56,"tags":80,"draft":14,"word_count":82},"docker-practical-guide","Docker 实战：从会用到用好","会 docker run 不够，Dockerfile 最佳实践、多阶段构建、Compose 编排、镜像瘦身才是日常真正需要的。",[81,35,60],"docker",1268,{"slug":84,"title":85,"description":86,"pub_date":56,"tags":87,"draft":14,"word_count":89},"anthropics-skills-guide","anthropics\u002Fskills：Anthropic 官方 Agent Skills 仓库解析","Anthropic 官方开源的 Agent Skills 标准仓库，127k stars，解析 SKILL.md 规范、17 个示例 skill 的设计模式，以及如何在 Claude Code \u002F Claude.ai \u002F API 中使用",[58,88,22,23],"Claude",2090,{"slug":91,"title":92,"description":93,"pub_date":56,"tags":94,"draft":14,"word_count":96},"karpathy-claude-code-guidelines","Karpathy 的 LLM 编码批评与 CLAUDE.md 最佳实践","基于 Andrej Karpathy 对 LLM 编程助手的观察，forrestchang 提炼出一个 CLAUDE.md 文件，4 条原则解决 AI 编码的典型失控问题：乱猜假设、过度设计、乱改代码、目标不清",[58,88,95,60],"Claude Code",2699,{"slug":98,"title":99,"description":100,"pub_date":56,"tags":101,"draft":14,"word_count":106},"typescript-advanced-patterns","TypeScript 高级模式：让类型系统为你工作","基础 TS 会了但类型总是 any？条件类型、映射类型、模板字面量类型、infer 关键字才是 TS 的真正威力。",[102,103,104,105],"typescript","类型系统","前端工程","高级模式",1419,{"slug":108,"title":109,"description":110,"pub_date":56,"tags":111,"draft":14,"word_count":115},"linux-performance-tuning","Linux 性能调优实战：从 top 到 perf 的完整工具链","遇到性能问题不知道从哪下手？这篇建立系统化的排查思路，从 CPU\u002F内存\u002FIO\u002F网络逐层分析。",[35,112,113,114],"性能","运维","系统编程",1524,{"slug":117,"title":118,"description":119,"pub_date":56,"tags":120,"draft":14,"word_count":125},"python-functional-programming","Python 函数式编程：map\u002Ffilter\u002Freduce 之外","Python 不是纯函数式语言，但 functools、itertools、偏函数、闭包这些工具用好了能让代码简洁一个量级。",[121,122,123,124],"python","函数式","闭包","装饰器",1867,{"slug":127,"title":128,"description":129,"pub_date":56,"tags":130,"draft":14,"word_count":134},"python-oop-guide","Python 面向对象：__init__ 之外你需要知道的","Python OOP 不只是 class + __init__，魔术方法、描述符、元类才是真正的武器。",[121,131,132,133],"OOP","面向对象","魔术方法",1792,{"slug":136,"title":137,"description":138,"pub_date":56,"tags":139,"draft":14,"word_count":142},"python-data-structures","Python 内置数据结构深度解析","list、dict、set、tuple 不只是数据容器，搞懂它们的底层实现和时间复杂度，才能写出高性能 Python。",[121,140,112,141],"数据结构","算法",1517,{"slug":144,"title":145,"description":146,"pub_date":56,"tags":147,"draft":14,"word_count":150},"python-basics-quick-start","Python 快速上手：写给有编程基础的人","已经会其他语言，想快速掌握 Python 的语法特性和思维方式，这篇是捷径。",[121,148,149],"入门","基础",1607,{"slug":152,"title":153,"description":154,"pub_date":56,"tags":155,"draft":14,"word_count":159},"python-dataclass-pydantic","Python dataclass vs Pydantic：数据类选型指南","dataclass 是标准库的轻量选择，Pydantic v2 是带验证的重武器，什么时候用哪个，这篇说清楚。",[121,156,157,158],"dataclass","pydantic","数据验证",1323,{"slug":161,"title":162,"description":163,"pub_date":56,"tags":164,"draft":14,"word_count":168},"python-asyncio-practical","Python asyncio 实战：从回调地狱到协程优雅","asyncio 是 Python 异步编程的核心，搞懂 event loop、Task、gather 这些概念才能写出真正高效的异步代码。",[121,165,166,167],"asyncio","并发","网络编程",1258,{"slug":170,"title":171,"description":172,"pub_date":56,"tags":173,"draft":14,"word_count":177},"python-type-hints-guide","Python 类型注解完全指南：从入门到实践","Python 3.5+ 引入类型注解，配合 mypy\u002Fpyright 让 Python 也能享受静态类型检查的好处。",[121,174,175,176],"typescript-style","type-hints","工具链",1102,{"slug":179,"title":180,"description":181,"pub_date":182,"tags":183,"draft":14,"word_count":187},"pwa-install-update-button","PWA 踩坑：为什么安装按钮从来不出现","从 beforeinstallprompt 到 Service Worker waiting，把 PWA 的安装与更新提示真正做对","2026-05-02",[184,185,186],"pwa","javascript","web",1683,{"slug":189,"title":190,"description":191,"pub_date":192,"tags":193,"draft":14,"word_count":194},"openclaw-vs-hermes-agent","OpenClaw vs Hermes Agent：两个本地优先 Agent 的设计差异","OpenClaw（Novita AI）和 Hermes Agent（Nous Research）都是本地运行的个人 AI Agent，但在记忆系统、技能学习、运行环境和模型生态上走了不同的路。深入对比两种架构的核心差异。","2026-05-01",[58,22,59],1679,{"slug":196,"title":197,"description":198,"pub_date":192,"tags":199,"draft":14,"word_count":204},"cpp-random-design-patterns","C++ 设计模式实战：RAII、观察者、工厂","用现代 C++（C++17\u002F20）实现三种高频设计模式：RAII 资源管理、观察者模式事件系统、工厂模式插件架构。每种模式给出问题场景、实现代码和真实工程案例。",[200,201,202,203],"cpp","设计模式","c++17","工程",2613,{"slug":206,"title":207,"description":208,"pub_date":192,"tags":209,"draft":14,"word_count":210},"data-structures-fundamentals","数据结构基础：从数组到红黑树","系统梳理常用数据结构的核心原理、时间复杂度和适用场景。数组、链表、栈、队列、哈希表、二叉树、堆、图，每种结构附实现要点和 C++ 代码片段。",[140,141,200,149],3004,{"slug":212,"title":213,"description":214,"pub_date":9,"tags":215,"draft":14,"word_count":216},"ai-agent-what-is","什么是 AI Agent？从 LLM 到自主执行","LLM 本身是无状态问答机，Agent 是什么让它’动’起来的？本文深入解析 Agent 的四个核心能力、ReAct 框架、工具调用原理，以及主流框架横向对比。",[58,22,59],2116,{"slug":218,"title":219,"description":220,"pub_date":9,"tags":221,"draft":14,"word_count":222},"ai-agent-memory","AI Agent 的记忆系统：从上下文窗口到长期记忆","深入拆解 AI Agent 的四种记忆类型、上下文窗口压缩策略、RAG 向量检索原理，以及三种典型失败模式和工程选型建议。",[58,22,67],2052,{"slug":4,"title":5,"description":6,"pub_date":9,"tags":224,"draft":14,"word_count":225},[11,12,13],2148,{"slug":227,"title":228,"description":229,"pub_date":9,"tags":230,"draft":14,"word_count":150},"algorithm-binary-search","二分查找：永远写不对？记住这个模板","彻底搞清楚二分查找的边界问题：闭区间和左闭右开两套模板、三道经典 LeetCode 题目完整 C++ 实现，以及二分答案的进阶思路。",[141,231,232,200],"二分查找","leetcode",{"slug":234,"title":235,"description":236,"pub_date":9,"tags":237,"draft":14,"word_count":239},"algorithm-sliding-window","滑动窗口算法：从暴力到 O(n) 的思维跃迁","系统讲解滑动窗口算法的核心模板、适用题型，配合三道经典 LeetCode 题目的完整 C++ 实现，彻底理解双指针收缩思路。",[141,238,232,200],"滑动窗口",1943,{"slug":241,"title":242,"description":243,"pub_date":9,"tags":244,"draft":14,"word_count":247},"network-clash-config","Clash \u002F Mihomo 配置详解：规则、策略组与分流","深入解析 Clash\u002FMihomo 的核心配置结构，包括代理节点、策略组类型、规则优先级、DNS fake-ip 模式，以及一份实用的完整配置模板。",[11,245,12,246],"clash","配置",1292,{"slug":249,"title":250,"description":251,"pub_date":252,"tags":253,"draft":14,"word_count":257},"hid-hotplug","HID 设备热插拔检测：从 udev 到 node-hid","在 Linux 上用 node-hid + usb 库实现可靠的 USB HID 设备热插拔检测，踩坑记录","2026-04-28",[200,254,35,255,256],"hid","nodejs","electron",2039,{"slug":259,"title":260,"description":261,"pub_date":262,"tags":263,"draft":14,"word_count":266},"electron-ipc-types","Electron IPC 类型安全：从 any 到完全类型化","用 TypeScript 泛型封装 Electron IPC，彻底消灭 any，preload 契约集中管理","2026-04-25",[256,102,264,265],"ipc","vue",1446,{"slug":268,"title":269,"description":270,"pub_date":271,"tags":272,"draft":14,"word_count":275},"element-plus-popover-hide","手动关闭多个 el-popover（不用 v-model:visible）","通过 ref + Reflect.get 调用 hide() 方法手动关闭 Element Plus Popover，解释 Vue3 Proxy 导致无法直接调用实例方法的原因。","2024-10-25",[265,273,274],"element-plus","vue3",1321,{"slug":277,"title":278,"description":279,"pub_date":280,"tags":281,"draft":14,"word_count":285},"vite-vue3-ts-elementplus-pinia","用 Vite+（vp）从零搭建 Vue3 + TypeScript + Element Plus + Pinia + Vue Router","使用 Vite+ 统一工具链（vp）一条命令搭建 Vue3 全家桶，涵盖按需导入、Pinia store、路由配置，以及常见坑的解决方案。","2024-08-27",[265,282,102,273,283,284],"vite","pinia","vite-plus",1960,{"slug":287,"title":288,"description":289,"pub_date":290,"tags":291,"draft":14,"word_count":295},"cef-lnk2038-iterator-debug-level","CEF LNK2038：解决 _ITERATOR_DEBUG_LEVEL 不匹配错误","分析 CEF（Chromium Embedded Framework）集成时出现的 LNK2038 _ITERATOR_DEBUG_LEVEL 链接错误，从根本原因到解决方案的完整指南。","2024-05-07",[200,292,293,294],"CEF","Visual Studio","链接错误",1509,{"slug":297,"title":298,"description":299,"pub_date":300,"tags":301,"draft":14,"word_count":305},"npm-electron-install-fix","彻底解决 npm 安装 Electron 失败的问题","分析 npm install electron 失败的根本原因（下载二进制超时\u002F被墙），通过国内镜像（npmmirror）彻底解决，并介绍多种备选方案和常见错误排查。","2024-03-01",[256,302,303,304],"npm","前端工具链","国内镜像",1494,{"slug":307,"title":308,"description":309,"pub_date":310,"tags":311,"draft":14,"word_count":313},"git-out-of-memory","解决 git 报错：Fatal: Out of memory, malloc failed","分析 git 大仓库操作时出现 Out of memory malloc failed 的根本原因，通过调整 pack.windowMemory、http.postBuffer 和 git repack 彻底解决。","2024-01-31",[74,35,312],"工具",2244,{"slug":315,"title":316,"description":317,"pub_date":318,"tags":319,"draft":14,"word_count":323},"vmware-tools-install","在 VMware 虚拟机中安装 open-vm-tools 完整指南","详解 VMware Tools 的作用、open-vm-tools 与官方 VMware Tools 的区别，以及在 Ubuntu 虚拟机中安装并生效的完整步骤和常见问题排查。","2023-11-21",[320,35,321,322],"VMware","Ubuntu","虚拟机",2523,{"slug":325,"title":326,"description":327,"pub_date":328,"tags":329,"draft":14,"word_count":334},"load-balancing-algorithms","负载均衡算法完全指南：从轮询到一致性哈希","系统梳理静态与动态负载均衡算法，涵盖轮询、随机、权重、IP Hash、一致性 Hash、最少连接、最快响应等，并对比 Nginx、Dubbo、Spring Cloud LoadBalancer 的实现差异。","2023-11-15",[330,331,332,333],"分布式","负载均衡","Nginx","微服务",1764,{"slug":336,"title":337,"description":338,"pub_date":339,"tags":340,"draft":14,"word_count":344},"win-cw2a-ca2w","ATL 字符串转换：CW2A 与 CA2W 完全指南","详解 ATL 宏 CW2A\u002FCA2W 在 Unicode 与 ANSI 之间的字符串转换用法、头文件依赖、USES_CONVERSION 宏的作用与常见陷阱。","2023-06-09",[200,341,342,343],"windows","ATL","字符串",1665,{"slug":346,"title":347,"description":348,"pub_date":339,"tags":349,"draft":14,"word_count":353},"csharp-sendmessage-cpp","C# 通过 SendMessage 向 C++ 窗口发送消息与字符串","使用 P\u002FInvoke 调用 user32.dll 的 SendMessage，从 C# 发送自定义 WM_USER 消息及字符串指针给 C++ 原生窗口，并在 C++ 侧正确接收和转换。",[350,200,341,351,352],"C#","互操作","PInvoke",1554,{"slug":355,"title":356,"description":357,"pub_date":358,"tags":359,"draft":14,"word_count":361},"win-postmessage-vector","Windows PostMessage 跨线程传递 std::vector 指针","通过 PostMessage 在 Windows 消息队列中传递 std::vector 指针，使用 reinterpret_cast 将指针装入 LPARAM，并在接收方正确释放内存。","2023-05-26",[200,341,360],"WinAPI",1823,{"slug":363,"title":364,"description":365,"pub_date":358,"tags":366,"draft":14,"word_count":367},"exe-dll-single-package","将 EXE 和 DLL 打包成单一可执行文件","介绍两种将 exe 和依赖 dll 打包成单文件的方案：Enigma Virtual Box 和 WinRAR 自解压，适合发布 Windows 桌面程序时简化分发流程。",[341,200,312],1619,{"slug":369,"title":370,"description":371,"pub_date":358,"tags":372,"draft":14,"word_count":375},"cpp-random-mt19937","C++ 现代随机数生成：用 mt19937 彻底告别 rand()","深入讲解为什么 rand() 不够用，以及如何用 C++11 的 \u003Crandom> 库正确生成高质量随机数，涵盖 mt19937、各种分布和线程安全。",[200,373,374],"c++11","random",1549,{"slug":377,"title":378,"description":379,"pub_date":380,"tags":381,"draft":14,"word_count":383},"win-startup-registry","C++ 实现程序开机自启动：注册表方式详解","通过操作 Windows 注册表 Run 键实现程序开机自启动，包括 HKCU 与 HKLM 区别、完整封装代码、工作目录问题和 UAC 权限处理。","2022-12-26",[341,200,382],"registry",1201,{"slug":385,"title":386,"description":387,"pub_date":388,"tags":389,"draft":14,"word_count":391},"mfc-cstring-wparam","MFC 中 CString 与 WPARAM 之间的转换","详解 MFC 消息传递中 CString 无法直接强转为 WPARAM 的原因，以及两种正确的转换方案，并介绍结构体指针传递的正确姿势。","2022-11-25",[390,200,341],"mfc",1546,{"slug":393,"title":394,"description":395,"pub_date":396,"tags":397,"draft":14,"word_count":399},"duilib-static-build","正确编译 Duilib 静态库：避免 ATL 依赖和链接错误","详解如何用 DuiLib_Static.vcxproj 编译 Duilib 静态库，解决 VARIANT 未定义、Unicode 配置不匹配和 ATL 依赖等常见问题。","2022-08-24",[200,398,341,390],"duilib",2639,{"slug":401,"title":402,"description":403,"pub_date":404,"tags":405,"draft":14,"word_count":407},"mfc-dpi-adaptive","MFC 界面自适应不同分辨率","MFC 对话框程序实现控件和字体随分辨率自动缩放的完整方案，附 DPI Awareness 配置说明","2022-08-17",[390,200,341,406],"dpi",1414,{"slug":409,"title":410,"description":411,"pub_date":412,"tags":413,"draft":14,"word_count":414},"mfc-drag-window","MFC 无标题栏窗口客户区拖动：三种方法对比","MFC 对话框去掉标题栏后如何实现拖动移动窗口，三种方案完整实现与适用场景分析","2022-08-16",[390,200,341],1633,{"slug":416,"title":417,"description":418,"pub_date":419,"tags":420,"draft":14,"word_count":422},"algorithm-number-complement","整数的补数：位运算掩码解法","LeetCode 476 题，用掩码 XOR 实现整数补数，附 C++\u002FPython\u002FJava 三种实现及补数与补码的区别","2021-03-08",[141,421,232],"位运算",1374,[]]