透過 MySQL Workbench 的 SSH 隧道

透過 MySQL Workbench 的 SSH 隧道

我的新生產伺服器只能透過 ssh 雙隧道可見。我能到達目標主機在 Ubuntu 14.04 控制台上,只需執行命令ssh targetHost,而不是在遠端電腦上執行 mysql cli,但我想透過 gui Workbench 存取 MySQL db。如何在Workbench中設定連線來實現呢?

我的.ssh/配置:

Host targetHost,  firewallHost
    User username
    IdentityFile /home/michalszulc/.ssh/id_rsa

Host targetHost
    proxycommand ssh -W %h:%p firewallHost

Host firewallHost
    hostname firewallHost.example.com
    port 2201
    passwordauthentication no
    controlmaster auto
    controlpath ~/

Host targetHost
    Hostname 123.123.123.123

答案1

過程很簡單。建立新連線並選擇連線方法 Standard TCP/IP over SSH。提供隧道的SSH伺服器的值:

  • SSH主機名稱:建立SSH隧道的伺服器位址(SSH伺服器和MySQL可以是相同主機或相同網路位址,這取決於設定)。
  • SSH 使用者名稱:SSH 伺服器中的使用者名稱。
  • SSH 密碼:SSH 伺服器中的使用者密碼(如果設定了模式密碼驗證)。
  • SSH 金鑰檔案:包含用於在伺服器上進行驗證的私​​鑰的檔案(如果您PasswordAuthentication在 SSH 伺服器上啟用了策略,則其值為no)。

連接 DBMS MySQL 的值。

  • MySQL 主機名稱:MySQL 運作服務的主機相對於 SSH 伺服器的位址。如果 SSH 和 MySQL 服務運行在同一台主機上,則東向值為 localhost 或 127.0.0.1,因為一旦建立通過隧道的連接,MySQL 服務就會偵聽來自 localhost 的請求(取決於指令中設定的值)bind_adressMySQL )。
  • MySQL Server Port:連接MySQL的端口,一般為3306。
  • MySQL 使用者名稱:連接MySQL 的使用者名,即它必須是MySQL 的有效使用者並被授權從隧道連接。
  • 預設架構:相當於 SQL USE。

答案2

如果我們的設定正確的話,還不清楚。所以我假設firewallhost主機可以從您的工作台存取。因此需要在此伺服器上建立一個開放端口,以便可以存取防火牆後面的「真實」mysql 伺服器。

如果您在firewallhost.這是這樣完成的firewallhost

ssh -L localhost:33060:localhost:3306 someshelluser@databasehost

這會在連接埠 33060(或您在此處擁有的任何可用連接埠)上為 localhost(在任何網路卡上都不是公開的)建立一個 openssh 隧道,firewallhost該隧道又會透過該隧道與3306 連接埠(同樣在localhost 上但在電腦上databasehost)連接,因為它已連接作為 someshelluser 上的databasehost.

現在您可以連接工作台:

  • SSH 主機名稱:firewallhost
  • SSH 用戶名:某個有效用戶firewallhost
  • SSH 密碼:您某位有效使用者的通行證
  • SSH 金鑰檔案:替代金鑰文件

  • MySQL 主機名稱:(當我們在localhostlocalhost上開啟隧道時)firewallhost

  • MySQL伺服器連接埠:33060
  • MySQL用戶名:你的mysql用戶

要使 ssh 隧道持久存在,您可以使用密鑰檔案(用於存取)和透過螢幕的分離進程來firewallhost啟動它,如下所示。databasehost這可以放入您的 rc.local 或任何您在 上使用的內容firewallhost

screen -d -m /usr/bin/ssh -v -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "BatchMode=yes" -i /your/.ssh/ssh_host_dsa_key -q -L locahost:33060:localhost:3306 someshelluser@databasehost

您必須「想像」這樣的 ssh 隧道可以透過在您建立該 ssh 隧道的電腦上開啟一個「新」端口,將任何端口流從一台電腦「傳輸」到另一台電腦(此處firewallhost)。這甚至可以在 的公共網路卡上完成firewallhost,但您希望它在本機上,因為您不想將您的 mysql 連接埠暴露給公眾;)

更新:

好的,由於您無法直接存取firewallhost建立持久隧道,請嘗試其他方法。您說您可以使用 proxycommand 連線。當您內聯編寫它而不是作為“-o”選項時,我假設您的 ssh_config 中有這個。

如果你的 ssh_config 看起來像這樣:

Host server
    Hostname mysqlserver.example.org
    ProxyCommand ssh -W %h:%p firewallhost.example.org

然後你可以嘗試以下操作'SSH 主機名稱' 在工作台中。有機會的話,你可以用它來提供 ssh 參數。我沒有測試它,但應用程式將主機名字段的內容直接傳遞到 ssh 呼叫中並不罕見。

SSH 主機名稱:

-o ProxyCommand="ssh -W %h:%p firewallhost.example.org" mysqlserver.example.org

這應該會讓你透過你的防火牆主機進入你的mysql伺服器。從這裡您可以使用 mysql 設置,就好像您將按照工作台的預期直接連接到 mysqlserver 一樣。

更新2:

如您所寫,您位於同一台機器(Ubuntu 14)上,能夠連接到後面的 mysql 資料庫firewallhost,您應該只使用在控制台上使用的工作台中的值。如果您使用 .ssh/config 所使用的相同使用者呼叫工作台,則工作台將使用您的 .ssh/config。

最後:

SSH 主機名稱只是“targetHost”,其中 .ssh/config 中的代理命令將透過“firewallHost”將您傳送到“targetHost”。 SSH 使用者名稱是「使用者名稱」(再次來自 .ssh/config)。

MySQL 主機名稱應該是 localhost 和連接埠 3306 - 這應該與您在問題中所寫的透過 ssh 存取「targetHost」時所做的完全相同。因為工作台將在(!)之後使用這些值,它透過 ssh 連接。

相關內容