HTTPS通信可視化用のテストコンテナ+起動用スクリプト
-
Dockerで, SquidのSSL Bumpを用いてHTTPS通信のリクエストパス等を可視化するもの
-
実用性はなく, 2025年7月の最新環境でSquid + SSL Bumpが動いた記録および検証用のリポジトリ
- ルーティングやSquidの設定は「ひとまずこれで動いた」一例に過ぎません
-
元々はキャッシュ用プロキシサーバ検討時の副産物. 下記の理由でキャッシュにはほぼ使えません🙇♂️
-
SquidがキャッシュできるWebコンテンツは限定的 (レスポンスヘッダにLast-Modifiedがある等)
-
クライアント端末のOS/ブラウザ等にTLS証明書をインストールする必要がある
-
flowchart LR
r1{{HTTP/HTTPS<br>Request}} <--> w1("NIC (LAN)")
subgraph Host PC
w1
subgraph docker
s(Squid)
end
r2{{HTTP/HTTPS<br>Request}} <--> w2("NIC (WAN)")
end
w1 <--> s
s <--> w2
w2 <--> i((Internet))
-
ホストPC (Ubuntu 24.04)
uname -v # #24~24.04.3-Ubuntu SMP PREEMPT_DYNAMIC Mon Jul 7 16:39:17 UTC 2 docker --version # Docker version 28.3.2, build 578ccf6 openssl version # OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024) iptables --version # iptables v1.8.10 (nf_tables)
-
コンテナ (Ubuntu/squid)
uname -a # Linux squid 6.14.0-24-generic #24~24.04.3-Ubuntu SMP PREEMPT_DYNAMIC Mon Jul 7 16:39:17 UTC 2 x86_64 x86_64 x86_64 GNU/Linux squid -v # Squid Cache: Version 6.13
-
本リポジトリを任意の場所にcloneし, リポジトリのトップに移動
git clone git@github.com:ec22s/docker-squid-sslbump.git cd docker-squid-sslbump -
TLS証明書(いわゆるオレオレ証明書)を作成
openssl req -new -newkey rsa:2048 -days {証明書の有効日数} -nodes -x509 \ -subj '/C=JP' \ -keyout ./conf/squid_bump.key \ -out ./conf/squid_bump.crt -
LAN側のNIC名を
ip a等で確認, 起動用スクリプトstart.shに設定Lines 1 to 2 in 070c3fe
-
起動すると下記の挙動になります
-
LAN側のNICに来たHTTP・HTTPSアクセスがDocker内のSquidへ転送される
- 例えばLAN側のNICをWi-Fiホットスポットにすれば, それに接続した機器からのアクセスがSquidへ転送される
-
他のNICでインターネットにつながっていれば, Squidから自動的にインターネットにアクセスし, 結果をリクエスト元に返す
-
ホストPCからのHTTP・HTTPSアクセスはSquidを経由しない
-
-
-
起動・終了
sudo ./start.sh
-
下記の順で起動処理が走ります
-
コンテナが起動済みならいったん終了, ボリュームを消去
-
iptablesでルーティングを設定 -
コンテナを起動 (詳細は
Dockerfileとdocker-compose.ymlを参照) -
問題なければ最後に
docker ps -aの出力を表示
-
-
終了は
docker compose down(コンテナ内部で作られたログやキャッシュは消えます)- 設定を変えずに再起動する場合
docker compose up -d
- 設定を変えずに再起動する場合
-
-
状況確認
# 各ポート netstat -ntl # iptables sudo iptables -L -t nat cat /etc/iptables/rules.v4 # Squidのアクセスログ docker exec -it squid tail -f /var/log/squid/access.log
-
ホストPCの有線LANをインターネットに接続
-
ホストPCの無線LANをホットスポットに設定 (インターネット接続を共有)
-
TLS証明書をホストPC上で作成し
confディレクトリに保存 -
無線LANのNIC名を
start.shに設定 -
コンテナ起動
-
クライアントPCに
conf/squid_bump.crtをコピー, クライアントPCでホットスポットに接続しコマンド実行# HTTPサイトに初回アクセス curl http://abehiroshi.la.coocan.jp/ # 同じHTTPサイトにもう一度アクセス (*1) curl http://abehiroshi.la.coocan.jp/ # TLS証明書を利用してHTTPSサイトに初回アクセス curl --cacert squid_bump.crt https://www.saitama-u.ac.jp/entrance/ # 同じHTTPSサイトにもう一度アクセス (*2) curl --cacert squid_bump.crt https://www.saitama-u.ac.jp/entrance/
-
上記に対するSquidのアクセスログ確認
*1) ... TCP_MEM_HIT/200 855 GET http://abehiroshi.la.coocan.jp/ - HIER_NONE/- text/html *2) ... TCP_HIT/200 115349 GET https://www.saitama-u.ac.jp/entrance/ - HIER_NONE/- text/html-
HTTP・HTTPSともにキャッシュがありヒットしたことが分かる
-
HTTPS通信のGETリクエストが可視化されている (本来はFQDNへのCONNECTリクエストしか見えない)
-
-
ただし多くのWebサイトではSquidがキャッシュできない. レスポンスヘッダに
Last-Modifiedがない等の理由で, リクエストの都度コンテンツを取得してしまう -
クライアントPCのブラウザ等から通常のHTTPSリクエストをしても証明書エラーで失敗する
-
クライアントPCの常駐プロセスが定期的にHTTPSリクエストを送っていると (ルート証明書取得等), そのエラーがSquidのアクセスログに大量に記録される
以上