首页 > 解决方案 > GET请求上的Nodejs IPV6 IP地址不一致

问题描述

更新:

因此,如果我添加以下内容,这将按预期工作:

const options = {
    ...standardStuff,
    family: 6,
}

添加family: 6选项意味着它按预期工作。所以我想我的问题会变成为什么?从文档中它指出:

IP address family to use when resolving host or hostname.
Valid values are 4 or 6. When unspecified, both IP v4 and v6 will be used.

Whixh 会让我得出结论,IPV6无论如何我都不需要这样做。为什么curl等不重要?


为我们注册的地址设置规则,并将我的地址zone lockdown添加到白名单中。我从谷歌搜索得到这个。cloudflarecnameIPV6whatsmyip

我还以ipv4格式添加了我的公司 VPN IP 地址。

当我卷曲这个端点时,我收到了 expeted 200- 但是当我通过运行请求时,nodejs我收到一个403.

这甚至更奇怪,因为我可以通过golang,访问端点insomnia,并且当我连接到网络curl时也可以通过它访问它- 例如 VPN 或者如果我将手机连接到我的笔记本电脑。nodejsipv4

curl https://my-restricted-endpoint.com 
# 200
package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    resp, err := http.Get("https://my-restriced-endpoint.com")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp.StatusCode)
    // 200
}

const requestAsync = (options: RequestOptions | string | URL): Promise<number> => {
    return new Promise((resolve, reject) => {
        const req = request(options, (res) => {
            if (typeof res.statusCode !== 'number') {
                reject('no status code returned');
                return;
            }
            resolve(res.statusCode);
        });

        req.on('error', (error) => {
            reject(error);
        });

        req.on('timeout', () => {
            reject('request timed out');
        });

        req.end();
    });
};

const statusCode = await requestAsync('https://my-restricted-endpoint.com')
// returns 200 on VPN or thetherd to phone with an ipv4 ip address
// returns 403 otherwise

我对 netowkring 和 IPV4/6 的了解仅限于不存在 - 但感觉这是nodejs与请求有关的原因。

我也尝试过使用axios

标签: node.js

解决方案


因此,如果我只将我的ipv6地址列入白名单,那么我需要通过设置强制nodejs将主机名解析为.ipv6{family: 6}

如果我将我的ipv6和我的都添加ipv4到白名单,那么我可以不理会该选项。

似乎golang,curlinsomnia我正在使用的实现RFC6555 'Happy Eyeballs' 这意味着ipv6将首先使用它,并且仅在失败时ipv4使用。这就是为什么这些有效而nodejs无效的原因。据我所知nodejs,没有实现这一点,这意味着由于没有将我的ipv4地址列入白名单,cloudflare它会失败。


推荐阅读