BlankTar

about | blog | works | photo

多分最終回、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とか使えばいいし・・・。
なんかこう、良いネタ無いかな?
< startxした時にtimeout in lockingとか言われる pythonを汚く書く >