MySQL預設並不允許遠端裝置的連線,而為了要能夠讓它允許遠端連線,就必須要進行一些額外的設定。



執行以下指令,可以查看目前MySQL所監聽的連接埠。

sudo netstat -tlnp | grep mysqld

netstat指令可以顯示出網路連線、路由表、介面統計、偽裝連線和多播成員的資訊。-l參數可以只顯示正在監聽中的連線。若使用netstat指令時都沒給任何參數的話,會忽略掉監聽中的連線。-t參數可以只顯示TCP連線。-n參數可以讓IP可以直接被輸出,而不需透過DNS反查其對應的網域名稱。-p參數可以顯示佔用連線的行程。

mysql-remote

如上圖,可以看到MySQL目前只有監聽127.0.0.1也就是「loopback」這個網路介面。所以目前的MySQL是無法直接透過遠端的方式連入的。

讓MySQL監聽其它網路介面

MySQL的主設定檔路徑為/etc/mysql/my.cnf或是/etc/my.cnf內,在設定檔中可能會看到其又引入了其它設定檔。以Ubuntu Server的LAMP來說,調整MySQL監聽的網路介面的設定檔路徑是/etc/mysql/mysql.conf.d/mysqld.cnf

在設定檔中,[mysqld]區塊下,bind-address欄位所設定的IP,即為MySQL所監聽的網路介面。

mysql-remote

我們只能選擇一個網路介面的IP來用,例如:

bind-address        = 192.168.100.102

如果要綁定所有網路介面,那就把bind-address欄位值設成0.0.0.0吧!如果要綁定多個網路介面,也是設成0.0.0.0,再用防火牆去擋住其它不需要用到的網路介面。

然後筆者會建議,若沒有特殊需求的話,同樣也是在[mysqld]區塊下,將skip-name-resolve這個項目加上去,這樣可以避免遠端連入的時候DNS反解所造成的延遲與失敗時所出現的問題。

mysql-remote

設定完成之後,使用以下指令重新執行MySQL的服務,新設定就會套用了。

sudo systemctl restart mysql

mysql-remote

當然,防火牆也記得要設定才行。MySQL預設的連接埠是3306,iptables規則可以這樣設定:

sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

以上指令會對所有網路介面允許連接埠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';