📺
踏み台を利用したssh時、`-J` でスッと指定出来るとスマート
最初にオチ
$ 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ついて、ブクマもされているみたいで、案外知られていない可能性があるので書いた
なお、私も最近しりました。
Discussion
JumpServer
ではなくてProxyJump
ですね。ssh
の-W
(netcat mode)はポート転送の応用なので、サーバー側でポート転送が禁止されていたら使えません。そういう環境では
ProxyJump
も使えないので、ProxyCommand
でnc
を使う方法は現役だったりします。Configの指摘ありがとうございます!訂正しました。
ポート転送を禁止するStrictな設定だとつかえない情報もありがとうございます。参考になると思います!