Hướng dẫn phương pháp an toàn nhất để truy cập MySQL server từ xa: SSH Tunnel (Port Forwarding) – không mở cổng 3306 ra Internet.
Tại sao không mở cổng 3306 công khai?
- MySQL truyền dữ liệu plaintext (mặc định không TLS) – dễ nghe lén.
- Tấn công brute-force, exploit lỗ hổng MySQL.
- Vi phạm nguyên tắc least privilege (ít đặc quyền nhất).
Tạo SSH Tunnel
Trên máy khách (local), chạy:
ssh -L 6666:localhost:3306 user@remoteserver.net
- -L 6666:localhost:3306: Forward cổng local 6666 → localhost:3306 trên server (localhost ở đây nghĩa là trên server).
- user@remoteserver.net: User SSH và địa chỉ server.
- Port 6666 tuỳ chọn (tránh xung đột, >1024 không cần root).
Nhập mật khẩu SSH → tunnel thiết lập. Giữ terminal này mở.
Kết nối MySQL Client
Cấu hình client (DBeaver, MySQL Workbench, TablePlus, HeidiSQL, cli...):
- Host:
127.0.0.1(KHÔNG dùnglocalhost– một số client dùng socket file thay vì TCP). - Port: 6666 (cổng local đã forward).
- User/Password: Tài khoản MySQL trên server từ xa.
Tùy chọn SSH hữu ích
| Tùy chọn | Chức năng |
|---|---|
| -N | Không mở shell, chỉ forward port (gọn cho script/background) |
| -f | Chạy background sau khi xác thực |
| -C | Nén dữ liệu (hữu ích mạng chậm) |
| -o ServerAliveInterval=60 | Gửi keepalive 60s – tránh timeout firewall/NAT |
| -o ExitOnForwardFailure=yes | Thoát nếu không forward được port |
Chạy nền (background) vĩnh viễn – systemd service
Tạo /etc/systemd/system/mysql-tunnel@.service:
[Unit]
Description=MySQL SSH Tunnel to %i
After=network.target
[Service]
User=youruser
ExecStart=/usr/bin/ssh -N -L 6666:localhost:3306 -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes user@%i
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Kích hoạt: systemctl enable --now mysql-tunnel@remoteserver.net
Bảo mật bổ sung
- Dùng SSH Key thay mật khẩu (ssh-keygen, ssh-copy-id).
- Giới hạn user SSH chỉ cho forwarding: Tạo user chỉ có shell
/bin/false, thêmno-pty,no-X11-forwarding,permitopen="localhost:3306"trong~/.ssh/authorized_keys. - Bật MySQL TLS/SSL (REQUIRE SSL cho user) – lớp bảo vệ thứ 2.
- Firewall server: Chỉ cho SSH từ IP tin cậy, chặn 3306 từ ngoài.