今話題(?)のTorを使ってみる - Python編

多分最終回、python編だよ。

pythonからプロキシを使う方法について。若干Torからは離れるかも。 前回セットアップしたVidaliaをそのまま使うので、まだの方はセットアップしてください。

サンプルではループバックアドレスを使っていますが、普通にIP入れれば他ホスト上のTorを使えます。 勿論、そのホストが使用を許可していた場合だけだけどね。

SocksiPyを入れる

pythonは標準ではsocksをサポートしてないようなので、SocksiPyというのを使います。 ダウンロードして、適当に展開してください。

インストールするのが面倒くさかったら、展開したフォルダで作業しちゃってください。

インストールしたい場合は{pythonのインストールディレクトリ}/Lib/site-packages/にコピーすると良いと思うよ。

import socks

が成功することを確認してください。

wget的なものを実装してみる

socksを使って、Tor越しに動作するwgetを実装してみます。 ていってもめんどいので、便利な機能はまったくないけどね。落としてくるだけ。

import socks
import urllib
import sys
import os

PROXY_ADDR = '127.0.0.1'  # 使用するプロキシ(今回はTorが動いているホスト)のアドレス。IPアドレスじゃなくてwww.example.comみたいな形式でもおっけー。
PROXY_PORT = '9050'       # そのまんま、プロキシのポート番号。


if len(sys.argv) > 1:
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, PROXY_ADDR, PROXY_PORT)  # デフォルトのプロキシを設定する

    urllib.socket.socket = socks.socksocket  # urllibのソケットを置き換える。これでurllibがsocksを使ってくれるようになる

    data = urllib.urlopen(sys.argv[1]).read()  # 上でソケットを置き換えたので、あとは普通にurllibを使える

    open(os.basename(sys.argv[1]), 'w').write(data)  # あとはもらったデータを保存するだけ

以上、こんな感じ。

urllib.socket.socketsocks.socksocketでオーバーライドするのがミソかな。 このやり方は他のライブラリにも使える、ような気がする。

Tor越しにTCP接続

前回チラッと触れましたが、socksさんは万能です。TCP接続ならなんでもリレーしてくれます。 ただ、Tor越しだとデバッグが相当面倒だけどね・・・。

デバッグ用に簡単なコードを提示します。 提示しますが、私はこれを使いませんでした。よって使えるかは知らん。

import socket
import SocketServer

PORT = 5555  # 番号に意味は無いのでなんでもおっけー


ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssock.bind(('0.0.0.0', PORT))
ssock.listen(1)

while True:
    sock, fromaddr =  ssock.accept()
    print 'connect from', fromaddr
    sock.close()

これで繋いできた相手がわかるはず。

さて、それではいよいよTor越しに接続を試みるコードを書いてみます。

import socks

PROXY_ADDR = '127.0.0.1'  # Torが動いているホスト
PROXY_PORT = 9050  # Torが動いているポート

HOST_ADDR = '000.123.456.789'  # 接続先のIPアドレス。当然だけど、グローバルIPを使用してください。Tor越しなので。
HOST_PORT = 5555  # ポート番号は適当に。とりあえず上記のコードと合わせてあります


sock = socks.socksocket()  # ソケットを作成。引数なしでおっけー。だってTCPしかないんだもの。

sock.setproxy(socks.PROXY_TYPE_SOCKS5, PROXY_ADDR, PROXY_PORT)  # 使用するプロキシを設定。wgetの時に使ったsetdefaultproxyと同じ設定をソケット別にしている、って感じ。
# ちなみに、第一引数のプロキシタイプには
#   PROXY_TYPE_SOCK4
#   PROXY_TYPE_SOCK5
#   PROXY_TYPE_HTTP
# が使えるようです。
# Torはsocks5ね。

# ここから先は普通のソケットとして使える。

sock.connect((HOST_ADDR, HOST_PORT))

# このサンプルでは接続だけ。適当に書き足して試してみてください。

sock.close()

以上、こんな感じ。 簡単だよね。setproxyが挟まるだけ。

ただデバッグがあんまり簡単でなくて、ポートを開けてやる必要が出てきます。 ポートの開け方は・・・ググれっ セキュリティ上の問題もあるので、デバッグが終わったら必ずポートを閉じるようにしましょう。

ま、そんな感じで試してみてください。 見知らぬIPアドレスから接続される、はずです。


楽に使えるものだね、Torって。

簡単なのは嬉しい。嬉しいのだけれど、これをどう使えばいいのやら・・・。 匿名で通信出来るってのは凄いけど、セキュアな通信ってだけならsslとかsshとか使えばいいし・・・。 なんかこう、良いネタ無いかな?