Mysql

遠端連接 MySQL

  • October 12, 2017

我想使用命令提示符和以下命令從我的 Windows 機器連接到託管在 Linux 機器上的 MySQL 伺服器:

prompt>mysql -u root -p -h remote_hostname

連接、埠、使用者帳戶和憑據都很好。但它拋出以下錯誤:

ERROR 1130 (HY000): Host ‘my_hostname’ is not allowed to connect to this MySQL server

我想知道是否可以從 Windows 命令提示符與 Linux Shell 進行通信?還是根本就沒有提示連接到 Linux Shell 以進行任何遠端操作的設計?還是在 MySQL 的情況下是特殊的。

我觀察到我可以從 Linux 連接到 Windows,但是當我像上面解釋的那樣嘗試時,反過來是不可能的。

有人知道對此的理論解釋嗎?

您說“連接、埠、使用者帳戶和憑據都很好。”,但我有疑問。

從文件中提到確切的錯誤:

$$ The error $$當您嘗試從執行 MySQL 伺服器的主機以外的主機連接時發生,這意味著使用者表中沒有與客戶端主機匹配的 Host 值的行

在 Linux MySQL 伺服器上的 mysql.user 表中查找具有 Windows 機器的使用者/主機組合的使用者條目:

SELECT User, Host FROM mysql.user WHERE User='my_user' AND Host='windows_ip';

如果這不返回結果,則需要添加該使用者。如果它確實返回結果,您可以將其添加到您的問題中嗎?

晚會晚了 5 年,但這裡出現的唯一準確答案讓我感到不滿意。

原因是評論中的 OP 詢問“如果我必須指定一個 IP 地址來連接**,**使用萬用字元“%”創建使用者有什麼意義?我沒有限制伺服器允許來自指定主機的連接反對使用者可以從任何地方進行虛擬連接的給定特權?”

關於綁定地址的目的以及連接 FROM 與連接 TO 之間的區別等幾個問題似乎存在一些混淆。

從文件中……“MySQL 伺服器在單個網路套接字上偵聽 TCP/IP 連接。這個套接字綁定到一個地址,但一個地址可以映射到多個網路介面。”

簡單地說,伺服器綁定一個且只有一個地址。客戶端只能在伺服器正在偵聽連接嘗試的地方進行連接。客戶端連接伺服器。伺服器接收來自客戶端的連接嘗試。如果客戶端client.com 連接,則伺服器必須允許該主機 - client.com - 在授權表中,如果連接成功。

這就是為什麼德里克·唐尼說:

在 Linux MySQL 伺服器上的 mysql.user 表中查找具有 Windows 機器的使用者/主機組合的使用者條目:

從 mysql.user 選擇使用者、主機 WHERE User=‘my_user’ AND Host=‘windows_ip’;

如果這不返回結果,則需要添加該使用者。

所以“lo”是一個介面,它是與 localhost/127.0.0.1 關聯的介面。localhost 映射到 /etc/hosts 中的 127.0.0.1 - 儘管一些發行版添加了一些我不會在這裡介紹的新結構。eth0 曾經是一個乙太網介面,現在它類似於 enp5s0(至少在 ubuntu 上)。該介面與您的其他地址相關聯,例如 192.168.0.2 或 101.25.45.107,並且通常與您的物理網路介面卡 (NIC) 相關聯。

當客戶端想要連接時,它指定它想要連接到的位置 - 什麼地址和埠。伺服器正在監聽綁定地址和配置的埠(預設為 3306)。由於一個地址可以映射到多個網路介面,因此伺服器可以偵聽與所述介面相關聯的多個 IP 地址。

接下來是授權表。授權表指定允許連接的客戶端 - 這就是您添加客戶端的位置。如果只允許 user@localhost,那麼遠端連接將失敗。OP 表示他嘗試了 user@% 作為測試,因此這表明 OP 的問題在其他地方。我不是安全專家,但我認為這可能是安全的(作為使用者密碼安全),只要您不使用 root 或其他特權使用者作為您的“使用者”。否則,有人可以遠端攻擊您的帳戶。如果您有安全意識,最好指定允許的特定主機。

我猜您的表中有一個匿名使用者,您的客戶首先匹配該使用者。解決方案:刪除該使用者。使用“SELECT User, Host FROM mysql.user”查看表中有哪些使用者。你可能會對你所看到的感到驚訝。確保您了解表格中每一行的原因。

在這一點上,這篇文章太長了,所以請在別處尋找以保護您的安裝。這是一個很好的起點,雖然現在已經 5 年了,但它當然比 OP 使用的版本更高:https ://dev.mysql.com/doc/refman/5.7/en/default-privileges.html 它提供有關上述匿名使用者的更多詳細資訊。下面從https://dev.mysql.com/doc/refman/5.7/en/server-options.html複製

MySQL 伺服器在單個網路套接字上偵聽 TCP/IP 連接。此套接字綁定到單個地址,但一個地址可以映射到多個網路介面。要指定地址,請在伺服器啟動時使用 –bind-address=addr 選項,其中 addr 是 IPv4 或 IPv6 地址或主機名。如果 addr 是主機名,則伺服器將該名稱解析為 IP 地址並綁定到該地址。

伺服器處理不同類型的地址如下:

If the address is *, the server accepts TCP/IP connections on all server host IPv6 and IPv4 interfaces if the server host supports IPv6,

否則接受所有 IPv4 地址上的 TCP/IP 連接。使用此地址可允許所有伺服器介面上的 IPv4 和 IPv6 連接。此值為預設值。

If the address is 0.0.0.0, the server accepts TCP/IP connections on all server host IPv4 interfaces.

If the address is ::, the server accepts TCP/IP connections on all server host IPv4 and IPv6 interfaces.

If the address is an IPv4-mapped address, the server accepts TCP/IP connections for that address, in either IPv4 or IPv6 format.

例如,如果伺服器綁定到 ::ffff:127.0.0.1,客戶端可以使用 –host=127.0.0.1 或 –host=::ffff:127.0.0.1 進行連接。

If the address is a “regular” IPv4 or IPv6 address (such as 127.0.0.1 or ::1), the server accepts TCP/IP connections only for that IPv4 or IPv6 address. 

如果您打算將伺服器綁定到特定地址,請確保 mysql.user 授權表包含具有管理權限的帳戶,您可以使用該帳戶連接到該地址。否則,您將無法關閉伺服器。例如,如果將伺服器綁定到 *,則可以使用所有現有帳戶連接到它。但是,如果您將伺服器綁定到 ::1,它只接受該地址上的連接。在這種情況下,首先確保 ‘root’@’::1’ 帳戶存在於 mysql.user 表中,以便您仍然可以連接到伺服器以將其關閉。

引用自:https://dba.stackexchange.com/questions/25675