节点覆盖请求IP解析

问题描述 投票:0回答:4

我正在努力寻找正确的术语来准确地表达这个问题,但我会尽力而为:

在node.js中,有没有办法在发出HTTP请求时手动覆盖IP地址(例如请求

some-domain.com/whatever
,而不是通过DNS解析IP地址,而是手动提供一些IP地址
1.2.3.4
)?

实际上,这相当于在

1.2.3.4 some-domain.com
 中设置 
/etc/hosts

node.js http dns request ip
4个回答
17
投票

Node 的 http 和 https 模块采用 Agent 作为参数,您可以使用

lookup
参数覆盖 dns 解析器。

const http = require("http");
const https = require("https");


const staticLookup = (ip, v) => (hostname, opts, cb) => cb(null, ip, v || 4)
const staticDnsAgent = (scheme, ip) => new require(scheme).Agent({lookup: staticLookup(ip)})

http.get("http://some-domain.com/whatever", {agent: staticDnsAgent('http', '1.2.3.4')})

12
投票

有一个小模块可以做到这一点:evil-dns

evilDns.add('foo.com', '1.2.3.4');

3
投票

我建议查看 Nodejs 关于 DNS API 的文档 (https://nodejs.org/api/dns.html)。 您可以修改操作系统主机文件并使用 dns.lookup() 从主机文件中提取数据而不执行 DNS 查询。

不确定您是否试图避免修改主机文件?


0
投票
const staticDnsHttpAgent = (resolvconf) => new http.Agent({
  lookup: (hostname, opts, cb) => {
    cb(null, resolvconf, undefined)
  }
});

resolvconf.push({
  address: '<ipv6-address1>', 
  family: 6,
},
{
  address: '<ipv6-address2>', 
  family: 6,
},
{
  address: '<ipv4-address>', 
  family: 4,
},
)
http.get("http://some-domain.com/whatever", {agent: staticDnsAgent(resolveConf)})

这是新版本的nodejs(22)的更新,cb params需要是一个数组

© www.soinside.com 2019 - 2024. All rights reserved.