在做项目的时候,意外发现某个请求,使用postman和python的requests,都可以请求下来,但是使用node原生的库fetch请求不下来,请求是外国网站国内ip访问不了。所以我开了vpn,但是fetch没有自动换代理的功能。python的requests有。
一、VPN的代理机制
- VPN本质是正向代理 VPN作为客户端与目标服务器之间的中转层,所有流量通过VPN服务器转发:
- 用户请求 → VPN服务器 → 目标服务器
- 目标服务器响应 → VPN服务器 → 用户
- IP地址替换过程
- 请求发出时:用户设备使用真实IP连接VPN服务器
- 请求转发时:VPN服务器使用自身IP地址(即VPN分配的IP)访问目标服务器
- 目标服务器视角:仅记录VPN服务器的IP,无法获取用户真实IP
二、Node.js原生fetch的行为
- 默认直连,不走系统代理 Node.js原生
fetch不会自动识别系统VPN设置,需显式配置代理参数,否则请求将绕过VPN直接连接目标服务器 - 需代码显式设置代理
三、IP地址验证结论
未配置代理的fetch 目标服务器看见的是我们发起请求真实的IP,高风险暴露
正确配置代理的fetch 目标服务器看见的是vpn的ip,低风险暴露
四、代码实现
安装依赖 npm install undici 或者 npm i undici
通过undici强制所有fetch请求经VPN代理中转:
const { setGlobalDispatcher, ProxyAgent } = require("undici");
// 设置代理地址(VPN本地端口通常为7890或1080)
setGlobalDispatcher(new ProxyAgent("http://127.0.0.1:7890")); // :ml-citation{ref="1" data="citationList"}
发起请求并验证IP 访问IP检测服务确认代理生效
fetch("https://httpbin.org/ip")
.then(res => res.json())
.then(data => console.log("当前IP:", data.origin)); // 输出应为VPN服务器IP:ml-citation{ref="1,5" data="citationList"}