はじめに

こんにちはこんにちは! KMC の魔法少女nona7(nonamea774) です. 最近はクッキーを増やして過ごしています.

この記事はKMCアドベントカレンダー2013の9日目の記事です. 昨日の記事はpossumさんの指紋の話でした.

さらにこの記事は, KMCアドベントカレンダー2013のサブカレンダーであるSSHアドベントカレンダー2013の2日目の記事でもあります. 日頃SSHに親しんでいる部員による、SSHの基礎知識、ツール、Tips等を紹介して参りますので、初心者の方から上級者の方までご笑覧いただければ幸いです.

KMCアドベントカレンダー9日目, SSHアドベントカレンダー2日目の今回は, 楽しいトンネルの掘り方についてのお話をします.

トンネル掘ってあっちこっち(Lオプション)

例えば

Zu

のような, インターネット側からはSSH サーバしか見えなく, SSH サーバと同じLAN 内に目的サーバがあるという状況があったとします. こういう時に, 外から目的サーバの特定のポートが触りたくなるようなことが, よくありますよね?

そういう時にも, SSH の機能の内の一つであるポートフォワーディングを使ってトンネルを掘ることによって, ファイヤーウォールを超えて外部から目的サーバにアクセスすることができます. 以下のようなコマンドです.

$ ssh (SSH サーバのアドレス) -L (ローカルで使用するポート):(目的サーバのアドレス):(目的サーバで待ち受けてるポート番号)

このコマンドによって, ローカルで使用するポートに向かって通信を行うと, その通信は暗号化された経路を辿り目的サーバの待ち受けポートへと到達します.

例えば私は自宅のデスクトップマシンの80番ポートに自分用Web サーバを立てているのですが, そのマシンそのものは外からは見えないようになっています. しかし, RaspberryPi をSSH サーバとして, 外から見えるように設定して動かしているので, デスクトップマシンのIPアドレスを192.168.42.42 とすると,

$ ssh pi -L 8080:192.168.42.42:80

とすることによって, ブラウザで http://localhost:8080/ を見に行くことによって, 家のWeb サーバを覗くことができます.

SSH サーバ – 手元のマシン の間の通信はSSH によって暗号化されているので盗聴される危険性はまずありません. 一方, SSH サーバ – 目的サーバ の間の通信は 暗号化されていない ので盗聴, 改変等を受ける可能性があります. (この場合の例だと, ファイヤーウォールの内側での通信なので, 信頼してもよい という仮定をおいてもいいとはおもいますが, 暗号化されていないという事実は忘れてはいけません)

何もないトンネル(f, Nオプション)

これであなたはいろんなところへと通じるトンネルを掘りまくって楽しくSSH できますね.

でも, さっきの方法でトンネル掘ると, 別に必要ないのにSSH サーバのプロンプト開いてしまいますよね? 必要ないですよね.

いい感じのオプションが実はあります. f と N です. これらのオプションの意味は, それぞれ

f. ssh 先でコマンドを実行したあとに, バックグラウンドへと潜るオプション N. ssh 先でなんのコマンドも実行しないオプション

です. 2つを合わせて使うことで, トンネルを作ったあと, ssh のプロセスは後ろに引っ込んでくれます. 一瞬どうやって終了させればいいのかわからなくて焦りますが, 落ち着いてps コマンドを叩き, 該当するプロセスID を調べ, kill しましょう.

崩れないトンネル(gオプション)

さっきまでの方法で作ったトンネルは, トンネルを作ったマシンからしか通ることはできません. ローカルで待ち受けているポートは, 他のマシンからアクセスしようとしても弾かれてしまうのです.

しばしば, 他のマシンからも掘ったトンネルを使いたい時があります. そんな時に使うのが, gオプションです. 上記のコマンドに単純に-g をつけるだけで, 他のマシンからアクセスできるようになります.

そんな他のマシンからの通信も受け付けるようなSSH のプロセスを, 例えばサーバなどの上で走らせたくなりますよね?

例えば私の例では, 部内のサーバであるring(外からは見えない) にIRC プロクシであるTiarra をポート番号36667 に建てているのですが, 家の中からいちいち上のポートフォワーディングをするのは面倒なので, 以下のようなコマンドをRaspberry Pi で実行してあります.

$ ssh kmc.gr.jp -L 6667:ring:36667 -g -f -N

これで家の中からは pi:6667 にring 上のTiarra が見えています. 実際便利.

通らないトンネル(Rオプション)

ssh には, Rオプションというものもあります. Lオプションは, ローカル側でポートを開き, 接続を待ち受け, それをリモート側のポートに流し込むようなコマンドでした. Rオプションはそれの逆です. つまり, リモート側でポートを開いて接続を待ち受け, そこに来た接続をローカル側のポートに流し込むコマンドです.

以下のように使います.

$ ssh (SSH サーバのアドレス) -R (ローカルで待ち受けてるポート):(SSH サーバのアドレス):(SSH サーバで待ち受けるポート番号)

実は私はまだこのオプションを使ったことは無いです. なぜなら, このコマンドは,

$ ssh (ローカル側のアドレス) -L (SSH サーバで待ち受けるポート番号):localhost:(ローカル待ち受けてるポート番号) -g 

をSSH サーバ上で行うのと同じ効果を持ち, ローカルマシンに世界からSSH できない, もしくはSSH サーバでプロセスを走らせることを禁止されている などの理由がない限りは後者でいいと思うからです. (ローカルにSSH できない時でもたいていLAN 内に世界から見えているSSH 鯖があるのでそいつにフォワードさせている) 「いやそれはおかしい. こういう場合に必要だ」 っていうのがあるならぜひツッコミおねがいします.

さいごに

まだまだSSH 初心者なのでおかしい点などあるかもしれませんが, 見つけましたらぜひお教えください.

今回の私の話はこれまでです.

明日はuda さんによるX11 forwarding についてのお話です.