通過 SSH 隧道連接時出現 MySQL 訪問被拒絕錯誤
幾個月來,我一直通過 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
即使其他選項通常預設為某些其他協議,該選項也使您能夠建立特定類型的連接。