それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

apt-cacher で httpsなレポジトリ をプロキシ・キャッシュする。

apt-cacher 便利で使ってる。

以前導入したapt-cacher が便利である。

膨れ上がった複数台のRaspi4や、膨れ上がったLXCや、Dockerfileからのdocker build時に時短のために大活躍中である。

apt-cacher の問題点/HTTPS

apt-cacher は HTTPSに未対応である。TLSはProxy Connectしてしまうとキャッシュできないので。流石にこれどうしようもない問題である。

APTのレポジトリなどはAPT専用のキーで署名されてるのでHTTPSは無用だと思うのですが、chromeがHTTPを絶滅させに掛かってるので、早晩HTTPSになってしまうのであろう。

そこで、なんとかHTTPSのレポジトリ(docker や nodejs のレポジトリ)をキャッシュできないかと考えていた。

解決方法:強引にHTTPでアクセスする。

調べていると解決方法があって、そうかその手があったか。という感じだったのでメモとして残します。

apt-cacher 側でhttpsするー>クライアントにhttpsさせない

設定を確認すると、次のようになっている。

つまり、HTTPならすべて、プロキシするわけである。

cat /etc/apt-cacher-ng/acng.conf  | grep PassThroughPattern
# PassThroughPattern: private-ppa\.launchpad\.net:443$
PassThroughPattern: .* #
# PassThroughPattern: ^(bugs\.debian\.org|changelogs\.ubuntu\.com):443$

apt-cacher を通すクライアントのDebianから、httpsなレポジトリへアクセスすると、次のようになる。証明書検証エラーになってしまう。

Err:1 https://download.docker.com/linux/debian bookworm InRelease
  Invalid response from proxy: HTTP/1.1 400 Bad Request  Server: nginx/1.18.0 (Ubuntu)  Date: Tue, 10 Oct 2023 08:16:25 GMT  Content-Type: text/html  Content-Length: 166  Connection: close     [IP: 192.168.2.21 443]
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
W: Failed to fetch https://download.docker.com/linux/debian/dists/bookworm/InRelease  Invalid response from proxy: HTTP/1.1 400 Bad Request  Server: nginx/1.18.0 (Ubuntu)  Date: Tue, 10 Oct 2023 08:16:25 GMT  Content-Type: text/html  Content-Length: 166  Connection: close     [IP: 192.168.2.21 443]
W: Some index files failed to download. They have been ignored, or old ones used instead.

https -> http にダウングレードする

そこで、apt レポジトリの設定をいじってあげる。

## http にする場合(Apt-Cacherを使うとき)
sudo sed -e 's|https:|http:|' -i /etc/apt/sources.list.d/docker.list
## https にする場合
sudo sed -e 's|http:|https:|' -i /etc/apt/sources.list.d/docker.list

その結果、次のような soueces.list が出来上がる。

/etc/apt/sources.list.d/docker.list

deb [arch=arm64 signed-by=/etc/apt/keyrings/docker.gpg] http://download.docker.com/linux/ubuntu   jammy stable

この状態で、Apt-Cacherを通すと・・・

無事にキャッシュされる。

takuya@raspi-ubuntu:~$ sudo apt update
[sudo] password for takuya:
Get:1 http://download.docker.com/linux/ubuntu jammy InRelease [48.8 kB]
Hit:2 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
Hit:4 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]

インストールも問題なく行える。

sudo apt reinstall docker-ce-cli

apt-cacher-ng へhttp でプロキシに繋いで、apt-cacher-ng プロキシ側がhttpsでデータとを取りに行って返してくれる。

debian でも試してみた.

takuya@:~$ cat /etc/apt/sources.list.d/php.list
deb [signed-by=/etc/apt/keyrings/php.gpg]  http://packages.sury.org/php/ bookworm main
takuya@:~$ cat /etc/apt/sources.list.d/nodesource.list
deb [signed-by=/etc/apt/keyrings/nodesource.gpg] http://deb.nodesource.com/node_18.x nodistro main

アップデートとインストール

takuya@:~$ sudo apt update
取得:1 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
ヒット:2 http://debian-mirror.sakura.ne.jp/debian bookworm InRelease
ヒット:3 http://deb.nodesource.com/node_18.x nodistro InRelease
ヒット:4 http://debian-mirror.sakura.ne.jp/debian bookworm-updates InRelease
ヒット:5 http://download.docker.com/linux/debian bookworm InRelease
ヒット:6 http://packages.sury.org/php bookworm InRelease
ヒット:7 http://packages.gitlab.com/gitlab/gitlab-ce/debian bookworm InRelease
ヒット:8 http://www.deb-multimedia.org bookworm InRelease
48.0 kB を 4秒 で取得しました (12.6 kB/s)
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了

特に問題なく行える。

apt-cacher なしで docker のビルドとか仮想マシンの作成とかダウンロード時間が面倒くさくてやりたくないです。

結論

HTTP->HTTPSにリダイレクトがかかるサイトは、HTTPでアクセスすればいい。apt-cacherがリダイレクトを処理してくれる。

参考資料