Flutter公式ページ（127.0.0.1）が開けない問題の対策

興味本位で`Flutter`の公式ページをのぞいてみようと思ったら、`ERR_CONNECTION_REFUSED`が出てしまって、一般的な対策をしても解決しなかったときの対策についてのメモです。あまり同じ罠にはまる人はいないと思われますが、一応残しておきます。

## 最初に結論
**`Flutter`の公式ページのIPアドレスが`127.0.0.1`**だったことが要因の１つになっていました。過去にローカルのMacBook Proで起動していた**`Pow`というサーバーが同じく`127.0.0.1`を使っており、ずっと起動した状態になっていた**ため、アドレスがバッティングしてしまって`ERR_CONNECTION_REFUSED`が発生していました。

対策として、 **全く使っていなかった`Pow`をアンインストール**することで正常に`Flutter`公式ページ（`127.0.0.1`）を開くことができるようになりました。

以下、対策に至るまでの経緯を順に書いておきます。

## 問題発生時の症状
MacBook ProからChromeを使って`Flutter`公式ページを開こうとしましたが、`ERR_CONNECTION_REFUSED`が出てしまって正しく表示できませんでした。同じネットワークに接続しているAndroidタブレットでは問題なく表示されていました。

## 対策その１　一般的なERR_CONNECTION_REFUSED対策を試す
以下のサイトを参考にして、`ERR_CONNECTION_REFUSED`エラーが出たときの一般的な対策を試しました。

- [ChromeのERR_CONNECTION_REFUSEDエラーの9つの処理方法](https://kinsta.com/jp/blog/err_connection_refused/)

### 1. ルーターの再起動
タブレットが問題なく表示できていることから考えても無駄だとわかっていましたが、おまじない程度と思ってやってみました。やはり改善は見られませんでした。

### 2. ChromeのキャッシュとCookiesの削除
１時間、２４時間、７日間と期間を変えながら削除していきましたが、効果はなく、`ERR_CONNECTION_REFUSED`が出ていました。

### 3. DNSキャッシュの削除
もはや何をやっているのかも理解できているかどうか怪しい内容になってきましたが、これも効果なしでした。また、MacBook Proでのプロキシ設定もファイヤーウォールも特に何も制限しておらず、誰が犯人なのか、迷宮入りしそうでした。

### 4. DNSアドレスの変更
すでにフレッツ光で設定したIPv6のDNSアドレスがありましたが、前述のサイトを参考にして`8.8.8.8`を追加してみました。この対策も残念ながら効果がありませんでした。

### 5. Chrome拡張機能の無効化
単純にオフにするだけでしたが、やはり改善せず、`ERR_CONNECTION_REFUSED`のままでした。

## 対策その２　DNSサーバーへの応答やPingコマンドを試す
DNSアドレスの変更を少しヒントとして、現状のフレッツ光のDNSサーバーにアクセスして`Flutter`公式ページ（`flutter.dev`）を見つけられるのかどうか試してみました。

```
$ dig @2404:1a8:7f01:b::3 flutter.dev aaaa

; <<>> DiG 9.10.6 <<>> @2404:1a8:7f01:b::3 flutter.dev aaaa
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20276
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;flutter.dev.			IN	AAAA

;; AUTHORITY SECTION:
flutter.dev.		300	IN	SOA	ns1.googledomains.com. dns-admin.google.com. 2684359127 21600 3600 1209600 300

;; Query time: 54 msec
;; SERVER: 2404:1a8:7f01:b::3#53(2404:1a8:7f01:b::3)
;; WHEN: Thu Oct 29 11:31:36 JST 2020
;; MSG SIZE  rcvd: 114
```

`AUTHORITY SECTION`という項目を見る限り、なんか正しくGoogleのDNSにアクセスしているようなので、インターネットアクセス自体はできているようでした。

この結果をうけて、もう少しシンプルに考え、`Ping`コマンドの実行から試してみることにしました。

```
$ ping flutter.dev
PING flutter.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.050 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.127 ms
(中略)
64 bytes from 127.0.0.1: icmp_seq=10 ttl=64 time=0.093 ms
^C
--- flutter.dev ping statistics ---
11 packets transmitted, 11 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.050/0.118/0.165/0.029 ms
```

結果は全く問題なかったのですが、ここでようやく`127.0.0.1`という特異なIPアドレスに気が付きました。

```
$ ping google.co.jp
PING google.co.jp (172.217.161.227): 56 data bytes

$ ping google.com
PING google.com (216.58.196.238): 56 data bytes
```

参考までに`google.co.jp`と`google.com`も同じく`Ping`を実行してIPアドレスを確認したところ、いかにも外部のIPアドレスというような値が返ってきました。

## 対策その３　127.0.0.1をChromeに打ち込んでみる
`flutter.dev`ではなく、`127.0.0.1`を直接Chromeのアドレスバーに打ち込んでみたところ、`Pow`というサーバーの画面が表示されてしまいました。

ここにきて、ようやく犯人が見つかりました。以前ローカルであれこれと試していたときにインストールしたBasecamp製の**`Pow`というローカルサーバーが`127.0.0.1`を使用しており、IPアドレスがバッティングしていたことが`Flutter`公式ページで`ERR_CONNECTION_REFUSED`が出てしまう問題の原因**でした。

## 対策その４　Powのアンインストール
ローカルサーバーなので単純にプロセスをkillすれば終わりと思っていたのですが、`Pow`は何度killしても、アクティビティモニターで強制終了しても、蘇ってきてしまう厄介なやつでした。

仕方がないので`127.0.0.1`をChromeに打ち込んで表示されたPowのページに書いてあった以下のコマンドを実行し、アンインストールしました。

```
$ curl get.pow.cx/uninstall.sh | sh
```

やっと`ERR_CONNECTION_REFUSED`が解決して、`Flutter`公式ページを正しく表示できるようになりました。

## 余談
`Pow`はすでに開発やサポートが終了して数年も経っているので、プロセスをkillしても蘇ってくるという想定外の動作が起きてしまったのかもしれないですね。なかなかたちが悪かったです。
あと、`127.0.0.1`なんていうアドレスを使う辺りもGoogleのケレン味たっぷりという印象を受けました。やれやれ。