VPN は接続し、社内 wiki はブラウザで開くのに、apt update は到達できないミラーで止まったままだ。その絵のなかでトンネルは何も壊れていない。ブラウザとパッケージマネージャーは 別々のプロキシ判断を二つ しており、設定されていたのは片方だけだった。

どちらの判断が失敗したのかを先に確定させることだけが、最初にやる価値のある作業だ。

設定に触る前にエラーを読む

段階ごとに残るメッセージは違う。名前が永久に解決されないのは DNS、接続が永久に完了しないのはルーティングかファイアウォール、即座に返る 407 はプロキシ認証、証明書への不満は TLS 検証、署名の警告はリポジトリのメタデータだ。この五つの障害には五つの別々の対処が必要で、DNS の問題の上に貼ったプロキシ行は詰まりを別の場所へ移すだけだ。

何かを変える前に、その正確な行と、そこに書かれたリポジトリを控えておく。「タイムアウトした」という曖昧な記憶が、十分の診断を丸半日にする。

APT は独自のプロキシ設定を持つ

APT が読むのは /etc/apt/apt.conf.d/、主要な apt.conf、そして APT_CONFIG が指す任意のファイルだ。デスクトップのプロキシプロファイルや GNOME のネットワーク設定、ブラウザ拡張は読まない。一方、トランスポート層はプロキシの環境変数を尊重する。だからシェルで動く export https_proxy=... は、別の環境で走るタイマーについて何も証明しない。

失敗しているプロセスが実際に見ている内容を出力する: apt-config dump | grep -i proxy。

失敗している処理を実行しているユーザーで実行すること。root が別のファイル群を読んでいたり、systemd のタイマーが別の環境で起動していたりすれば、出力は変わる。その差分が答えだ。矛盾する二つのプロキシ値は、欠けた一つの値より悪い。トランスポート層は見つけた最も具体的な一致に従うからだ。

設定の持ち主が期待する場所にプロキシを置く

管理者が承認した明示的なプロキシなら、新しいファイルに小さな断片を書けば足りる:

Acquire::http::Proxy "http://proxy.corp.example:3128/";
Acquire::https::Proxy "http://proxy.corp.example:3128/";
Acquire::http::Proxy::archive.example.internal "DIRECT";

三行目はほとんどの例が省く部分だ。ホストごとのキーは汎用の値を上書きするので、トンネル経由で届く社内ミラーはプロキシを飛ばせ、ほかの通信はそのままプロキシを通る。DIRECT はこのための文書化された値であり、空文字列ではない。

断片は /etc/apt/apt.conf.d/95proxy のような新しい番号付きファイルとして追加する。ディストリビューションのファイルを上書きすると、次のパッケージ更新で変更が黙って巻き戻る。

認証情報は URI の外に置く

APT トランスポートのリファレンス は認証について apt_auth.conf を指しており、ユーザー名とパスワードはそこに置く。プロキシ URI に埋め込むと、プロセス一覧、シェル履歴、チケットに貼られたあらゆる設定出力に載ってしまう。認証ファイルは厳しい権限を必要とする。認証情報の保管場所だからだ。

スキームも確認する。HTTPS のリポジトリでも HTTP プロキシ経由で到達できる。トランスポート層はミラーの URI スキームとは別の選択だ。

グラフィカルなソフトウェアセンターは別のフロントエンドだ。PackageKit や snap のバックエンドを使っているなら、APT の断片はそれには何の影響もない。だから失敗した要求を出したのがどのプロセスか確認する。

終了コードだけでなく経路を確認する

断片を置いたら、緑の結果を信じるのではなく要求そのものを観察する。apt-get -o Debug::Acquire::http=true update は接続の試行、選ばれたプロキシ、応答コードを出力するので、間違ったプロキシと、あなたを拒否したプロキシを切り分けられる。

次に、動いてはいけないケースを試す。VPN を切って、社内ミラーが応答をやめることを確認する。それでもダウンロードできるなら、何かがトンネルを迂回しているか、古いキャッシュが応答している。許可された経路が今も TLS を検証し、今もリポジトリの署名を検証していることも確認する。通信を検査するプロキシは、そのどちらかを切る理由にはならない。認証されていないクライアントが、静かなタイムアウトではなく明確な拒否を受け取ることも確認する。

動く断片と失敗した出力は、変更記録にまとめて残す。同じ詰まりに当たった次の人は、どんな説明よりも速く二行の違いを見分けられる。

関連記事