はじめに

こんにちは。南の住人 A こと wacky です。吉田キャンパスより南に生息している為、こう呼ばれることもあります。

この記事は KMCアドベントカレンダー2013 の 14 日目の記事です。昨日の記事は nojima さんの authorized_keys でした。また、この記事は KMCアドベントカレンダー2013 のサブプロジェクトである SSHアドベントカレンダー2013 の記事でもあります。

今日は、 ssh の -D オプションと、 tsocks について書きたいと思います。なお、以下の記事は何らかの Unix をクライアントとして使っていることを想定しています。

-D オプションについて

みなさん、 ssh -L でトンネルを掘っていてこう思ったことはありませんか?

「いちいちポートを指定してトンネルを掘るのは面倒臭い」

僕はあります。面倒臭いですね。何か良い方法はないものか、と思い ssh の man を読んでみると、魅力的なオプションが見つかります。

-D ポート番号
 ローカルホスト側における、アプリケーションレベルの "動的な" ポート転送を指定します。(略)

なんと魅力的なのでしょう。いちいちポートを指定しなくても、自動的にうまいことやってくれるそうです。 man の続きを読むと、「 ssh は SOCKS サーバのようにふるまいます」と書いてあります。ちょうと京都大学が SSH ポートフォワードサービスを提供しているので、ここで試してみましょう。

$ ssh -fND 1080 hogehoge@forward.kuins.kyoto-u.ac.jp

これで、 localhost の 1080 番ポートに SOCKS サーバが立ったことになります。確認してみましょう。

$ ss -l | grep socks
tcp    LISTEN     0      128          127.0.0.1:socks                 *:*
tcp    LISTEN     0      128                ::1:socks                :::*

確かに SOCKS サーバが立っていますね。では、次はこの SOCKS サーバを利用してみましょう。 Firefox であれば、以下のようにすれば利用することができます。

firefox-socks

この状態で、確認くんにアクセスしてみましょう。

check

確かに、トンネルを通ってアクセスできていることが分かりますね。

-L-D を比較した時の利点・欠点

さて、 -L-D を比較した時の利点・欠点は何でしょう。 -L で似たようなことをするとどうなるか考えてみましょう。

$ ssh -fNL 8080:kmc.gr.jp:80 hogehoge@forward.kuins.kyoto-u.ac.jp

このように ssh したあと、ブラウザで http://localhost:8080/ にアクセスすると、確かに KMC のホームページを見ることができます。しかし、この方法では、いちいち相手のポートと自分のポートを指定しなければならず、また、自分のアクセスする URL も変わってしまうので、不便です。

一方、 -D の場合は、アプリケーションが SOCKS プロキシに対応してさえいれば、トンネルを通らない場合と同じ URL でアクセスすることができます。しかし、もしアプリケーションが SOCKS プロキシに対応していなければ、この方法は使えません。

tsocks と組み合わせる

tsocks というツールを組み合わせて使うことで、SOCKS プロキシに対応していないアプリケーションでも、 SOCKS プロキシを通すことができます。 apt-get や pacman で tsocks をインストールした後、 /etc/tsocks.conf

server = localhost
server_type = 5
server_port = 1080

と書き、

$ tsocks firefox

としてアプリケーションを起動してやることで、アプリケーション側で設定をいじらなくても、 SOCKS プロキシを通すことができます。

実際の使用例

IRC を普段から利用している方であれば、普段から tiarra などの IRC プロキシを使っておられる方が多いと思います。大学から IRC をしたい時も、当然自分の立てている tiarra に繋ぎにいくのですが、あいにく大学の無線 LAN では、特定のポート以外にはアクセスすることができません。

しかし、そんな場合でも、

$ ssh -fND 1080 somewhere
$ tsocks weechat           # weechatは端末上で動くIRCクライアント

としてやれば、IRC クライアントの設定を一切変えることなく、目的の IRC プロキシに繋ぐことができます。便利ですね。ちなみに、 weechat は端末上で動くんだから、 ssh 先のホストで動かせばいいじゃないか、というツッコミは無しでお願いします。

おわりに

以上、 ssh -D と tsocks を組み合わせて使うお話でした。 tsocks は、GUI・CUI 関係なく使えるツールなので、使えるようにしておくとものすごく便利です。

明日はのな君が sshfs の使い方を解説してくれる予定です。