Dockerを使ってPrivoxy+Torの環境を一瞬で作る


はじめに

Dockerを使うとPrivoxy + Torの環境を簡単に立ち上げられます。基本的に下記の公式ページを読めばわかる内容ですが、Dockerの便利さを実感できたので記事にします。

dperson/torproxy

なお今回はdperson/torproxyのイメージを利用していますが、Privoxy + Torのイメージは検索するといくつか見つかります。他は試していませんが、今回紹介するような簡単な要件ならばどれを使っても同じように可能だろうと思います。

Privoxy + Torをなぜ使うか

LinuxではTorを導入して起動するだけで、デフォルト設定だとローカルホストの9050番ポートにSOCKS5プロキシが立ち上がり、そのプロキシを使うことでTor経由のWebアクセスが可能となります。

しかし、curlなどによるアクセスなら良いのですが、場合によってはHTTPプロキシは使える一方でSOCKSプロキシを直接使えないことがあります。

その場合はPrivoxyとTorを組合わせて利用することになります。適切な設定をすると、PrivoxyによるHTTPプロキシ(デフォルトでは8118番ポート)を経由することでPrivoxy→Tor→Webサイトのような流れのアクセスが可能になります。

具体的な設定方法はたとえば次のようなページで紹介されています。

4.10. How do I use Privoxy together with Tor?

これはこれで問題はないのですが、Privoxyをインストールして設定ファイルを書き換えるなどするのはそれなりに面倒です。

Privoxyがローカルに残ってしまうのも少し気持ち悪いです。

Dockerで環境を立ち上げればそれらの問題を解決できます。

dockerコマンド

起動

次のようなコマンドでPrivoxy + Torのコンテナを起動します。

docker run -it -p 8118:8118 -p 9050:9050 -d dperson/torproxy

-p 8118:8118はポートのバインドを指定しています。

-p ホスト側ポート:コンテナ側ポートのような記法です。

したがってすでにホストの8118番ポートが使用されている場合は

docker run -it -p 8119:8118 -p 9050:9050 -d dperson/torproxy

のようにポート番号を使われていないものに変更すれば大丈夫です。
また、-p 9050:9050はTorのSOCKSプロキシに接続するためのポートなので、もしHTTPプロキシのみが必要な場合は、

docker run -it -p 8118:8118 -d dperson/torproxy

のように9050番ポートの設定を省略すればHTTPプロキシのみホストからアクセスできる状態で起動します。

動作確認

curlで動作確認を行います。

curl -L ipinfo.io

このようにipinfo.ioにcurlでアクセスすると接続元のIPなどが表示されます。プロキシを何も設定しないと当然自宅のIPアドレスが表示されるはずです。

コンテナをdocker run -it -p 8118:8118 -p 9050:9050 -d dperson/torproxyのコマンドで起動し、8118番ポートでPrivoxyのHTTPプロキシにアクセスできる場合は次のようなコマンドでプロキシ経由のWebアクセスを行います。

curl -Lx localhost:8118 ipinfo.io

(-xオプションでプロキシを指定します)

コンテナが起動し、正しくプロキシ経由のアクセスできている場合は自宅のものとは違うIPアドレスが表示されるはずです。

同様にSOCKSプロキシも確認します。

curl -Lx socks5h://localhost:9050 ipinfo.io

このコマンドでTor経由のアクセスになっていることを確認できるはずです。

終了する

次のコマンドで立ち上がっているコンテナを確認します。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                 PORTS                                                      NAMES
ae9565085d51        dperson/torproxy    "/sbin/tini -- /usr/…"   8 hours ago         Up 8 hours (healthy)   0.0.0.0:8118->8118/tcp, 9050/tcp, 0.0.0.0:9050->9050/tcp   inspiring_brahmagupta

ここでCONTAINER IDもしくはNAMESを確認し、次のコマンドの引数にします。

docker stop ae9565085d51

docker stopの引数にCONTAINER IDもしくはNAMESを指定します。
これでコンテナが停止します。