· 4分で読了

あるデバッグの記録 — connection refused

この記事は中国語から自動翻訳されたものです。翻訳によりニュアンスが失われている場合があります。

はじめに

数か月前あたりから、僕の Google Chrome で原因不明の connection refused が頻繁に発生するようになった。特定のウェブページが開かないことがあるのに、他の端末から開くと正常に表示される。変だなとは思いつつも、サーバー側の設定の問題かもしれないし、そこまで大きな困り事でもなかったので、そのまま使い続けていた。

カスタムドメインの設定

その後、ついでに .dev ドメインを購入したときに、奇妙なことが起きた。CNAME を設定し、SSL が有効になったことも確認したのに、Chrome でいくらリロードしても CONNECTION_REFUSED が表示され続ける。一般的にこの問題にはいくつか原因が考えられる。1つはサーバー側でポートが開いていないこと、もう1つはファイアウォールの設定だ。この2つの設定を確認してみたが、どちらも問題なかった。念のため、dig xxx.dev +nostats +nocomments +nocmd を使って CNAME が正しく設定されているか確認してみたが、完全に問題なしだった。

次に SSL の問題を疑い、SSL checker を使って SSL が正しく設定されているかチェックした。こちらも正常だった。

まあ、設定が反映されるまで少し時間がかかるのかもしれないと思い、10分ほど待ってからもう一度試したが、やはりダメだった。Chrome には相変わらず真っ白な CONENCTION_REFUSED が表示される。そこでスマホからアクセスしてみると、正常にページが開けた。

この時点で、パソコン内の何らかの設定に問題があるのではないかと疑い始め、関連する設定を調べ始めた。まずは curl blog.kalan.dev を試してみた。するとエラーが出た:

curl: (7) Failed to connect to blog.kalan.dev port 80: Connection refused

うーん、Chrome の結果と curl の結果が同じなので、PC 自体の設定に問題があるという確信がさらに強まった。次に何が起きているのかを調べるため、wget を使ってみた。

wget https://blog.kalan.dev
--2019-03-18 23:11:46--  https://blog.kalan.dev/
正在查找主機 blog.kalan.dev (blog.kalan.dev)... 127.0.0.1, 0.0.0.1
正在連接 blog.kalan.dev (blog.kalan.dev)|127.0.0.1|:443... 失敗: Connection refused。
正在連接 blog.kalan.dev (blog.kalan.dev)|0.0.0.1|:443... 失敗: No route to host。

ちょっと待ってくれ、ホストの検索で 127.0.0.1 が返ってきた?ということは、僕はこのドメインを hosts に追加したのだろうか?記憶にはまったくなかったが、一縷の望みを抱いて /etc/hosts と /private/etc/hosts の2つのファイルを確認してみた。

結果は変わらず、ローカルの hosts にはドメインを設定していなかった。しかし、少なくとも原因の方向性は見えてきた。何らかの設定によって blog.kalan.dev が 127.0.0.1 に向いてしまっているのだ。ここに至っても、原因として何が考えられるのか全く見当がつかなかった。だが、あれこれ手当たり次第に試しているうちに奇妙なことに気づいた。あらゆる xxx.dev で同じ現象が起きているのに、他のドメインではそんな問題が起きていないのだ。

そのとき、ふとあることを思い出した。およそ4年前、僕が Ruby on Rails を学ぶために powder をダウンロードしたことだ。簡単に言うと、ウェブサイトにアクセスした際、自動的にサーバーを立ち上げてくれるツールで、これがめちゃくちゃ便利だった。だから当時喜んでインストールしたのだった。

しかし、公式ドキュメントをよく見てみると、セクション3.1にこう書かれていた:

The POW_DOMAINS environment variable specifies a comma-separated list of top-level domains for which Pow will serve DNS queries and HTTP requests. The default value for this list are the two test,dev domains, meaning Pow will configure your system to resolve *.test and *.dev to 127.0.0.1 and serve apps in ~/.pow under the .test and .dev domains.

ああああ、お前の仕業だったのか!IP を乗っ取られていたのだ。127.0.0.1 を向いていて、PC 自体で 443 ポートを開いていないため、CONNECTION_REFUSED が発生していたわけだ。これまで開けなかったウェブページたちも、もしかしたら .dev ドメインだったのかもしれない。

いくつかメモとして残しておこう:

  • CONNECTION_REFUSED が発生したときは、直接 wget を使ってホストの接続先が正しいか確認する
  • または curl --ipv4 -v “your.site.com” でホストへの接続を確認する

関連記事

他のトピックを探索