背景
将 MySQL 服务暴露在公网会遭受很多自动化探测软件的攻击,此时可以考虑使用端口映射方式将流程通过SSH隧道进行。
方案一
通过SSH隧道连接到服务器后,相当于进入服务器内网范围,再访问服务器上MySQL监听的端口。
图形化客户端连接
比如在Navicat中使用这种方式,需要在连接中配置隧道信息。

编程语言客户端连接
以 python 为例(下面代码由 AI 生成):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
from sshtunnel import SSHTunnelForwarder
import pymysql
# ========== 这部分 = 你在 Navicat 里填的 SSH 配置 ==========
SSH_HOST = "服务器公网IP"
SSH_PORT = 22
SSH_USER = "服务器用户名"
SSH_PASSWORD = "服务器密码"
# ========== 这部分 = Navicat 里的 MySQL 配置 ==========
MYSQL_HOST = "127.0.0.1" # 必须写本地!
MYSQL_PORT = 3306
MYSQL_USER = "mysql用户名"
MYSQL_PWD = "mysql密码"
MYSQL_DB = "数据库名"
# ============== 建立 SSH 隧道(Python 自动做)==============
with SSHTunnelForwarder(
(SSH_HOST, SSH_PORT),
ssh_username=SSH_USER,
ssh_password=SSH_PASSWORD,
remote_bind_address=(MYSQL_HOST, MYSQL_PORT)
) as server:
# 连接 MySQL(就像连接本地一样)
conn = pymysql.connect(
host='127.0.0.1',
port=server.local_bind_port, # 隧道自动分配的端口
user=MYSQL_USER,
password=MYSQL_PWD,
database=MYSQL_DB
)
# 测试
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
print("MySQL 版本:", cursor.fetchone()[0])
conn.close()
|
方案二
通过SSH隧道将服务器端口映射到开发机本地,开发机连接本地映射端口连接MySQL服务。
1
|
ssh -L 3307:127.0.0.1:3306 用户名@服务器公网IP -p 22
|
命令解释:
- -L 3307:本地监听 3307 端口(可自定义)
- 127.0.0.1:3306:服务器本地的 MySQL 地址和端口
- 输入服务器 SSH 密码即可建立隧道