🦑
HTTP/HTTPS Proxy -> OpenVPN -> HTTP/HTTPS要求でVPNサーバで見える内容が変化するか検証
そもそもHTTPS ProxyとHTTP Proxyの違いがよくわからないし通信内容がどうなるのも全く分からなかったので、実際の通信内容を見て検証する
結論
VPNサーバー内では、クライアント側起点がHTTP ProxyかHTTPS Proxyかで
- HTTP要求 → 全く変わらない 中身はどちらも丸見え
- HTTPS要求 → おそらくほぼ変わらない 中身はどちらも暗号化
検証構成
端末
<->
Docker Squid HTTP/HTTPS(自己証明)
<->
Docker内部:OpenVPNクライアント接続
<->
Docker版OpenVPNサーバー
<->
HTTP/HTTPS Web
構成図
検証
- tsharkでパターンごとにOpenVPNサーバー内のパケットをすべてキャプチャ
- キャプチャファイルをWireSharkで確認・比較
事前準備
-
OpenSSL対応Proxy(squid)をクライアント側Dockerで構築
- 起動
commanddocker run -itd -p 31280:3128 -p 31290:3129 \ -v ./etc:/etc/squid \ --cap-add=NET_ADMIN \ --device /dev/net/tun \ --name vpnsquid \ ubuntu:22.04 docker exec -it vpnsquid bash apt update && apt install -y squid-openssl openvpn
- コンテナ内でsquidのHTTPS用自己証明書作成
commandopenssl genrsa 2048 > /etc/squid/private.key openssl req -new -x509 -days 3650 -key /etc/squid/private.key -sha512 -out /etc/squid/server.crt -subj "/CN=localhost"
- /etc/squid/squid.confを適宜修正
変更箇所は以下参照
HTTPS用ポート設定
squid.confhttps_port 3129 tls-cert=/etc/squid/server.crt tls-key=/etc/squid/private.key
- OpenVPNサーバーを接続先サーバーのDockerで構築
異なるネットワークで立ち上げること
以下参照
- 立ち上げたVPNサーバーコンテナに入り、tsharkインストール
commandapk add tshark
- squid側でVPNサーバー接続&squid起動
VPNサーバー側で作成した.ovpnファイルは事前にsquidコンテナ内へコピー
commandopenvpn --config ovpnファイル.ovpn & squid -N -d 1
検証パターンごとに以下を実行
- VPNサーバー側command
tshark -i eth0 -w ファイル名.cap
クライアント側ホストで以下実行
- HTTP -> HTTPcommand
curl -H 'Cache-Control: no-cache' -x http://localhost:31280 http://example.com
- HTTP -> HTTTPScommand
curl -H 'Cache-Control: no-cache' -x http://localhost:31280 https://example.com
- HTTPS -> HTTPcommand
curl -H 'Cache-Control: no-cache' --proxy-insecure -x https://localhost:31290 http://example.com
- HTTPS -> HTTPScommand
curl -H 'Cache-Control: no-cache' --proxy-insecure -x https://localhost:31290 https://example.com
キャプチャ結果確認
- HTTP -> HTTP
HTTP GETの要求先・bodyはすべて見えている
当然だがVPN接続元クライアントのグローバルIPもそのまま見えている - HTTPS -> HTTP
HTTP GETの要求先・bodyはすべて見えている
HTTPS通信は一切発生しない - HTTP -> HTTTPS
Client Helloでのホスト名・ポートは見えている パスやbodyは見えない
HTTP通信は一切発生しない - HTTPS -> HTTPS
Client Helloでのホスト名・ポートは見えている パスやbodyは見えない
クライアント側でProxyをHTTPSにしたところで、要求先がHTTPなら当然ながら終端⇔HTTP WebはHTTPでやり取りするのでVPNサーバー側では通信内容は丸見えとなる
HTTPS通信内容を復号して見れるかまでは未検証
総括
クライアント側でHTTPS Proxy経由していても、VPNサーバーに接続して非暗号化通信をしたらサーバー管理者は特別なことをせずパケットキャプチャするだけで内容を簡単に閲覧できる
Discussion