# chain_proxy **Repository Path**: huiyu2020/chain_proxy ## Basic Information - **Project Name**: chain_proxy - **Description**: 链式代理 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-06 - **Last Updated**: 2024-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 从某些网站下载文件时,网站会对IP进行检查,进行下载的IP必须和打开下载网页的IP一致,否则就不允许下载。返回空或者wrong ip。 使用公开代理从这些网站下载文件时,通常速度较慢,且不稳定。 而且某些公开代理的出口IP有多个,不能保证进行下载的IP和打开下载网页的IP是同一个,所以经常会出现下载不了的情况。 正好我有一个国外的VPS(linux,无图形界面),所以最佳方案是使用国外的VPS从这些网站下载文件。下载完成后,再从VPS取回。 如果想要用VPS下载文件,那么就需要通过VPS打开下载网页。 如果VPS没有被禁,VPS上建立一个代理服务器,本机可以通过代理打开下载网页。 但是VPS被禁,只能通过公开代理访问。本机连接到公开代理,公开代理连接到VPS,VPS连接到目标网站。 研究了一下某工具(工具名不能出现!)的配置文件,没有找到这种连接方式。 有一个接近的方式,使用`proxySettings`,但是这种方式下依然需要本机能直接访问二级代理,不符合需求。 最后研究了一下http代理的原理,自己动手,用node.js实现了。 # 实现方法 本机用node.js实现一个http代理,端口号为10813。 浏览器中配置代理服务器为`http://127.0.0.1:10813` 用某工具建立一个本地的http代理,入口的端口号为10809,出口为公开代理。 VPS上建立一个http代理,入口的端口号为10086,出口为`freedom`。 **http代理公开在公网,比较危险。Basic认证防君子不防小人。** 代码原理: 监听10813端口 1. 接受浏览器连接(连接1),并读取浏览器数据`CONNECT 目标服务器 HTTP/1.1`。 ``` CONNECT www.google.com:443 HTTP/1.1 Host: www.google.com:443 Proxy-Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 ``` 2. 建立新的tcp连接(连接2),连接到本地http代理`127.0.0.1:10809`。 3. 向连接2发送`CONNECT VPS的IP:10086 HTTP/1.1`。 ``` CONNECT VPS的IP:10086 HTTP/1.1 Proxy-Authorization: Basic base64字符串 ``` 代理服务器需要用户名和密码验证时,需要添加`Proxy-Authorization`,否则不需要。 base64字符串为`username:password`的base64编码。 4. 连接VPS代理`VPS:10086`成功则会返回`HTTP/1.1 200`。 如果用户名或密码错误,状态码为`407`。 5. 继续向连接2发送`CONNECT 目标服务器 HTTP/1.1`。 6. 连接目标服务器成功则会返回`HTTP/1.1 200`。 7. 向连接1发送`HTTP/1.1 200`。 8. 连接1和连接2互相转发数据。