MySQL thường chỉ nhận kết nối từ máy chủ đang cài đặt cơ sở dữ liệu. Nếu cần quản trị database bằng công cụ trên máy cá nhân hoặc để ứng dụng ở máy chủ khác truy cập, bạn cần cấu hình kết nối MySQL từ xa. Tuy nhiên, mở cổng cơ sở dữ liệu ra Internet mà không giới hạn nguồn truy cập có thể khiến VPS trở thành mục tiêu dò quét và tấn công.
Bài viết hướng dẫn các bước mở MySQL remote access trên VPS theo hướng an toàn: xác định phương thức kết nối, cấu hình MySQL, giới hạn địa chỉ IP bằng tường lửa và kiểm tra quyền tài khoản. Tên dịch vụ, đường dẫn cấu hình và lệnh có thể khác đôi chút tùy hệ điều hành hoặc phiên bản MySQL/MariaDB, vì vậy hãy kiểm tra hệ thống của bạn trước khi thực hiện.
Chọn cách kết nối và chuẩn bị trước
Quản trị viên kết nối an toàn đến cơ sở dữ liệu trên VPS
Trước tiên, hãy xác định máy nào cần truy cập database và mục đích sử dụng. Có hai cách phổ biến:
Kết nối trực tiếp: máy khách kết nối đến IP của VPS qua cổng MySQL, thường là TCP 3306. Cách này thuận tiện khi ứng dụng chạy trên một máy chủ khác, nhưng phải giới hạn nguồn truy cập bằng địa chỉ IP và tường lửa.
SSH tunnel: lưu lượng MySQL đi bên trong kết nối SSH. Đây thường là lựa chọn phù hợp để quản trị từ máy cá nhân, đặc biệt khi IP máy cá nhân thay đổi hoặc bạn không muốn công khai cổng 3306.
Trước khi cấu hình, hãy chuẩn bị quyền quản trị VPS, địa chỉ IP công khai hoặc IP riêng của máy khách, tên database và tài khoản cần dùng. Nếu IP máy khách thay đổi thường xuyên, hãy cân nhắc VPN hoặc SSH tunnel thay vì cho phép một dải IP rộng.
Sao lưu cấu hình hiện tại và ghi lại các thay đổi. Nếu VPS đang chạy dịch vụ quan trọng, hãy thực hiện trong thời điểm phù hợp và đảm bảo bạn vẫn có thể đăng nhập bằng SSH. Không dùng tài khoản root của MySQL cho ứng dụng hoặc công cụ quản trị từ xa.
Cấu hình MySQL nhận kết nối từ xa
Cấu hình MySQL trên VPS để cho phép kết nối có kiểm soát
MySQL cần lắng nghe trên giao diện mạng mà máy khách có thể truy cập. Trên nhiều bản Linux, cấu hình nằm trong một trong các đường dẫn như /etc/mysql/mysql.conf.d/mysqld.cnf hoặc /etc/mysql/mariadb.conf.d/50-server.cnf. Hãy tìm tệp cấu hình máy chủ, thường có phần [mysqld], rồi kiểm tra dòng bind-address.
Nếu chỉ sử dụng SSH tunnel, nên giữ MySQL lắng nghe trên localhost, chẳng hạn:
bind-address = 127.0.0.1
Với kết nối trực tiếp, có thể đặt MySQL lắng nghe trên IP giao diện mạng cần dùng. Nếu chưa thể xác định giao diện phù hợp, 0.0.0.0 cho phép lắng nghe trên mọi giao diện, nhưng chỉ nên dùng khi tường lửa đã được cấu hình giới hạn chặt chẽ. Không xem việc đổi bind-address là đủ để bảo mật database.
Lưu tệp cấu hình rồi khởi động lại dịch vụ. Tên dịch vụ có thể là mysql hoặc mariadb:
sudo systemctl restart mysql
sudo systemctl status mysql
Nếu VPS dùng MariaDB, thay mysql bằng mariadb khi cần. Kiểm tra trạng thái trước khi tiếp tục; nếu dịch vụ không khởi động, xem nhật ký bằng sudo journalctl -u mysql -n 50 --no-pager hoặc tên dịch vụ tương ứng. Lỗi cú pháp hay đặt sai vị trí cấu hình có thể khiến MySQL không chạy.
Tiếp theo, tạo tài khoản riêng và giới hạn tài khoản theo IP máy khách. Đăng nhập MySQL bằng tài khoản quản trị nội bộ, sau đó chạy ví dụ dưới đây; thay appdb và 203.0.113.25 bằng database, địa chỉ thật của bạn:
CREATE USER 'appuser'@'203.0.113.25' IDENTIFIED BY 'ThayBangMatKhauDaiVaNgauNhien';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'203.0.113.25';
Địa chỉ 203.0.113.25 thuộc dải IP dùng trong tài liệu minh họa, không phải IP thật để sử dụng. Chỉ cấp quyền ứng dụng thực sự cần; không cấp ALL PRIVILEGES nếu không có lý do rõ ràng. Nếu tài khoản chỉ cần đọc dữ liệu, có thể chỉ cấp quyền SELECT. Tránh tạo tài khoản dạng 'appuser'@'%', vì ký tự % cho phép kết nối từ mọi địa chỉ phù hợp với các quy tắc xác thực khác.
MySQL kiểm tra cả tên người dùng lẫn máy khách được khai báo trong phần host của tài khoản. Vì vậy, tạo tài khoản cho localhost không đồng nghĩa tài khoản đó được phép đăng nhập từ IP bên ngoài. Hãy nhập đúng IP nguồn mà VPS nhìn thấy; nếu IP đi qua NAT, VPN hoặc mạng trung gian, địa chỉ này có thể khác IP hiển thị trên máy người dùng.
Giới hạn truy cập bằng tường lửa
Tường lửa chỉ cho phép địa chỉ IP tin cậy truy cập MySQL
Ngay cả khi tài khoản MySQL đã giới hạn host, hãy chặn cổng 3306 với mọi nguồn không cần thiết. Nếu sử dụng UFW, có thể chỉ cho phép IP máy khách cụ thể:
sudo ufw allow from 203.0.113.25 to any port 3306 proto tcp
sudo ufw status numbered
Thay IP minh họa bằng IP nguồn thực tế. Không dùng quy tắc mở cổng cho toàn Internet như ufw allow 3306/tcp nếu không có nhu cầu và biện pháp kiểm soát phù hợp. Nếu đã tạo quy tắc mở rộng trước đó, hãy xóa quy tắc đó sau khi xác định chính xác số thứ tự bằng ufw status numbered.
Ngoài tường lửa trên hệ điều hành, VPS có thể có tường lửa hoặc bộ lọc mạng ở lớp quản trị hạ tầng. Hãy kiểm tra cả hai lớp, chỉ mở TCP 3306 cho đúng IP cần thiết và tránh mở thêm dải cổng không liên quan. Nếu máy khách có IP động, cập nhật quy tắc khi IP thay đổi; không khắc phục bằng cách cho phép mọi địa chỉ.
Với SSH tunnel, thường không cần mở cổng 3306 ra Internet. Giữ MySQL bind vào 127.0.0.1 và chỉ cho phép SSH từ nguồn tin cậy. Từ máy cá nhân, tạo tunnel như sau:
ssh -L 3307:127.0.0.1:3306 user@IP_VPS
Giữ phiên SSH đang hoạt động, rồi cấu hình phần mềm MySQL trên máy cá nhân kết nối đến 127.0.0.1, cổng 3307. Kết nối được chuyển tiếp qua SSH đến MySQL trên VPS. Cách này giảm việc phơi bày cổng database, nhưng vẫn cần bảo vệ SSH bằng xác thực phù hợp, cập nhật hệ thống và giới hạn tài khoản đăng nhập.
Kiểm tra kết nối và xử lý lỗi thường gặp
Từ máy khách, thử kết nối trực tiếp bằng lệnh sau nếu bạn đã chọn phương thức mở cổng:
mysql -h IP_VPS -P 3306 -u appuser -p appdb
Nhập mật khẩu khi được yêu cầu, không đặt mật khẩu trực tiếp trong dòng lệnh vì có thể lưu lại trong lịch sử shell. Nếu dùng SSH tunnel, thay IP_VPS bằng 127.0.0.1 và cổng 3306 bằng 3307.
Nếu không kết nối được, kiểm tra lần lượt:
MySQL có đang chạy không? Xem trạng thái dịch vụ và nhật ký để phát hiện lỗi cấu hình.
MySQL có lắng nghe trên giao diện cần thiết không? Kiểm tra bind-address và cổng đang lắng nghe bằng sudo ss -lntp | grep 3306.
Tường lửa có cho phép đúng nguồn không? Kiểm tra UFW, tường lửa ở lớp mạng và IP công khai của máy khách.
Tài khoản có đúng host và quyền không? Kiểm tra tài khoản được tạo cho IP kết nối, database đích và quyền cần thiết.
Thông tin đăng nhập có chính xác không? Phân biệt lỗi xác thực với lỗi hết thời gian chờ hoặc không thể định tuyến đến máy chủ.
Thông báo Connection timed out thường gợi ý kết nối bị chặn hoặc không đến được VPS; Access denied thường liên quan đến tài khoản, mật khẩu, host hoặc quyền. Đừng xử lý bằng cách mở quyền rộng hơn ngay lập tức. Hãy xác định nguyên nhân từ thông báo lỗi và nhật ký trước.
Tăng cường bảo mật MySQL VPS lâu dài
Cấu hình ban đầu chỉ là một phần của bảo mật MySQL VPS. Hãy duy trì các nguyên tắc sau:
Dùng mật khẩu dài, duy nhất và lưu trong trình quản lý mật khẩu hoặc kho bí mật của ứng dụng; không đưa mật khẩu vào mã nguồn công khai.
Tạo tài khoản riêng cho từng ứng dụng hoặc người dùng, chỉ cấp quyền trên database cần thiết và thu hồi quyền khi không còn sử dụng.
Cập nhật hệ điều hành, MySQL/MariaDB và phần mềm kết nối; theo dõi nhật ký đăng nhập, dung lượng và hoạt động bất thường.
Sao lưu database định kỳ, lưu bản sao tách biệt khỏi VPS và thử khôi phục để đảm bảo bản sao dùng được.
Nếu kết nối trực tiếp đi qua mạng không tin cậy, cấu hình TLS cho MySQL và xác minh chứng chỉ ở phía máy khách. Chỉ thêm yêu cầu REQUIRE SSL cho tài khoản sau khi đã cấu hình, kiểm tra TLS đầy đủ để tránh tự khóa kết nối.
Định kỳ rà soát quy tắc tường lửa, tài khoản và quyền. Xóa IP không còn sử dụng, tài khoản thử nghiệm và quyền cấp tạm.
Không cần để MySQL công khai chỉ vì muốn quản trị database thuận tiện. SSH tunnel hoặc VPN thường giúp giảm bề mặt tấn công, còn kết nối trực tiếp cần được giới hạn chính xác ở cả tài khoản MySQL lẫn tường lửa.
Kết luận
Để kết nối MySQL từ xa trên VPS an toàn, hãy chọn phương thức phù hợp, cấu hình bind-address có chủ đích, tạo tài khoản theo IP cụ thể và chỉ mở cổng cho nguồn cần thiết. Với nhu cầu quản trị, SSH tunnel là lựa chọn đáng cân nhắc để tránh công khai cổng 3306. Sau khi thiết lập, hãy kiểm tra kết nối, theo dõi nhật ký và rà soát quyền định kỳ.
Nếu cần môi trường máy chủ để triển khai ứng dụng và cơ sở dữ liệu, bạn có thể tham khảo các gói VPS của VibeVPS, gồm VPS AMD EPYC Gen 3 và VPS Platinum Gen 2 từ 81.000đ/tháng. Hãy chọn cấu hình theo nhu cầu thực tế và chủ động áp dụng các bước bảo mật phù hợp.
Hướng dẫn dùng mysqldump để xuất, nén và khôi phục cơ sở dữ liệu MySQL bằng các lệnh thực tế. Bạn cũng sẽ biết cách sao lưu từ xa và kiểm tra tệp dump.