📺

踏み台を利用したssh時、`-J` でスッと指定出来るとスマート

2025/04/11に公開2

最初にオチ

$ ssh -J bastion-server target-server

JはJumpServerの略。

踏み台サーバーとかBastion serverとかいわれるやつ経由でsshしますよね。

え?ssm?gcloud?まあそういう人はいらないかもね。
sshするな?まあ、sshするな警察の人もこの記事はスルーしてもらって…

さておき、VMにログインするときとか、一回ホスト経由するとかあるじゃないですか。そういうときに踏み台経由のsshはいまだもってよくあるものです。

Configにも当然書けます

-J を指定しないでつかいたい時も、以下のようにすっきり!!(すっきりしてない例は後で)

# .ssh/config
Host target-server
    HostName 192.168.1.234
    ProxyJump bastion-server

Host bastion-server
    HostName 192.168.1.123

2025-04-11 ご指摘で訂正しました(ProxyJumpでした)

以下、歴史的な古来の書き方

一応、古来sshで踏み台経由でターゲットサーバーに入る方法をかいておきますね。

なんにも設定しない ssh やり方

従来は踏み台サーバー経由でSSH接続する場合、以下のような方法が使われていました:

local$ ssh bastion-server
bastion-server$ ssh target-server

これは二段階のSSH接続が必要で、まず踏み台サーバーにログインした後、そこから目的のサーバーへ接続するという手順です。

-L をつかう

local$ ssh -L 10022:target-server:22 bastion-server
local$ ssh -p 10022 username@localhost

これはマジで普通しません。known_hostsが混乱するので絶対にやるな。

ProxyCommand で nc

もう少し改良した方法として、SSHのProxyCommandを使う方法もあります。
これが登場したときはみな小躍りし、こぞってこれを入れた物です。

$ ssh -o ProxyCommand="ssh bastion-server nc -w 1 target-server 22" target-server

なお、こちらは一度のコマンドで接続できますが、人間には長くて覚えるのが無理という欠点がありますので、Configに書きます。

Host target-server
    HostName target-server
    User yourusername
    ProxyCommand ssh bastion-server nc -w 1 %h 22

Host bastion-server
    HostName bastion-server
    User yourusername
  • ポートが変わるとちょっと変わるが
  • あと、nc(netcatを別途入れる)手間がちょっとだけある。

そもそもncが不要ですよね。

いつだったかな、ssh自体でそれできるようになりました。

Host target-server
    ProxyCommand ssh -W %h:%p bastion-server
    HostName 192.168.1.234
    User username

Host bastion-server
    HostName bastion-server
    User yourusername

わりとこれの人が多いんじゃないですかね?

で!こういうのはもう古い!

冒頭の通りですが、-J でジャンプしてこうぜ!

こんな時便利だよ

proxmoxとかで毎回tailscaleいれないとnovnc経由でしか触れなくて…みたいなときに、一旦proxmoxサーバーにsshできるようにしておいて、-J指定すると全部が楽。

まとめ

  • -Jでbastionを指定するだけで踏み台使えるので、設定を作り込まなくても便利
  • 50likeついて、ブクマもされているみたいで、案外知られていない可能性があるので書いた

https://x.com/uzulla/status/1905806612809531577

なお、私も最近しりました。

Discussion

いわもと こういちいわもと こういち
JumpServer bastion-server

JumpServerではなくてProxyJumpですね。

そもそもncが不要ですよね。
で!こういうのはもう古い!

ssh-W(netcat mode)はポート転送の応用なので、サーバー側でポート転送が禁止されていたら使えません。
そういう環境ではProxyJumpも使えないので、ProxyCommandncを使う方法は現役だったりします。

uzullauzulla

Configの指摘ありがとうございます!訂正しました。

ポート転送を禁止するStrictな設定だとつかえない情報もありがとうございます。参考になると思います!