MySQL預設並不允許遠端裝置的連線,而為了要能夠讓它允許遠端連線,就必須要進行一些額外的設定。
執行以下指令,可以查看目前MySQL所監聽的連接埠。
ss
指令可以顯示出Socket相關的資訊。-l
參數可以只顯示正在監聽中的連線。若使用ss
指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t
參數可以只顯示TCP連線。-n
參數可以讓連接埠數字直接被輸出,而不是用一個名稱代替。-p
參數可以顯示佔用連線的行程。
如上圖,可以看到MySQL目前只有監聽127.0.0.1
也就是「loopback」這個網路介面。所以目前的MySQL是無法直接透過遠端的方式連入的。
讓MySQL監聽其它網路介面
MySQL的主設定檔路徑為/etc/mysql/my.cnf
或是/etc/my.cnf
內,在設定檔中可能會看到其又引入了其它設定檔。以Ubuntu Server官方軟體源的MySQL來說,調整MySQL監聽的網路介面的設定檔路徑是/etc/mysql/mysql.conf.d/mysqld.cnf
。
在設定檔中,[mysqld]
區塊下,bind-address
欄位所設定的IP,即為MySQL所監聽的網路介面。
我們只能選擇一個網路介面的IP來用,例如:
bind-address = 192.168.56.103
如果要綁定所有網路介面,那就把bind-address
欄位值設成0.0.0.0
吧!如果要綁定多個網路介面,也是設成0.0.0.0
,再用防火牆去擋住其它不需要用到的網路介面。
然後筆者會建議,若沒有特殊需求的話,同樣也是在[mysqld]
區塊下,將skip-name-resolve
這個項目加上去,這樣可以避免遠端連入的時候DNS反解所造成的延遲與失敗時所出現的問題。
設定完成之後,使用以下指令重新執行MySQL的服務,新設定就會套用了。
當然,防火牆也記得要設定才行。MySQL預設的連接埠是3306
,iptables規則可以這樣設定:
以上指令會對所有網路介面允許連接埠3306的TCP連入,如果要限定網路介面的話,可以再加上-i
參數,後面接上要限定的網路介面名稱。
另外還可以參考這篇文章來永久保存iptables的設定。
建立可被遠端登入的使用者
MySQL的使用者可以限定其所屬主機,換句話說就是能連進來登入的主機。在一開始建立使用者的時候就要進行限定了。
例如以下SQL敘述,可以建立出只能在本地端(localhost)登入的使用者:
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
而以下SQL敘述,可以建立出從192.168.100.1
主機登入的使用者:
CREATE USER 'username'@'192.168.100.1' IDENTIFIED BY 'password';
以下SQL敘述,則可以建立出從任意主機都能登入的使用者:
CREATE USER 'username'@'%' IDENTIFIED BY 'password';