Node.js 標準ライブラリの Fetch API は、リクエストヘッダーのHostが変更できないなどの制約があります。 そのため、リクエストヘッダーがどうなっているかを確認します。

tcpdump

tcpdumpを使って Fetch API のHTTPリクエストヘッダーを確認します。 アクセス先は http://www.example.com にします。

使用するサンプルプログラムは以下になり、ファイル名は test.mjs とします。

const url = "http://www.example.com";

const res = await fetch(url);
const text = await res.text();
console.log(text);

ターミナルを2つ開いて、先に以下のコマンドでtcpdumpを起動しておきます。

sudo tcpdump -nn -X 'dst host www.example.com and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
正常に起動してパケットキャプチャできる状態になれば以下のようになります。
$ sudo tcpdump -nn -X 'dst host www.example.com and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes

tcpdumpの用意ができたら以下を実行して、Fetch APIでアクセスします。

node test.mjs

正常にキャプチャできた場合、tcpdumpは以下のようになります。

$ sudo tcpdump -nn -X 'dst host www.example.com and (((ip[2:2] - 
((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
01:15:21.904271 IP 172.19.163.122.44202 > 93.184.215.14.80: Flags [P.], seq 239393
7715:2393937885, ack 376805629, win 502, options [nop,nop,TS val 862434163 ecr 260821
5624], length 170: HTTP: GET / HTTP/1.1
        0x0000:  4500 00de ec51 4000 4006 c973 ac13 a37a  E....Q@.@..s...z
        0x0010:  5db8 d70e acaa 0050 8eb0 9733 1675 98fd  ]......P...3.u..
        0x0020:  8018 01f6 8525 0000 0101 080a 3367 b373  .....%......3g.s
        0x0030:  9b76 3648 4745 5420 2f20 4854 5450 2f31  .v6HGET./.HTTP/1
        0x0040:  2e31 0d0a 686f 7374 3a20 7777 772e 6578  .1..host:.www.ex
        0x0050:  616d 706c 652e 636f 6d0d 0a63 6f6e 6e65  ample.com..conne
        0x0060:  6374 696f 6e3a 206b 6565 702d 616c 6976  ction:.keep-aliv
        0x0070:  650d 0a61 6363 6570 743a 202a 2f2a 0d0a  e..accept:.*/*..
        0x0080:  6163 6365 7074 2d6c 616e 6775 6167 653a  accept-language:
        0x0090:  202a 0d0a 7365 632d 6665 7463 682d 6d6f  .*..sec-fetch-mo
        0x00a0:  6465 3a20 636f 7273 0d0a 7573 6572 2d61  de:.cors..user-a
        0x00b0:  6765 6e74 3a20 6e6f 6465 0d0a 6163 6365  gent:.node..acce
        0x00c0:  7074 2d65 6e63 6f64 696e 673a 2067 7a69  pt-encoding:.gzi
        0x00d0:  702c 2064 6566 6c61 7465 0d0a 0d0a       p,.deflate....

Node.jsの v20.16.0 と v22.12.0 で行うと、リクエストヘッダーは両方とも同じで以下のようになりました。

host: www.example.com
connection: keep-alive
accept: */*
accept-language: *
sec-fetch-mode: cors
user-agent: node
accept-encoding: gzip, deflate