Linux
SSH
portforward

sshポートフォワーディングについて図示してみる

使いたいときにいつも混乱するので、ここにまとめておく。

図の左側はインターネットに接続できるクライアント環境(Windowsパソコンなど)、右側はインターネット接続のないサーバセグメントを想定している。


共通オプション


  • -f: バックグラウンドで動作

  • -N: リモートでコマンドを実行しない

  • -g: ポートフォワードで作ったトンネルを他の端末が使うことを許可する(本記事では利用していません)


ローカルポートフォワード


用途


  • sshクライアント端末から、sshサーバ側ネットワークにある特定サーバ特定ポートにアクセスしたい


コマンド

hostA$ ssh -fN -L 8080:hostD:80 userC@hostC

ssh-L.png


リモートポートフォワード


用途


  • sshサーバ端末から、sshクライアント側ネットワークにある特定サーバ特定ポートにアクセスさせたい


コマンド

hostA$ ssh -fN -R 8080:hostB:80 userC@hostC

ssh-R.png


ダイナミックポートフォワード


用途


  • sshクライアント端末から、sshサーバ側ネットワークにある、あらゆるサーバにアクセスしたい


コマンド

hostA$ ssh -fN -D 1080 userC@hostC

# hostAのブラウザにlocalhost:1080をSOCKSプロキシとする設定を投入する

ssh-D.png


リバースダイナミックポートフォワード


用途


  • 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プロキシとする設定を投入する

ssh-RD1.png


コマンド(パターン2)

hostA$ ssh -fN -R 2022:localhost:22 userC@hostC

hostC$ ssh -fN -D 1080 -p 2022 userA@localhost # hostCでの実行に注意

ssh-RD2.png


番外編


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