よくつかうsshコマンドのオプション

sshコマンドのオプションは、特定の環境下で作業する際にはよく使うのだけど、しばらく使わないと忘れてしまって毎度しらべているので、自分用にまとめておく。

※この記事は 力強くアウトプットする日の 20240216 のアウトプットです。

ssh(1)のドキュメント

man.openbsd.org

-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)を使えば記述がシンプルになる。