sshコマンドのオプションは、特定の環境下で作業する際にはよく使うのだけど、しばらく使わないと忘れてしまって毎度しらべているので、自分用にまとめておく。
※この記事は 力強くアウトプットする日の 20240216 のアウトプットです。
ssh(1)のドキュメント
-L ポートフォワーディング
書式
ssh -L [bind_address:]port:host:hostport destination
destination側から見た host:hostport を接続元の環境のportにフォワードできる。bind_addressを省略した場合はlocalhost
例
ssh -L 8888:localhost:8000 example.com
example.com
というsshでログインできるホストの localhost:8000
= 127.0.0.1:8000
を接続元の 8888
にフォワード。
接続元の端末で、 localhost:8888
につなぐと、 example.com上の localhost:8000
につながる、と考えてよい。
踏み台とする場合
hostの部分はdestinationからネットワーク的に接続可能であれば、localhost以外も指定できるので、たとえばdestinationのサーバーからしか接続できない、内部ネットワーク上にあるホストに接続することもできる。
ssh -L 8888:192.168.100.123:3306 example.com
example.comというホストから見て、内部ネットワークにあたる192.168.100.123というIPv4アドレスのホストでデータベースサーバーが動作している場合(3306はMySQLのデフォルトポート)
このコマンドを実行した環境で、 localhost:8888
に接続すると、192.168.100.123:3306ポートにつながる。
もし、MySQLのコマンドから利用するのであれば、以下のようなコマンドになる。
mysql -h localhost -P 8888 -u db_user -p db_name
このように、example.comを踏み台として、その先にあるホストに接続が可能となる
-D ダイナミックフォワーディング(SOCKSプロキシー)
書式
ssh -D [bind_address:]port destination
destinationを起点としたSOCKSプロキシーを、接続元の環境のportで起動する。bind_addressを省略するとlocalhost。
SOCKSプロキシーはアプリケーションレベルでフォワーディングをしたいときに使う。主にウェブブラウザ。
例
ssh -D 8888 example.com
接続元の環境の localhost:8888
でSOCKSプロキシーが起動する。たとえば、example.com経由でしか接続できない内部ネットワーク上のウェブサイト(例: internal.example.com
)をブラウザで見たい場合。
ウェブブラウザのプロキシー設定で、SOCKSプロキシーのアドレスに localhost:8888
を設定し、ブラウザのアドレスバーに internal.example.com
と入力して接続すると、 example.com
のホストから通信を行うことになるため、閲覧できるようになる。
Chromeの場合、プロキシー設定は Proxy SwitchyOmega などの拡張を使うと有効/無効の管理がしやすい。
-L
オプションだと1つのホスト、ポートを対象としたフォワーディングだが、 -D
の場合はSOCKSプロキシーに対応したアプリからは、destinationのホスト経由で任意のホストに接続できる。
-R リモートフォワーディング
書式
ssh -R [bind_address:]port:host:hostport destination
destinationのホストのportに接続すると、接続元の host:hostport
につながる。-L
の逆向きと考えればよい。
-X X11フォワーディング
書式
ssh -X destination
接続元環境のX11ディスプレイサーバーにdestination先のX11の接続をフォワーディングする。
destinationの環境でデスクトップアプリを起動し、画面だけを接続元環境に持ってきたい場合に使う。
たとえば、destination先のLinux環境にChromiumをインストールして起動し、接続元環境で画面の操作をしたい場合。VNCなどのリモートデスクトップ接続を利用しなくても、sshだけつながれば使える。
その他
多段SSH
destinationを経由して更に別のホストにsshで接続したい(=多段SSHしたい)場合、ProxyCommandやncコマンドを使う例がでてくるが、最近のOpenSSHの場合は、 -J
オプションや ProxyJump
(.ssh/config
)を使えば記述がシンプルになる。