ShadowsocksでURI検閲HTTPプロキシを越える

中南海による言論統制システム金盾を越える為にいろんなVPNソフトウェアがありますが、その一つにSOCKSv5プロトコルを暗号化して飛ばすShadowsocksがあります。最近では開発者の家に警察がやってきてソースコードgithubから消すのを強要される事件がありましたが、既にもりもりforkされていました。サーバもpipに残ってるしOSSって強いね。作者さんは無事でしょうか、、、、

さて、日本でもネットワークによっては検閲プロキシなどの壁が存在するので当然壁を壊しにゆきます。昼休みぐらい艦これさせろ。

HTTPプロキシを越える手段としては、CONNECTメソッドがあります。この手で壁を超える際に使うのはstoneが有名です。CONNECTメソッドの詳細はRFC 2817あたりですが、簡単に言うと「指定のホストへの通信を中継する機能がある」わけです。なんに使うかって言うとRFCにあるようにSSL通信で、SSL通信はバイナリデータをサーバとクライアントの間でやりとりする必要があります。

CONNECTメソッドの動きは簡単で、CONNECTでリクエストを投げると、HTTPレスポンスが返ってきた後にリクエストで指定したホスト:ポートへのtcp接続を中継してくれます。stone使った場合のはこんな感じ。

Shadowsocksと一緒にstone起動してもいいんですが、せっかくソース公開してるので改造してCONNECTリクエスト投げて、HTTPレスポンスを無視する機能をTCPリレー部分に突っ込んでみました。これだと単にShadowsocks.exeを起動するだけで壁を越えてくれます。やったね。

ソースはforkしたgithubに突っ込んでバイナリもreleaseしてみた*1しれっとレゾルバがIPv6アドレス無視するようにしてありますが、これはデバッグ中にpolipo使ってたけど127.0.0.1でしかbindしてくれなくてlocalhostで解決した際に最初に::1が返ってくるとコネクション貼れない場合があったんですが最高に馬鹿っぽい感じがしますねこれ。

これで晴れて壁を越えて世界の知にアクセスできるヤッターとか思ってたけど、出口設置したさくらVPS2ch.netからブロック*2されてるオチもあったり。

*1:Tag打たないとDraftから先に進まないって知らなくて暫くハマった。

*2:分裂騒動の影響ですね。