我的新生產伺服器只能透過 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_adress
MySQL )。 - 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 主機名稱:(當我們在localhost
localhost
上開啟隧道時)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 連接。