Nodejs 有什么办法让 Node 里发起的请求的 DNS 请求走 Socks 代理
Nodejs 有什么办法让 Node 里发起的请求的 DNS 请求走 Socks 代理
或者其他代理手段?
开发者层面,非用户层面。
当前使用 socks-proxy-agent 代理请求 结果发现 DNS 没过代理。
windows ? windows 的 dns 请求不走当前程序的,是一个独立的服务。
建议你先查查什么是 DNS
http 请求的话可以试试我这个 https://github.com/YUxiangLuo/node-socks5-http
弄个虚拟机,搞个网关级别的代理吧。
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-client
或 socks-proxy-agent
等库来实现。这里以 socks-proxy-agent
为例,展示如何通过 SOCKS 代理发起 HTTP 请求(包括 DNS 解析)。
首先,你需要安装 socks-proxy-agent
和 http
模块(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 代理地址需要根据你的实际情况进行修改。