Mysql

通過 SSH 隧道連接時出現 MySQL 訪問被拒絕錯誤

  • May 11, 2016

幾個月來,我一直通過 SSH 隧道連接到在我們的本地測試伺服器上執行的 MySQL 實例,沒有任何問題。突然之間,我無法想到任何更改,伺服器已開始拒絕來自 Sequel Pro 的登錄嘗試,並出現以下錯誤:

無法連接到主機 127.0.0.1,因為訪問被拒絕。

仔細檢查您的使用者名和密碼,並確保允許從您目前的位置進行訪問。

MySQL說:使用者’root’@’localhost’的訪問被拒絕(使用密碼:YES)

當通過 SSH 直接連接到伺服器時,我可以從終端登錄,而不是通過 SSH 隧道。該問題並非特定於 Sequel Pro 或僅是我自己,我在通過 MySQL Workbench 連接時遇到與辦公室其他人相同的錯誤。mysqladmin為了理智,我已經重置了密碼,這絕對不是問題。

當我開始深入研究時,我注意到錯誤將伺服器報告為“localhost”,而不是我在 Sequel Pro 中輸入的“127.0.0.1”。一位朋友建議這可能只是錯誤處理不當,但考慮到 MySQL 中 localhost 和 127.0.0.1 之間的顯著差異,這似乎很奇怪。

為了解決隧道問題,我授予了對 root@% 的訪問權限,以便我可以直接連接。這在大多數情況下都有效,我可以查看表數據,創建新數據庫等。唯一的問題是當我創建使用者時出現錯誤:

使用者 ‘root’@’%’ 的訪問被拒絕(使用密碼:YES)

奇怪的是,使用者實際上是創建的,我認為這只是授權的問題。儘管如此,從終端我可以在以 root 身份登錄時做任何事情。

任何人都可以幫助解釋為什麼隧道連接和(可能)授權命令會收到拒絕訪問錯誤嗎?

作為參考,MySQ 是 5.6.16 版,大部分是預設設置,通過 Homebrew 安裝在 MAC OS X Server 機器上。

更新

以下是目前授予 root 訪問權限的主機列表:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

據我了解,第一行(“%”)真的應該讓其他人變得多餘嗎?

更新 2

修復了贈款問題;root@% 使用者最後沒有被授予額外with grant option的所有權限,所以它可以做除了授予之外的所有事情。仍然很想知道為什麼 SSH 隧道被拒絕。

在 MySQL 中,localhost關鍵字是為使用 MySQL 套接字的連接保留的,您應該使用 ip-address127.0.0.1來連接到 MySQL 網路埠 127.0.0.1 的 TCP 連接。這意味著伺服器必須向特定的使用者授予權限127.0.0.1並且客戶端必須使用-h 127.0.0.1通過隧道而不是連接到本地套接字。

要允許您使用 SSH 埠轉發進行訪問,您需要以下內容:

GRANT SELECT ON *.* TO user@`127.0.0.1`

然後執行

FLUSH PRIVILEGES;

並且可能

FLUSH QUERY CACHE;

如果它仍然不起作用,請重新啟動伺服器程序。

在反向 DNS 查找後的錯誤消息 127.0.0.1 被轉換為localhost使調試變得困難。

正如手冊所描述的:

在 Unix 上,MySQL 程序對主機名 localhost 進行了特殊處理,與其他基於網路的程序相比,這種方式可能與您所期望的不同。對於到 localhost 的連接,MySQL 程序嘗試使用 Unix 套接字文件連接到本地伺服器。即使給出 --port-P選項來指定埠號,也會發生這種情況。要確保客戶端與本地伺服器建立 TCP/IP 連接,請使用--host-h指定主機名值127.0.0.1,或本地伺服器的 IP 地址或名稱。--protocol=TCP您還可以使用該選項顯式指定連接協議,即使對於 localhost 也是如此。例如:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

--protocol即使其他選項通常預設為某些其他協議,該選項也使您能夠建立特定類型的連接。

引用自:https://serverfault.com/questions/614094