本地端口转发实战:通过 SSH 访问内网数据库的完整操作指南

  • 时间:2025-11-05 16:40 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:本地端口转发实战:通过 SSH 访问内网数据库的完整操作指南 前言:为什么需要本地端口转发访问内网数据库? 你是否遇到过这些场景? 居家办公时,想连接公司内网的 MySQL 数据库(192.168.1.10:3306),但数据库仅允许内网访问,外网无法直接连接;客户现场调试,需要访问甲方内网的 PostgreSQL 服务,却没有 VPN 权限;本地开发环境需连接测试环境的 Redis 数据库

本地端口转发实战:通过 SSH 访问内网数据库的完整操作指南

前言:为什么需要本地端口转发访问内网数据库?

你是否遇到过这些场景?

居家办公时,想连接公司内网的 MySQL 数据库(192.168.1.10:3306),但数据库仅允许内网访问,外网无法直接连接;客户现场调试,需要访问甲方内网的 PostgreSQL 服务,却没有 VPN 权限;本地开发环境需连接测试环境的 Redis 数据库(内网地址),直接访问被防火墙拦截。

此时,SSH 本地端口转发(Local Port Forwarding) 就是最轻量的解决方案 —— 通过一台可 SSH 登录的 “内网跳板机”(如公司公网可达的服务器),将本地端口与内网数据库端口建立加密隧道,所有访问本地端口的请求都会经 SSH 转发到内网数据库,兼具 “零配置部署” 和 “数据加密” 优势。

本文以 “访问内网 MySQL 数据库” 为例,提供从 “环境验证→转发配置→客户端连接” 的完整实战步骤,其他数据库(PostgreSQL、Redis、MongoDB)操作逻辑一致,可直接复用。

一、核心原理:本地端口转发的数据流向

在动手前先明确转发逻辑,避免操作时踩坑:

1. 原理图示

本地设备(如居家电脑)→ 本地端口(如 3306)→ SSH 加密隧道 → 跳板机(公网可达)→ 内网数据库(如 192.168.1.10:3306)

关键角色: 跳板机:需同时具备 “公网 IP(如 47.100.xxx.xxx)” 和 “内网访问权限”,可通过 SSH 登录(如用户名 db-jump);本地设备:外网环境的电脑(如居家电脑),需安装 SSH 客户端和数据库连接工具;内网数据库:仅允许内网访问的数据库服务(如 MySQL 192.168.1.10:3306),跳板机可直接连接。

2. 核心优势

安全加密:所有数据经 SSH 256 位加密传输,避免被外网监听或篡改;零额外软件:无需安装 VPN 客户端,仅用系统自带 SSH 工具即可;灵活可控:转发进程随用随启,关闭后隧道立即断开,无残留风险。

3. 前置条件

已获取跳板机信息:公网 IP(如 47.100.xxx.xxx)、SSH 端口(默认 22,非默认需确认)、登录用户名(如 db-jump)、登录凭证(密码或私钥);已知内网数据库信息:内网 IP(如 192.168.1.10)、端口(MySQL 默认 3306)、数据库用户名(如 dev_user)、密码;本地设备环境: Linux/macOS:自带 SSH 客户端,直接用终端操作;Windows:安装 Git Bash、Windows Terminal 或 PuTTY(本文以 Git Bash 为例,指令与 Linux 一致); 跳板机已开放 SSH 端口(云服务器需配置安全组,如阿里云开放 22 端口)。

二、实战步骤 1:验证跳板机与内网数据库的连通性

这是关键前提:若跳板机无法访问内网数据库,本地转发必然失败,需先在跳板机上验证连通性。

步骤 1.1:SSH 登录跳板机

# 格式:ssh 跳板机用户名@跳板机公网IP -p 跳板机SSH端口

ssh db-jump@47.100.xxx.xxx -p 22

# 示例(默认22端口可省略-p参数):ssh db-jump@47.100.xxx.xxx

若为密码登录:输入密码后回车,成功登录跳板机终端;若为私钥登录:添加 -i 私钥路径 参数,如 ssh -i ~/.ssh/jump_key db-jump@47.100.xxx.xxx。

步骤 1.2:在跳板机上测试数据库连接

用 telnet 或 nc 工具测试跳板机到内网数据库的端口连通性(无需数据库账号密码,仅验证网络可达):

# 方法1:用telnet测试(若未安装,先执行 sudo yum install telnet -y 或 sudo apt install telnet -y)

telnet 192.168.1.10 3306

# 方法2:用nc测试(更轻量,多数系统自带)

nc -zv 192.168.1.10 3306

连通成功提示

telnet 显示 Connected to 192.168.1.10;

nc 显示 192.168.1.10 3306 (mysql) open;

连通失败处理

若提示 Connection refused 或 Timeout,需联系内网管理员确认:

数据库服务是否正常运行;跳板机 IP 是否在数据库防火墙白名单中;数据库端口是否正确(如非默认 3306,需确认实际端口)。

三、实战步骤 2:配置本地端口转发(核心操作)

验证跳板机与数据库连通后,在本地设备执行转发命令,建立 “本地端口→跳板机→内网数据库” 的加密隧道。

步骤 2.1:本地端口转发命令格式与参数解析

# 完整格式

ssh -L [本地绑定IP:]本地转发端口:内网数据库IP:内网数据库端口 跳板机用户名@跳板机公网IP -p 跳板机SSH端口 [-fN]

核心参数说明: -L:本地端口转发标识(Local Forwarding),固定前缀;[本地绑定IP:]:可选,默认 127.0.0.1(仅本地设备可访问转发端口),若填 0.0.0.0 则局域网其他设备可访问(不推荐,有安全风险);本地转发端口:本地设备上用于映射的端口(如 3306,需确保未被占用);内网数据库IP:内网数据库端口:目标内网数据库的地址和端口(如 192.168.1.10:3306);-fN:可选参数,-f 表示后台运行(不占用终端),-N 表示不执行远程命令(仅用于转发,节省资源);其他参数:跳板机登录信息(用户名、IP、SSH 端口)。

步骤 2.2:执行本地转发命令(实战示例)

假设本地选择 3306 作为转发端口(与数据库默认端口一致,便于记忆),执行以下命令:

# 示例1:默认22端口,前台运行(需保持终端打开,关闭终端则转发断开)

ssh -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx

# 示例2:非默认SSH端口(如跳板机SSH端口为2222),后台运行

ssh -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx -p 2222 -fN

# 示例3:本地端口被占用(如3306已被本地MySQL使用),改用3307端口

ssh -L 127.0.0.1:3307:192.168.1.10:3306 db-jump@47.100.xxx.xxx -fN

执行结果验证: 前台运行:终端无报错,且保持连接状态(此时无法输入其他命令,需新打开终端操作);后台运行:执行后无明显输出,可通过以下命令查看转发进程:

# Linux/macOS 查看进程

ps aux | grep "ssh -L" | grep -v grep

# 输出示例:db-user  1234  0.0  0.0  12345  6789 ?        Ss   10:00   0:00 ssh -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx -fN

# Windows(Git Bash)查看进程

tasklist | grep ssh.exe

# 输出示例:ssh.exe                     1234 Console                    1     12,344 K

四、实战步骤 3:本地客户端连接内网数据库

转发隧道建立后,本地数据库客户端(如 Navicat、DataGrip、命令行)只需连接 “本地转发端口”,即可穿透到内网数据库。

场景 3.1:命令行连接(MySQL 示例)

本地已安装 MySQL 客户端(如 Linux/macOS 可通过 sudo yum install mysql 或 brew install mysql 安装):

# 格式:mysql -h 本地绑定IP -P 本地转发端口 -u 数据库用户名 -p

mysql -h 127.0.0.1 -P 3306 -u dev_user -p

# 若本地转发端口为3307,则改为:mysql -h 127.0.0.1 -P 3307 -u dev_user -p

执行后输入数据库密码(dev_user 的密码),若提示 mysql> 命令行,说明连接成功,可正常执行 SQL 命令(如 show databases; 查看数据库列表)。

场景 3.2:图形化工具连接(Navicat 示例)

打开 Navicat,点击 “连接”→ 选择 “MySQL”;在 “新建连接” 窗口填写参数: 连接名:自定义(如 “内网 MySQL - 居家办公”);主机:127.0.0.1(本地绑定 IP,不可填跳板机 IP);端口:3306(本地转发端口,若改了则填对应端口如 3307);用户名:dev_user(内网数据库用户名);密码:内网数据库 dev_user 的密码; 点击 “测试连接”,若提示 “连接成功”,则点击 “确定” 完成配置;双击连接即可展开内网数据库,进行表操作、SQL 执行等操作。

截图描述:Navicat 新建连接窗口,上述参数对应输入框清晰标注,“测试连接” 按钮旁显示 “连接成功” 弹窗)

五、进阶技巧:解决 “转发稳定性、安全控制” 痛点

技巧 1:本地端口冲突处理(端口被占用)

若执行转发命令时提示 bind: Address already in use(端口已被占用),按以下步骤解决:

查找占用端口的进程

# Linux/macOS 查找3306端口占用

lsof -i:3306

# 输出示例:COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

# mysql    5678   root   10u  IPv4  12345      0t0  TCP *:mysql (LISTEN)

# Windows(Git Bash)查找3306端口占用

netstat -ano | grep :3306

# 输出示例:  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       5678

处理占用进程: 若占用进程是本地 MySQL 服务:停止本地服务(如 sudo systemctl stop mysqld),或改用其他本地端口(如 3307);若占用进程是旧的 SSH 转发:杀死进程(如 kill -9 5678,5678 为进程号),再重新执行转发命令。

技巧 2:转发进程后台保活(避免网络波动断开)

默认后台转发依赖 SSH 连接,网络闪断或跳板机重启后会断开,用 autossh 工具可实现 “自动重连 + 心跳检测”:

本地安装 autossh

# Linux(CentOS/RHEL)

sudo yum install autossh -y

# Linux(Ubuntu/Debian)

sudo apt install autossh -y

# macOS(Homebrew)

brew install autossh

用 autossh 启动转发(带保活)

# 格式:autossh -M 心跳端口 -L 本地转发配置 跳板机信息 -fN

# -M 20000:指定心跳检测端口(20000,需未被占用),autossh通过该端口检测连接状态

autossh -M 20000 -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx -fN

验证保活效果

手动杀死 SSH 进程(kill -9 转发进程号),10 秒后执行 ps aux | grep autossh,若能看到新的 SSH 转发进程,说明自动重连生效。

技巧 3:安全加固(限制转发端口仅本地访问)

默认 127.0.0.1:3306 仅本地设备可访问,若误填 0.0.0.0:3306 会导致局域网其他设备可连接,存在安全风险,需通过以下方式加固:

转发命令强制绑定 127.0.0.1

执行转发时明确指定本地绑定 IP,如 ssh -L 127.0.0.1:3306:xxx,不使用 0.0.0.0;

本地防火墙限制端口访问(可选):

# Linux(firewalld)禁止外部访问3306端口

sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="!127.0.0.1" port port="3306" protocol="tcp" reject' --permanent

sudo firewall-cmd --reload

六、常见问题排查(按错误场景分类)

问题 1:转发命令执行成功,但客户端连接提示 “Can't connect to MySQL server on '127.0.0.1'”

可能原因及解决方法
跳板机到数据库的网络不通: 验证:登录跳板机执行 nc -zv 192.168.1.10 3306,若失败需联系内网管理员开放跳板机 IP 到数据库的访问权限; 本地转发端口填写错误: 检查:确认客户端连接的端口与转发命令中的 “本地转发端口” 一致(如转发用 3307,客户端填 3306 会失败); SSH 转发配置被禁用: 验证:登录跳板机查看 sshd_config 配置:grep "AllowTcpForwarding" /etc/ssh/sshd_config,确保值为 yes(默认 yes,若为 no 需修改并重启 SSH 服务:sudo systemctl restart sshd)。

问题 2:客户端连接成功,但执行 SQL 时提示 “Access denied for user 'dev_user'@' 跳板机 IP'”

可能原因及解决方法
核心原因:内网数据库的 dev_user 账号仅允许 “内网 IP 登录”(如 dev_user@192.168.1.%),拒绝来自跳板机 IP 的访问(因为转发后数据库看到的客户端 IP 是跳板机内网 IP);解决:联系数据库管理员修改账号权限,允许跳板机 IP 访问:

-- 数据库管理员执行(在数据库服务器上)

GRANT ALL PRIVILEGES ON *.* TO 'dev_user'@'跳板机内网IP' IDENTIFIED BY '数据库密码' WITH GRANT OPTION;

FLUSH PRIVILEGES;  -- 刷新权限

(跳板机内网 IP 可通过在跳板机执行 ip addr 查看,如 192.168.1.20)。

问题 3:后台转发进程频繁断开(网络波动)

可能原因及解决方法
SSH 连接超时:跳板机默认 SSH 超时时间较短,网络波动易断开;解决:在本地 ~/.ssh/config 中添加连接保活配置:

vim ~/.ssh/config

# 添加以下内容(对所有跳板机生效,或指定 Host 仅对目标跳板机生效)

Host *

  ServerAliveInterval 30  # 每30秒发送一次心跳包

  ServerAliveCountMax 3    # 3次心跳无响应则断开

保存后重新执行转发命令,可大幅提升稳定性。

七、安全注意事项(必看!)

用完即关转发进程

办公结束后,及时关闭本地转发进程,避免隧道长期开放:

# 查找转发进程号

ps aux | grep "ssh -L 127.0.0.1:3306" | grep -v grep | awk '{print $2}'

# 杀死进程(替换为实际进程号)

kill -9 1234

不使用弱密码登录跳板机

推荐用 ED25519 私钥登录跳板机,禁用密码登录(在跳板机 sshd_config 中设置 PasswordAuthentication no),避免暴力破解;

禁止转发敏感数据库到公网

仅用于测试 / 开发环境数据库,生产环境数据库需通过更严格的 VPN 或专线访问,禁止用本地转发暴露;

跳板机 IP 白名单

在跳板机防火墙(如 iptables)中仅允许自己的外网 IP 登录,拒绝其他 IP 访问 SSH 端口:

# 跳板机执行(仅允许 202.xxx.xxx.xxx 登录 SSH)

sudo iptables -A INPUT -p tcp --dport 22 -s 202.xxx.xxx.xxx -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

八、总结:本地端口转发的适用场景与扩展

1. 适用场景

外网访问内网数据库(MySQL、PostgreSQL、Redis 等);本地开发环境连接内网测试服务(如 API 接口、消息队列);无 VPN 权限时的临时内网访问需求。

2. 扩展:其他数据库的转发配置

数据库类型

内网数据库信息

本地转发命令示例

客户端连接参数(本地)

PostgreSQL

192.168.1.11:5432

ssh -L 127.0.0.1:5432:192.168.1.11:5432 ...

主机 127.0.0.1,端口 5432

Redis

192.168.1.12:6379

ssh -L 127.0.0.1:6379:192.168.1.12:6379 ...

redis-cli -h 127.0.0.1 -p 6379

MongoDB

192.168.1.13:27017

ssh -L 127.0.0.1:27017:192.168.1.13:27017 ...

mongo --host 127.0.0.1 --port 27017

通过本文的实战步骤,你可快速掌握本地端口转发的核心操作,无需复杂部署就能安全访问内网数据库。若在操作中遇到其他问题,欢迎在评论区留言讨论!

附:本地端口转发常用命令速查表

操作场景

完整命令示例

前台转发(MySQL 3306)

ssh -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx

后台转发(非默认 SSH 端口)

ssh -L 127.0.0.1:3306:192.168.1.10:3306 db-jump@47.100.xxx.xxx -p 2222 -fN

查看转发进程

`ps aux

杀死转发进程

kill -9 转发进程号(进程号通过查看命令获取)

测试跳板机到数据库连通性

nc -zv 192.168.1.10 3306

命令行连接数据库

mysql -h 127.0.0.1 -P 3306 -u dev_user -p

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部