#はじめに
以前ISUCONでNginxをいじっていたところ、リバースプロキシ機能を踏み台として扱えば便利に使えるのではと思い立ち、実装してみました。
なにがしたいのか
とあるローカル環境にアクセスできる踏み台サーバXがあるとして、そのサーバXにブラウザアクセスすればそのローカル環境の各WEBサーバにアクセスできるようにしたい。
通常、この手の役割はプロキシサーバに任せるのが一般的だと思いますが、クライアントPCには社内からInternetに抜けるために別のプロキシサーバを既に設定していましたし、クライアントPCにはなにも設定せず扱えるような便利な仕組みを作りたかった。
メリット
- Nginxを立てたサーバにさえアクセスできるようにすれば、そのサーバからアクセスできる場所へなら簡単にWebアクセスできます。
- NginxにSSLを持たせることができます。
- クライアント-踏み台間がSSL化され、多少安全になります。(やるならBasic認証も入れたいところ。)
- 逆にNginxにSSLでの暗号化を解除させたりすることができます。
- クライアント-踏み台間のSSLじゃなくなることで、SSLしか受け付けないWEBサービスとの通信をパケットキャプチャで検証しやすくなる。テスト環境におすすめ。
(下記で紹介するのはセキュリティを気にする必要のない環境で検証したのでSSLを解除する例になります)
- クライアント-踏み台間のSSLじゃなくなることで、SSLしか受け付けないWEBサービスとの通信をパケットキャプチャで検証しやすくなる。テスト環境におすすめ。
Config
server {
...
location ~^/http/(.*)$ {
proxy_pass http://$1$is_args$args ;
proxy_http_version 1.1 ;
}
location ~^/https/(.*)$ {
proxy_pass https://$1$is_args$args ;
proxy_http_version 1.1 ;
}
}
使用例
Nginxをexample.comの8888番ポートに建て、
そこからhttp://X.X.X.X:XXXX/hogehoge にアクセスできるものとします。
ブラウザで以下にアクセス。
http://example.com:8888/http/X.X.X.X:XXXX/hogehoge
HTTP over TLSなら、
http://example.com:8888/https/X.X.X.X:XXXX/hogehoge
最後に
意外と便利です。
少し冗長な書き方な気がしますが、とりあえず動作確認をしたところまで。
他にもいい方法があったら教えてください。