Apacheでリバースプロキシでリクエストを転送する際に、フォワードプロキシを踏ませる


TL;DR

  • 外部サイトにアクセスする際に、プロキシを踏まなければならない
  • でも、使うソフトウェアがプロキシに対応していない
  • Apacheでリバースプロキシを立てて、対象のソフトウェアの代わりにApacheにプロキシを踏んでもらおう
  • 透過型プロキシとか言わない

そんな、なんとかしてプロキシ環境から外に出たいお話。

環境

Ubuntu Linux 18.04 LTSで行います。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:    18.04
Codename:   bionic

このサーバーのIPアドレスは、192.168.33.10とします。

Apacheのインストール&バージョン。

$ sudo apt install apache2


$ /usr/sbin/apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built:   2019-09-16T12:58:48

mod_ssl、それからmod_proxyを導入します。HTTPSの時にフォワードプロキシを踏むことを考えて、mod_proxy_connectも導入しておきます。

$ sudo a2enmod ssl proxy_http proxy_connect

デフォルトのHTTPサイトの有効化。

$ sudo a2ensite default-ssl

とりあえず、Apacheを再起動。

$ sudo systemctl restart apache2

この環境で始めていきます。

設定する

プロキシ先のターゲットとするサイトは、以下としましょう。

  • HTTP … http://wttr.in/tokyo
  • HTTPS … https://www.google.com

パターンは、以下の3つで構築します。

  • HTTP(8080) → フォワードプロキシ → HTTP(ターゲット)
  • HTTP(18080) → フォワードプロキシ → HTTPS(ターゲット)
  • HTTPS(8443) → フォワードプロキシ → HTTPS(ターゲット)

最後の2つは中間者なんとかっぽい気がしないでもないですが、バリエーションとしてできることは覚えておきましょう。

参照するドキュメントは、こちら。

最小構成で設定します。

HTTP(8080) → フォワードプロキシ → HTTP(ターゲット)

設定。

Listen 8080

<VirtualHost *:8080>
    ProxyPass / http://wttr.in/tokyo
    ProxyPassReverse / http://wttr.in/tokyo

    ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>

フォワードプロキシを踏ませる場合には、ProxyRemoteディレクティブを使うのがポイントです。

確認。

$ curl -I 192.168.33.10:8080?lang=ja

HTTP(18080) → フォワードプロキシ → HTTPS(ターゲット)

設定。

Listen 18080

<VirtualHost *:18080>
    SSLProxyEngine on

    ProxyPass / https://www.google.com
    ProxyPassReverse / https://www.google.com

    ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>

プロキシ先がHTTPSの場合は、SSLProxyEngineディレクティブが必要です。

確認。

$ curl -I 192.168.33.10:18080

なお、今回の構成では、ターゲットのSSL証明書をApacheが理解できることが前提になっています。

HTTPS(8443) → フォワードプロキシ → HTTPS(ターゲット)

設定。

Listen 8443

<VirtualHost *:8443>
    SSLEngine on

    SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    SSLProxyEngine on

    ProxyPass / https://www.google.com
    ProxyPassReverse / https://www.google.com

    ProxyRemote * http://[your-proxy-host]:[your-proxy-port]
</VirtualHost>

Apache自体もHTTPSにしつつ、プロキシ先もHTTPSなのでSSLEngineSSLProxyEngineの両方が必要です。

確認。

$ curl -I -k https://192.168.33.10:8443

Apache自体の証明書は自己署名証明書なので、curlのオプションに-kが必要です。

まとめ

これで、本来のサイトに直接アクセスしようとするのではなく、Apacheを経由して、Apacheにフォワードプロキシを踏んでもらうことで、プロキシに対応していないソフトウェアでもプロキシを踏ませられるようになる、と。

もちろん、クライアントソフトウェアから見た時のアクセス先の変更は、なんらかの方法で必要ですが。