通过SSH隧道访问MySQL

背景

MySQL 服务暴露在公网会遭受很多自动化探测软件的攻击,此时可以考虑使用端口映射方式将流程通过SSH隧道进行。

方案一

通过SSH隧道连接到服务器后,相当于进入服务器内网范围,再访问服务器上MySQL监听的端口。

图形化客户端连接

比如在Navicat中使用这种方式,需要在连接中配置隧道信息。

navicat ssh config

编程语言客户端连接

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 密码即可建立隧道
updatedupdated2026-03-252026-03-25