Windows
PowerShell
docker
Basic認証
proxy

認証ありプロキシに対して認証を行う認証なしプロキシの構築スクリプト

TL;DR

認証ありプロキシに対して認証を行う認証なしリバースプロキシを簡単に構築できるスクリプト(Windows用)を作ったので紹介します。

これは何か?

会社などで外部インターネットへのアクセスを制限するために使用されている認証ありプロキシ1はソフトウェア開発を行う上で障害となることが多々あります。2
その忌まわしい認証を代理で行ってくれるリバースプロキシをWindowsに構築できるスクリプトを作りました。
これを使えば認証プロキシ環境下でも認証なしプロキシが利用できるようになり、幸せになれます:innocent:

必要なもの

極力環境依存が無いように作りましたが、動かない環境もあるかもしれないです。

  • Windows7 または Windows10 (PowerShellが使えるWindows)
  • Docker Toolbox

使い方

  1. Docker Toolboxをインストール
  2. https://github.com/k-ishigaki/proxy-proxy からzipファイルをダウンロード(git cloneでも良いです)
  3. zipファイルを解凍した中のinstall.batをダブルクリック
  4. 認証プロキシ情報を入力(proxy hostはIPアドレスでもホスト名でもOKです)
  enter proxy host: 123.456.789.012
  enter proxy port: 8888
  enter proxy user: k-ishigaki
  enter proxy pass: **********

スクリプトが動作し終わったら、localhost:8080が認証なしのプロキシとして使えるようになるはずです。

Q&A

1. Docker Toolboxのインストールオプション(インストール中のチェックボックス)は何を選べばいいの?

チェックボックスはデフォルトのまま変更せずインストールしてください。

2. インストール後にVirtualBoxの画面(ウィンドウ)が立ち上がるんだけど?

VirtualBoxのVM(VirtualMachine)を動かしているウィンドウです。このVM上でDockerが動作しているため、このウィンドウを閉じるとプロキシサーバーも終了します。
(Windowsのシャットダウン時にVirtualBoxも自動終了させるために、VMをウィンドウで起動させています。)

3. 起動させるために毎回install.batを使わないといけないの?

パスワードが変わった場合は毎回install.batからやり直す必要があります。
パスワードが変わっていない場合は、VirtualBoxを起動し、名前が"default"のVMを起動すればプロキシ情報の入力無しで再利用できるはずです。(再利用できない場合は、install.batからやり直すしか無いです…)

4. Windowsの起動時に立ち上がるようにはしないの?

バッチファイル内で勝手にスタートアップに登録するのは良くないと考えたため、自動起動の設定までは行っていません。
下記の記事の方法を使えば自動起動させることができます。
【Windows7+VirtualBox】ホストOSの起動時に、仮想マシンを自動起動させる方法

5. うまく動かないんだけど?

現在記号("#$%&'など)ありのユーザー名の認証には対応していません(パスワードは対応しています。記号入りのユーザー名は今後対応する予定です)。
その他動かない情報があればコメントでお知らせください。

参考

Dockerfileは下記を参考にしました。
やっていることの仕組みも図で書いてあるのですごくわかりやすいです。
認証ありプロキシを認証なしにするDockerコンテナ

苦労した点

PowerShellは初だったということもあり、記号が入っているパスワードをエンコードしてDockerに渡す部分に苦労しました。
PowerShellはURLエンコード、Base64エンコード、Dockerfileはalpineのapkのプロキシ設定、Base64デコード、squidの認証情報設定あたりの試行錯誤が多かったです。
正直PowerShellは当分書きたくないと思いました…。:sweat:
また、VirtualBox、Docker-Machineのネットワーク周りの設定にも苦戦しました。。。

その他

Qiita初投稿なので不足しているところがあると思います。
疑問点、不具合などあればコメントいただけると嬉しいです。


  1. この記事ではBasic認証付きフォワードプロキシを指す。 

  2. 例えば、Java8から認証プロキシがデフォルトで通らなくなっている、など。(JavaでHTTPSのサイトに認証付きプロキシ経由でアクセスしようとすると407エラー)