npm で ECONNREFUSEDとか言われた

# 症状
```
npm ERR! code ECONNREFUSED
npm ERR! syscall connect
npm ERR! errno ECONNREFUSED
npm ERR! FetchError: request to http://registry.npmjs.org/typescript failed, reason: connect ECONNREFUSED 2606:4700::6810:1b23:80
npm ERR!     at ClientRequest.<anonymous> (/usr/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:110:14)
npm ERR!     at ClientRequest.emit (node:events:390:28)
npm ERR!     at onerror (/usr/lib/node_modules/npm/node_modules/agent-base/dist/src/index.js:117:21)
npm ERR!     at callbackError (/usr/lib/node_modules/npm/node_modules/agent-base/dist/src/index.js:136:17)
npm ERR!     at processTicksAndRejections (node:internal/process/task_queues:96:5)
npm ERR!  FetchError: request to http://registry.npmjs.org/typescript failed, reason: connect ECONNREFUSED 2606:4700::6810:1b23:80
npm ERR!     at ClientRequest.<anonymous> (/usr/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:110:14)
npm ERR!     at ClientRequest.emit (node:events:390:28)
npm ERR!     at onerror (/usr/lib/node_modules/npm/node_modules/agent-base/dist/src/index.js:117:21)
npm ERR!     at callbackError (/usr/lib/node_modules/npm/node_modules/agent-base/dist/src/index.js:136:17)
npm ERR!     at processTicksAndRejections (node:internal/process/task_queues:96:5) {
npm ERR!   code: 'ECONNREFUSED',
npm ERR!   errno: 'ECONNREFUSED',
npm ERR!   syscall: 'connect',
npm ERR!   address: '2606:4700::6810:1b23',
npm ERR!   port: 80,
npm ERR!   type: 'system',
npm ERR!   requiredBy: '.'
npm ERR! }
npm ERR! 
npm ERR! If you are behind a proxy, please make sure that the
npm ERR! 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ahoxa/.npm/_logs/2022-01-26T01_33_37_064Z-debug-0.log
```
`npm install` 全般で起こった

## 原因を探る


+ `ping registry.npmjs.org`は返ってこなかった
+ ブラウザだと返ってくる

→ いろんな人に相談した結果、ブラウザで帰ってくるのはブラウザがいい感じに通れる場所まで引っ張っていってくれるけど、コマンドからだと自動的に引っ張ってきてくれないのでは？という考察

## 原因を探る(2)

`curl -v registry.npmjs.org`を叩いてみる

```
*   Trying 2606:4700::6810:1b23:80...
* connect to 2606:4700::6810:1b23 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1623:80...
* connect to 2606:4700::6810:1623 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1a23:80...
* connect to 2606:4700::6810:1a23 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1323:80...
* connect to 2606:4700::6810:1323 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1723:80...
* connect to 2606:4700::6810:1723 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1423:80...
* connect to 2606:4700::6810:1423 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1923:80...
* connect to 2606:4700::6810:1923 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1223:80...
* connect to 2606:4700::6810:1223 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1823:80...
* connect to 2606:4700::6810:1823 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1123:80...
* connect to 2606:4700::6810:1123 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1523:80...
* connect to 2606:4700::6810:1523 port 80 failed: 接続を拒否されました
*   Trying 2606:4700::6810:1023:80...
* connect to 2606:4700::6810:1023 port 80 failed: 接続を拒否されました
*   Trying 104.16.20.35:80...
* Connected to registry.npmjs.org (104.16.20.35) port 80 (#0)
> GET / HTTP/1.1
> Host: registry.npmjs.org
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< Date: Fri, 28 Jan 2022 03:30:42 GMT
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 0
< Connection: keep-alive
< Location: https://registry.npmjs.org/
< Server: cloudflare
< CF-RAY: 6d4724c668708d24-KIX
< 
* Connection #0 to host registry.npmjs.org left intact
```

ドメイン名はIPアドレスというコンピュータがわかるサーバの住所に変換されるのだが、IPv6アドレスだとどうやら接続が拒否されている様子(原因はわからない)
ブラウザで接続して正常に返ってきたのは、v6アドレスで拒否された時に自動でv4に切り替えてアクセスしているから、のよう(詳細は不明)

# 解決法

今回はIPv6で接続できるようにするのが問題ではなく、`npm install`ができるようになればいいので、v4アドレスへの接続を優先すればいい

というわけでIPアドレスとドメイン名を紐付けているらしい`/etc/hosts`に記述

```
104.16.20.35 registry.npmjs.org
104.16.20.35 registry.npmjs.org
```

変更後、再び`curl -v registry.npmjs.org`を叩く

```
*   Trying 104.16.19.35:80...
* Connected to registry.npmjs.org (104.16.19.35) port 80 (#0)
> GET / HTTP/1.1
> Host: registry.npmjs.org
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
< Date: Fri, 28 Jan 2022 03:36:10 GMT
< Content-Type: text/plain;charset=UTF-8
< Content-Length: 0
< Connection: keep-alive
< Location: https://registry.npmjs.org/
< Server: cloudflare
< CF-RAY: 6d472cc909040ab2-KIX
< 
* Connection #0 to host registry.npmjs.org left intact
```

接続拒否等が出ず正常に動作

## 追記

yarnでも同様に対処しました