今天办公室停电,数据库等服务均无法直接连接,然后数据库、redis这些服务都没有对外开放。
于是想到了使用SSH将服务转发到本地来。
SSH的转发文章可以参考:SSH隧道:动态转发本地请求
SSH 端口转发
你正在开发或调试一个应用,它依赖于部署在远程服务器 blog 上的两个 Docker 容器服务:
- MySQL数据库 容器 IP:172.16.16.2:3306
- Redis缓存 容器 IP:172.16.16.5:6379
这些容器只连接到了 Docker 自定义网络中,并没有绑定宿主机端口,也无法从外部直接访问。但你可以通过 SSH 登录这台宿主机 blog。
于是你使用 SSH 隧道技术,将这两个容器中的服务“代理”到你的本地机器上:
本地访问 localhost:3306 实际连接的是远程的 MySQL 容器;
本地访问 localhost:6379 实际连接的是远程的 Redis 容器。

ssh -NPf blog -L 3306:172.16.16.2:3306 -L 6379:172.16.16.5:6379
命令说明:
- -N 不执行远程指令,仅用于端口转发
- -P 用一个非特权端口进行出去的连接
- -f SSH完成认证并建立port forwarding后转入后台运行
- -C 使用压缩功能,是可选的,加快速度。
验证
Get-NetTCPConnection -LocalPort 3306

关闭
由于使用了f命令将其转入后台,在控制台使用ctrl + c
是无法直接关闭的,因此需要使用命令进行关闭。
Stop-Process -Id (Get-NetTCPConnection -LocalPort 3306).OwningProcess
Stop-Process -Id (Get-NetTCPConnection -LocalPort 6379).OwningProcess
基于Windows的端口转发
自Windows XP开始,Windows就内置了网络转发的功能,任何传入到本地端口的TCP连接(IPv4或IPv6)都可以被重定向到另一个本地端口或可以访问的远程计算机端口。并且系统不需要有一个专门用于侦听该端口的服务。目前只支持tcp协议的端口转发。
使用例子:
netsh interface portproxy add v4tov4 listenaddress=[localaddress] listenport=[localport] connectaddress=[destaddress]
解释一下这其中的参数意义
参数 | 说明 |
---|---|
listenport | 按端口号或服务名称指定要对其进行侦听的 IPv4 端口。 |
connectaddress | 指定要连接的 IPv4 地址。 可接受的值为 IP 地址、计算机 NetBIOS 名称或计算机 DNS 名称。 如果未指定地址,则默认值为本地计算机。 |
connectport | 按端口号或服务名称指定要连接的 IPv4 端口。 如果未指定 connectport,则默认值为本地计算机上 listenport 的值 。 |
listenaddress | 指定要侦听的 IPv4 地址。 可接受的值为 IP 地址、计算机 NetBIOS 名称或计算机 DNS 名称。 如果未指定地址,则默认值为本地计算机。 |
protocol | 指定要使用的协议。 |
举个栗子,现在某某某服务运行于172.27.20.12的8088端口,但这个服务又需要通过VPN才能访问,那么我们就需要先通过VPN打通该地址的访问通道。然后再将这个服务使用端口转发的形式暴露在内网下。
netsh interface portproxy add v4tov4 listenport=8088 connectaddress=172.27.20.12 connectport=8088
这样我们就创建好了一个对应的转发服务。
一些常用的命令:
# 显示创建的转发规则
netsh interface portproxy show v4tov4
# 删除规则
netsh interface portproxy delete v4tov4 listenport=8088
# 查看是否启动成功
netstat -ano | find listenport
# 显示系统中的转发规则列表
netsh interface portproxy show all
# 查看portproxy设置
netsh interface portproxy dump
# 清除所有端口转发规则
netsh interface portproxy reset
反向转发
你有一台服务器,它不允许从外部访问,但它可以访问外部互联网。这时你想将该服务器内部的Mysql数据库服务转发到外部来进行临时访问,那么你可以使用以下方式。
前提条件
- 待转发服务器:允许访问外部互联网,且已安装SSH客户端
- 转发服务器:能够访问外网,且已安装SSH客户端
转发配置
转发服务器需要开启隧道转发功能,编辑etc/ssh/sshd_config
,添加或修改以下内容
GatewayPorts yes # 允许远程访问本地转发的端口
PermitRootLogin yes # 如果需要使用 root 账号登录
# 重新启动 SSH 服务
systemctl restart sshd
开启反向隧道转发
ssh -R 3307:localhost:3306 root@jumpServer -p 2222
参数说明
-R
:表示创建反向隧道,也就是把本地端口映射到远程服务器的端口。3307
:这是本地机器上要监听的端口。localhost:3306
:指的是待转发服务器内部的 MySQL 服务地址和端口。root
:是你本地机器的用户名。jumpServer
:为你转发服务器的公网 IP 地址。-p 2222
:是本地机器 SSH 服务的端口(要保证该端口已在防火墙中开放)。
关闭反向隧道
在转发服务器内执行
# 查找转发服务端口对应的pid
ss -tpnl | grep 3307
# 杀掉ssh进程
kill -9 12345
文章评论
博主,你这个主题是最新版本的Seaton Jiang主题吗?
@harley 是的。最底部有连接的