Nodejs 有什么办法让 Node 里发起的请求的 DNS 请求走 Socks 代理

发布于 1周前 作者 caililin 来自 nodejs/Nestjs

Nodejs 有什么办法让 Node 里发起的请求的 DNS 请求走 Socks 代理

或者其他代理手段?

开发者层面,非用户层面。

当前使用 socks-proxy-agent 代理请求 结果发现 DNS 没过代理。

12 回复

windows ? windows 的 dns 请求不走当前程序的,是一个独立的服务。


建议你先查查什么是 DNS

弄个虚拟机,搞个网关级别的代理吧。

udp 包为什么会走应用层代理

socks5h

瀏覽器那個選項的意思是 “由代理服務器解析域名”, 你其實不知道代理服務器是不是從 dns 獲得 ip

可以尝试 Google 或者 1.1.1.1 的 DNSoverHTTPS 接口,自己解析然后直接用,自己解析走的 HTTPS 就可以直接走代理了。


我明白 lz 的意思了…… socks5 的控制报文里写域名,让 socks5 server 拿到后去解析

应该是挺麻烦, DNS 查询的时候可以传入一个 lookup 函数, 需要自己写, 不知道 npm 上有没有现成的

结贴。

看了下 socks-proxy-agent 的源码。

https://github.com/TooTallNate/node-socks-proxy-agent/blob/d8152efd21d2c0d7a9d08588de61bbc59e6c3dde/index.js#L60

如果初始化的时候传入的是socks5://xxx这样的字符串,会判断成不适用socks5h,结果导致本地解析。

所以,要么使用socks5h://xxx,要么传入 object 显式指定 protocol。

注:使用socks://xxx也是默认使用socks5h

在 Node.js 中,要让发出的 DNS 请求通过 SOCKS 代理,可以使用 socks5-http-clientsocks-proxy-agent 等库来实现。这里以 socks-proxy-agent 为例,展示如何通过 SOCKS 代理发起 HTTP 请求(包括 DNS 解析)。

首先,你需要安装 socks-proxy-agenthttp 模块(Node.js 内置):

npm install socks-proxy-agent

然后,你可以使用以下代码来通过 SOCKS 代理发起 HTTP 请求:

const http = require('http');
const { SocksProxyAgent } = require('socks-proxy-agent');

// SOCKS 代理配置
const proxy = 'socks5://username:password@hostname:port'; // 如果不需要认证,可以去掉 'username:password@'
const agent = new SocksProxyAgent(proxy);

const options = {
  hostname: 'example.com',
  port: 80,
  path: '/',
  method: 'GET',
  agent: agent
};

const req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);

  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`Problem with request: ${e.message}`);
});

req.end();

这段代码会通过指定的 SOCKS 代理发起 HTTP 请求,包括 DNS 解析。注意,SOCKS 代理地址需要根据你的实际情况进行修改。

回到顶部