SSH 転送はローカルポート 13306 で待ち受けていますが、mysql は依然としてローカルのデータベースに接続します。あるいはローカルソケットが見つからないと報告します。Unix では、localhost を渡された MySQL クライアントは TCP ではなく Unix ソケットを選ぶことがあります。ポートを指定しても、その選択が必ず変わるわけではありません。

既存の承認済み TCP 転送では、プロトコルを明示してください:

mysql --protocol=TCP --host=127.0.0.1 --port=13306 \
  --user=dbuser --password

ユーザー名は例示です。パスワードオプションは対話的な入力を求めます。このコマンドは Unix ソケットではなくローカルの TCP リスナーに接続します。

2 つのログインを分けておく

固定の SSH ルートは次の形をとれます:

ssh -N -L 127.0.0.1:13306:db.internal:3306 [email protected]

ゲートウェイの SSH サーバーは db.internal:3306 に到達します。その後 MySQL はそのバイトストリームを通じてデータベースアカウントを認証します。受け入れられた SSH 鍵はデータベースへのログインを許可せず、データベースの送信元制限は接続がルートのその側から来るものとして扱います。

これは固定の TCP アダプターであり、mysql が消費する SOCKS 設定ではありません。転送エンドポイントにはあらかじめ定義された 1 つのターゲットがあるため、アプリケーションに SOCKS のネゴシエーションは不要です。

使用される場所では、意図したデータベースの TLS アイデンティティと証明書ポリシーを維持してください。ソケットを loopback に接続しても、データベース証明書が別のサービス名に対して有効になるわけではありません。ローカル TCP 接続の成功が決めるのはトランスポートの選択であり、その後のデータベース認証や TLS チェックではありません。

関連記事