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なのでSSLEngine
、SSLProxyEngine
の両方が必要です。
確認。
$ curl -I -k https://192.168.33.10:8443
Apache自体の証明書は自己署名証明書なので、curl
のオプションに-k
が必要です。
まとめ
これで、本来のサイトに直接アクセスしようとするのではなく、Apacheを経由して、Apacheにフォワードプロキシを踏んでもらうことで、プロキシに対応していないソフトウェアでもプロキシを踏ませられるようになる、と。
もちろん、クライアントソフトウェアから見た時のアクセス先の変更は、なんらかの方法で必要ですが。