質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

多段SSHのポートフォワードでDBにアクセスしたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 4
  • VIEW 3,495

score 80

多段SSHのポートフォワードで、
開発用PC(1.1.1.10) -> 踏み台1(1.1.1.11) -> 踏み台2(1.1.1.12) -> DB(1.1.1.13)
のDBに接続したいですが、この設定方法が分かりません。

SSHポートフォワードの仕組みや、
LocalFowardの書式を理解できていないかもしれません。

設定が間違っていれば、教えていただけませんでしょうか。
あるいは、合っているなら、どこから切り分けていけばいいでしょうか。

# ~/.ssh/config

# humi1
Host humi1
 Hostname 1.1.1.11
 User humi-user1
 LocalForward 55552 1.1.1.12:55551

# humi2
Host humi2
 Hostname 1.1.1.12
 User humi-user2
 ProxyCommand ssh humi1 -W %h:%p
 LocalForward 55551 1.1.1.13:3306


と上記のように、設定しておき、

# ターミナル上で実行
ssh humi2 # 1. 別ターミナル上でトンネルを掘る -> 下記エラーが出る
====================================================================
Host key fingerprint # humi1のフィンガープリント
Host key fingerprint # humi2のフィンガープリント
bind: Cannot assign requested address
channel_setup_fwd_listener: cannot listen to port: 55551
Could not request local forwarding.
====================================================================

デバック情報は下記のような感じでした。

root@devPC ~# mysql -u user -ppassword -P55552
ERROR 1045 (28000): Access denied for user 'user'@'password' (using password: YES)
root@devPC ~# netstat -anp | grep 29
tcp        0      0 127.0.0.1:29291             0.0.0.0:*                   LISTEN      27639/ssh

[humi-user1@humi2 ~]$ netstat -anp | grep 29
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)

[humi-user2@humi2~]$ netstat -anp | grep 2929
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:29291             0.0.0.0:*                   LISTEN      2990/ssh
tcp        0      0 ::1:29291                   :::*                        LISTEN      2990/ssh
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

まず、humi1 の LocalForward は不要だと思います。

ssh humi2 で channel_setup_fwd_listener: cannot listen to port: 55551 が出る場合には、netstat -nap とかで devPC 上で 55551 を Listen しているプロセスを確認しましょう。
そのプロセスを kill するか、他のポートを使うか処置をします。

ちなみに、本題から少し離れますが、私の環境では似たような設定で同じようなことが実現できていますが、なぜか mysql -P でポートを指定しても、この指定は無視されるようでローカルで動いている mysql につなぎに行きます。
mysql -h localhost -P でも同様です。
mysql -h 127.0.0.1 -P でようやく期待した動きになったことがあります。
ご参考まで。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/27 13:38

    横から、本題から逸れた部分に対してですが...

    mysql コマンドは、接続先がlocalhost の場合、接続先にソケット接続を使う仕様になっていますので、ポート指定は無視されます。( --protocol=TCP を指定すれば、ポートの指定も有効になります。)

    IPアドレス指定の場合は、TCP 接続になるので、ポートの指定も有効になります。

    キャンセル

  • 2018/10/27 13:50

    CHERRYさん、コメントありがとうございます。もともとそのような仕様なのですね。

    というわけで、接続検証の際はご注意ください。
    掲載されている
    root@devPC ~# mysql -u user -ppassword -P55552
    ERROR 1045 (28000): Access denied for user 'user'@'p
    という形式だとトンネル設定がうまくいっていても接続できません。

    キャンセル

  • 2018/10/27 14:00

    一応、リファレスンスとしては、 https://dev.mysql.com/doc/refman/5.6/ja/connecting.html の以下の部分かな。

    > Unix では、MySQL プログラムはホスト名 localhost を、ほかのネットワークベースのプログラムと比較して想定されるのとはおそらく異なる、特別な方法で扱います。localhost への接続で、MySQL プログラムは Unix ソケットファイルを使用してローカルサーバーに接続しようとします。これは、ポート番号を指定するために --port または -P オプションが与えられた場合にも生じます。クライアントがローカルサーバーに TCP/IP 接続を行うことを保証するには、--host または -h を使用して、ホスト名の値 127.0.0.1、またはローカルサーバーの IP アドレスまたは名前を指定します。--protocol=TCP オプションを使用して、localhost に対しても、接続プロトコルを明示的に指定することもできます。

    キャンセル

  • 2018/10/27 18:49 編集

    お二方ともありがとうございました。

    humi1 の LocalForward は不要で、
    mysql -u user -ppassword -P55551 -h 127.0.0.1
    とすれば、DBにアクセスできました!
    mysql -u user -ppassword -P55551 -h localhost
    ができないなんて、罠ですね。

    bind: Cannot assign requested address については、
    LocalForward 55551 1.1.1.13:3306

    LocalForward 127.0.0.1:55551 1.1.1.13:3306
    にすると、IPv4を指定できたみたいですが、
    LocalForward localhost:55551 1.1.1.13:3306
    では、指定できないようです。これも罠ですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る