発生した現象
WSL2上のUbuntu環境で、以下のコマンドを実行したところ、途中で処理が進まなくなった。
sudo apt update && sudo apt install -y fcitx5 fcitx5-mozc
出力は以下の状態で止まったまま動かない。
Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease
0% [Waiting for headers] [Waiting for headers]
Ign:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Ign:3 http://security.ubuntu.com/ubuntu jammy-security InRelease
0% [Waiting for headers] [Waiting for headers]
興味深いのは、Dockerの公式リポジトリ(download.docker.com)へのアクセスは正常に完了しているのに、Ubuntu標準のアーカイブミラー(archive.ubuntu.com / security.ubuntu.com)だけが応答しない、という点だった。
切り分けの手順
1. DNS解決を疑う
まず疑ったのは名前解決の問題。WSL2は/etc/resolv.confが自動生成される仕組み上、企業VPN環境ではDNSがおかしくなることがある。
nslookup archive.ubuntu.com
→ 名前解決には問題なし。DNSはシロと判断。
2. プロキシ設定を疑う
企業ネットワークでプロキシ経由が必須なのに、aptやシェルにプロキシ設定が反映されていないケースもよくある。
env | grep -i proxy
cat /etc/apt/apt.conf.d/*proxy* 2>/dev/null
→ こちらも該当なし。
3. curl -v で実際の通信を直接観察する
名前解決やプロキシに問題がないなら、実際にどこで通信が止まっているのかを直接見るのが確実。
curl -v --connect-timeout 10 http://archive.ubuntu.com/ubuntu/
結果、以下のような出力が得られた。
* Trying 2620:2d:4000:1::102:80...
* Immediate connect fail for 2620:2d:4000:1::102: Network is unreachable
...
* Trying 91.189.91.81:80...
* After 4944ms connect time, move on!
* connect to 91.189.91.81 port 80 failed: Connection timed out
ここから2つのことが分かる。
-
IPv6への接続失敗(
Network is unreachable)は即座にエラーが返っており、これは経路がないだけで実害はない(curlは正しくIPv4へフォールバックしている) - 本当の問題はIPv4アドレスへの接続が「タイムアウト」していること。これは「拒否(RST)」ではなく「パケットが黙って破棄されている」状態であり、ファイアウォールやVPNによる意図的なブロックの典型的な兆候。
4. HTTPとHTTPSでポートを比較する
Dockerのリポジトリは通っていたことから、「特定のポートだけがブロックされているのでは」という仮説を立てた。Ubuntu標準ミラーはデフォルトで**80番(HTTP)を使うのに対し、Dockerのリポジトリは443番(HTTPS)**を使っている可能性が高い。
curl -v --connect-timeout 10 https://archive.ubuntu.com/ubuntu/
→ 成功。 これで原因が確定した。
原因
社内ネットワーク/VPN環境で、80番ポート(HTTP)への外向き通信がブロックされており、443番ポート(HTTPS)は許可されていた。
Ubuntu標準のミラーはデフォルトでHTTPを使う設定になっているため、VPN環境下ではこの制限に引っかかっていた。
対処方法
/etc/apt/sources.list 内のURLを http:// から https:// に一括置換する。
sudo sed -i 's|http://archive.ubuntu.com|https://archive.ubuntu.com|; s|http://security.ubuntu.com|https://security.ubuntu.com|' /etc/apt/sources.list
sudo apt update
これで apt update が正常に完了し、当初の目的だった fcitx5 / fcitx5-mozc のインストールも問題なく進められた。
補足:他の設定ファイルも要確認
/etc/apt/sources.list 以外にも、/etc/apt/sources.list.d/ 配下に個別のリポジトリ設定(Dockerなど)が置かれていることが多い。念のため、他にhttp://のままのファイルが残っていないか確認しておくとよい。
grep -rl "^deb http://" /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null
該当ファイルが見つかった場合は、同様にhttps://へ置換しておく。
教訓
- 「特定のリポジトリだけ通らない」という現象が出たら、DNS・プロキシの確認だけでなく、
curl -vで実際の通信を直接観察するのが最も早い切り分け方法。 - IPv6の
Network is unreachableは経路未設定によるものであることが多く、致命的な問題ではない場合が多い(IPv4へのフォールバックが正しく動いていれば無視してよい)。むしろConnection timed out(応答なしで固まる)の方が、ファイアウォール等による意図的なブロックを疑うべきサイン。 - 「一部のホストだけ通って、一部だけ通らない」という状況では、ホスト名やIPアドレスの違いだけでなく、使用しているポート番号(80 vs 443)の違いにも着目すると原因が見えやすい。