ホームラボを始めて数年になります。(いずれもう少し詳しく書くかもしれません!) よくサーバーの一つに ssh する必要があります。

自宅では、以下のようなドメイン名で直接接続できます:

ssh ahoy.m.example.ca
ssh bread.m.example.ca

自宅では Split-Horizon DNSDNSMasq を使って設定しているので、これらのドメインは自宅でのみ解決されます。

外出時は、ssh できる「バステョン」サーバーを使って別のサーバーにホップします。秘密のポートで公開しています。

SSH に自動的にバステョン経由で接続させるため、~/.ssh/config に以下を記述しています:

Host *.m.example.ca
    ForwardAgent yes
    User evert
    ProxyCommand ssh -q -W %h:%p -l evert bastion.example.ca -p 6767

bastion.example.ca は自宅の IP に解決されます。この設定の問題は、上記のコマンドを使うと自宅にいるかどうかにかかわらず常にバステョンを経由してしまう点です。

最近 MatchProxyJump コマンドを知り、以下のように組み合わせてみました:

Match host *.m.example.ca exec "! getent hosts %h >/dev/null"
    ForwardAgent yes
    User evert
    ProxyJump [email protected]:6767

これで以前と同じ動作になりますが、getent hosts %h コマンドが失敗した場合にのみこのルールが適用されます。

ProxyJumpProxyCommand より少しシンプルなコマンドです。少し前から存在していましたが、私は10年以上前から ProxyCommand をコピー&ペーストして使っていました。

このような DNS 設定をしていない場合、.local ドメインでローカルサーバーにアクセスしているかもしれません。その場合も同様に動作しますが、以下の点に注意してください:

Match host *.local exec "! getent hosts %h >/dev/null"
    HostName %h
    ForwardAgent yes
    User evert
    ProxyJump bastion.example.ca:6767

この設定を使うと、コンピューターはまずローカルネットワーク上でそのマシンを探すブロードキャストを行います。.local / MDNS はローカルでもやや遅くなる傾向があり、そのコストを支払うことになります。また ForwardAgent は非常に危険になる可能性があります。誰かが target.local を偽装して SSH キーチェーン全体にアクセスできてしまうかもしれないからです。そのため、このケースでは常にバステョンを経由する方が良いかもしれません。その場合、以下の設定をおすすめします:

Host *.local
    HostName %h
    ForwardAgent yes
    User evert
    ProxyJump bastion.example.ca:6767

この設定では、.local ホストへのすべての SSH 接続で常にバステョンを経由します。