🦑

HTTP/HTTPS Proxy -> OpenVPN -> HTTP/HTTPS要求でVPNサーバで見える内容が変化するか検証

2023/12/02に公開

そもそも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で構築

    1. 起動
    command
    docker 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
    
    1. コンテナ内でsquidのHTTPS用自己証明書作成
    command
    openssl 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"
    
    1. /etc/squid/squid.confを適宜修正
      変更箇所は以下参照

    HTTPS用ポート設定

    squid.conf
    https_port 3129 tls-cert=/etc/squid/server.crt tls-key=/etc/squid/private.key
    
    1. OpenVPNサーバーを接続先サーバーのDockerで構築
      異なるネットワークで立ち上げること
      以下参照
    1. 立ち上げたVPNサーバーコンテナに入り、tsharkインストール
    command
    apk add tshark
    
    1. squid側でVPNサーバー接続&squid起動
      VPNサーバー側で作成した.ovpnファイルは事前にsquidコンテナ内へコピー
    command
    openvpn --config ovpnファイル.ovpn &
    squid -N -d 1
    

検証パターンごとに以下を実行

  • VPNサーバー側
    command
    tshark -i eth0 -w ファイル名.cap
    

クライアント側ホストで以下実行

  • HTTP -> HTTP
    command
    curl -H 'Cache-Control: no-cache' -x http://localhost:31280 http://example.com
    
  • HTTP -> HTTTPS
    command
    curl -H 'Cache-Control: no-cache' -x http://localhost:31280 https://example.com
    
  • HTTPS -> HTTP
    command
    curl -H 'Cache-Control: no-cache' --proxy-insecure -x https://localhost:31290 http://example.com
    
  • HTTPS -> HTTPS
    command
    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