トンネルを三方向に掘る
目標
-L、-R、-Dの3種類のフォワーディングをすべて作ってみて、各トンネルがどこにポートを開くかを、自分で確認します。
なぜ重要なのか
フォワーディングは、方向さえ混同しなければ、すべて簡単です。-Lは自分側のポートを開き、-Rは向こう側のポートを開き、-Dは自分側にSOCKSプロキシを立てます。そして-Lの真ん中のホスト名は、SSHサーバーを基準に解釈されます。自分側でその名前が解決できなくても、問題ありません。この事実1つが、踏み台サーバー経由の接続のほぼすべてです。
このラボでは、SSHサーバーは127.0.0.1:2222です。サーバーとクライアントが同じホストなので、-Rの結果もすぐに確認できます。
ステップ
/opt/fixtures/nt-http/server.pyを、ポート9200、127.0.0.1へのバインドで起動してください。これがトンネルの宛先です。- ローカルフォワーディングで、
19200→127.0.0.1:9200のトンネルをバックグラウンドで開き、curl -s http://127.0.0.1:19200/okの結果を/root/tun/local.txtに保存してください。 19200を誰が開いたかを確認して、/root/tun/proof.txtに保存してください。プロセス名にsshが表示される必要があります。- リモートフォワーディングで、SSHサーバー側に
19300を開いて127.0.0.1:9200へ送り、curl -s http://127.0.0.1:19300/okの結果を/root/tun/remote.txtに保存してください。 - ダイナミックフォワーディング(SOCKS)で
11080を開き、そのプロキシを通してhttp://127.0.0.1:9200/okをリクエストした結果を、/root/tun/socks.txtに保存してください。 - ローカルフォワーディングをもう1つ開きます。ただし今回は、すべてのアドレスにバインドして、
19201→127.0.0.1:9200へ送り、自分のインターフェースのIPで接続した結果を、/root/tun/gateway.txtに保存してください。 - 現在起動しているsshトンネルのプロセスのコマンドラインを、
/root/tun/inventory.txtに保存してください。最低でも4行(-Lが2つ、-R、-D)ある必要があります。 /root/tun/report.txtを次の3行で作成してください。各値は、そのオプションがポートを開く側です。L=local/R=remote/D=local
参考
- トンネルは、
ssh -N -f -L 19200:127.0.0.1:9200 -p 2222 -i /root/.ssh/id_labhub root@127.0.0.1の形で開きます。 - SOCKS経由のリクエストは、
curl --socks5-hostname 127.0.0.1:11080 http://127.0.0.1:9200/okです。 - すべてのアドレスへのバインドは、
-L 0.0.0.0:19201:127.0.0.1:9200のように、先頭にアドレスを追加します。 - よくある間違い1:
-Nなしで開くと、リモートシェルが付いて、バックグラウンドで止まります。 - よくある間違い2: ステップ6で、ローカルフォワーディングのバインドアドレスの位置を書き忘れると、ループバックにだけ開いて、インターフェースのIPで接続できません。
バックエンドサービスの起動
/opt/fixtures/nt-http/server.pyを、ポート9200、127.0.0.1へのバインドで起動してください。これがトンネルの宛先です。
トンネルの宛先になるサービスが必要です。ループバックにだけ起動しても、トンネルを通せばアクセスできます。
ローカルフォワーディング
ローカルフォワーディングで、19200 → 127.0.0.1:9200のトンネルをバックグラウンドで開き、curl -s http://127.0.0.1:19200/okの結果を/root/tun/local.txtに保存してください。
-Lの後ろには、3つの値をコロンでつないで書きます。真ん中のホストは、SSHサーバーを基準に解釈されます。
トンネルが開いたポートの確認
19200を誰が開いたかを確認して、/root/tun/proof.txtに保存してください。プロセス名にsshが表示される必要があります。
ssでリッスンソケットを見ると、プロセス名が出ます。トンネルは、sshプロセスがポートを開きます。
リモートフォワーディング
リモートフォワーディングで、SSHサーバー側に19300を開いて127.0.0.1:9200へ送り、curl -s http://127.0.0.1:19300/okの結果を/root/tun/remote.txtに保存してください。
-Rは、SSHサーバー側にポートを開きます。このラボでは、サーバーが同じホストなので、結果をすぐに確認できます。
SOCKSプロキシ
ダイナミックフォワーディング(SOCKS)で11080を開き、そのプロキシを通してhttp://127.0.0.1:9200/okをリクエストした結果を、/root/tun/socks.txtに保存してください。
-Dはポートを1つだけ受け取ります。curlには、SOCKS5プロキシを指定するオプションがあります。
外側のアドレスにバインド
ローカルフォワーディングをもう1つ開きます。ただし今回は、すべてのアドレスにバインドして、19201 → 127.0.0.1:9200へ送り、自分のインターフェースのIPで接続した結果を、/root/tun/gateway.txtに保存してください。
-Lの前に、バインドアドレスを追加で書けます。または、-gオプションを使う方法もあります。
トンネル一覧の整理
現在起動しているsshトンネルのプロセスのコマンドラインを、/root/tun/inventory.txtに保存してください。最低でも4行(-Lが2つ、-R、-D)ある必要があります。
現在起動しているsshプロセスのコマンドラインを見ると、各トンネルの方向がわかります。
3つの方向の比較表
/root/tun/report.txtを次の3行で作成してください。各値は、そのオプションがポートを開く側です。
L=local / R=remote / D=local
ポートがどこに開くかが、核心的な違いです。値は、localまたはremoteで書いてください。