使いたいときにいつも混乱するので、ここにまとめておく。
図の左側はインターネットに接続できるクライアント環境(Windowsパソコンなど)、右側はインターネット接続のないサーバセグメントを想定している。
共通オプション
- -f: バックグラウンドで動作
- -N: リモートでコマンドを実行しない
- -g: ポートフォワードで作ったトンネルを他の端末が使うことを許可する(本記事では利用していません)
ローカルポートフォワード
用途
- sshクライアント端末から、sshサーバ側ネットワークにある特定サーバ特定ポートにアクセスしたい
コマンド
hostA$ ssh -fN -L 8080:hostD:80 userC@hostC
リモートポートフォワード
用途
- sshサーバ端末から、sshクライアント側ネットワークにある特定サーバ特定ポートにアクセスさせたい
コマンド
hostA$ ssh -fN -R 8080:hostB:80 userC@hostC
ダイナミックポートフォワード
用途
- sshクライアント端末から、sshサーバ側ネットワークにある、あらゆるサーバにアクセスしたい
コマンド
hostA$ ssh -fN -D 1080 userC@hostC
# hostAのブラウザにlocalhost:1080をSOCKSプロキシとする設定を投入する
リバースダイナミックポートフォワード
用途
- sshサーバ端末から、sshクライアント側ネットワークにある、あらゆるサーバにアクセスさせたい(特にインターネット)
コマンド(パターン1)
hostA$ ssh -fN -D 1081 userA@localhost # hostAの中にSOCKSプロキシを準備
hostA$ ssh -fN -R 1080:localhost:1081 userC@hostC
# hostCのブラウザにlocalhost:1080をSOCKSプロキシとする設定を投入する
コマンド(パターン2)
hostA$ ssh -fN -R 2022:localhost:22 userC@hostC
hostC$ ssh -fN -D 1080 -p 2022 userA@localhost # hostCでの実行に注意
番外編
SOCKSプロキシの設定ができないツールでもSOCKSを使いたい
ダイナミックポートフォワードやリバースダイナミックポートフォワードを利用する際、
ブラウザであればSOCKSプロキシ設定が簡単に可能だが、apt,yumコマンド、自作ツールなどでの対応は難しかったりする。
しかし、proxychains を使うことで、通信を横取りしてSOCKSプロキシを通すことができる。(LD_PRELOADを使い、通信関連APIを上書きしているようだ)
$(HOME)/.proxychains/proxychains.conf
[ProxyList]
# SSH reverse proxy
socks5 127.0.0.1 1080
hostC$ proxychains telnet google.com 80
hostC# proxychains yum update
hostC# proxychains apt-get update