Ubuntu 預設 MySQL 僅監聽 127.0.0.1,且 root 帳號採用 auth_socket 插件(僅允許本地系統 root 用戶免密登入),導致遠程連接雙重受阻。本文提供從「進不去」到「安全遠程訪問」的標準化運維流程。
# 1. 讀取 Debian 維護帳號憑證(安裝時自動生成) sudo cat /etc/mysql/debian.cnf # user = debian-sys-maint # password = xxxxxxxxxxxxxxxx # 2. 使用維護帳號登入 mysql -u debian-sys-maint -p'xxxxxxxxxxxxxxxx' # 3. 修改 root 密碼並切換認證插件 USE mysql; -- 8.0 預設 caching_sha2_password,遠程連接建議改 mysql_native_password 兼容性更好 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass#2024'; FLUSH PRIVILEGES; QUIT;
# 編輯配置 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 找到 bind-address,修改為: bind-address = 0.0.0.0 # 監聽所有介面 # 或指定內網 IP:bind-address = 192.168.1.100 # 重啟生效 sudo systemctl restart mysql # 驗證 ss -tlnp | grep 3306 # 應顯示 0.0.0.0:3306 或 192.168.1.100:3306
mysql -uroot -p'NewStrongPass#2024' -- 方案 A:專用遠程帳號(推薦,最小權限原則) CREATE USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'AppPass#2024'; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%'; -- 方案 B:root 遠程(僅內網受信環境,生產嚴禁) CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'NewStrongPass#2024'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
# UFW(Ubuntu 預設) sudo ufw allow from 192.168.1.0/24 to any port 3306 comment 'MySQL Internal' sudo ufw enable sudo ufw status numbered # 或 iptables 直接操作 sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT sudo iptables-save > /etc/iptables/rules.v4
阿里雲/騰訊雲/AWS/Azure 控制台 → 安全組/安全組規則 → 入站規則:
協議:TCP、端口:3306、來源:具體應用服務器 CIDR(嚴禁 0.0.0.0/0)
# 應用服務器測試 mysql -h 192.168.1.100 -u app_user -p'AppPass#2024' -e "SELECT VERSION();" # 或使用 GUI 工具 # Host: 192.168.1.100, Port: 3306, User: app_user, Password: AppPass#2024
root@'%',僅保留 root@'localhost'。GRANT ALL ON *.*。REQUIRE SSL 或配置 ssl_ca/ssl_cert/ssl_key。max_connect_errors=100000、connect_timeout=10 防暴力破解。SELECT User, Host, plugin FROM mysql.user; 審計帳號。ProxySQL 做連接池與讀寫分離,隱藏後端真實 IP。Ubuntu MySQL 遠程訪問的核心邏輯是:認證插件兼容 → 監聽地址放開 → 賬號授權最小化 → 雙層防火牆(主機+雲)精準放行。按此流程操作,兼顧開發便利與生產安全。