生产调试之服务转发至本地

2022-11-30 2627点热度 2条评论

今天办公室停电,数据库等服务均无法直接连接,然后数据库、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数据库服务转发到外部来进行临时访问,那么你可以使用以下方式。

前提条件

  1. 待转发服务器:允许访问外部互联网,且已安装SSH客户端
  2. 转发服务器:能够访问外网,且已安装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

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

文章评论

  • harley

    博主,你这个主题是最新版本的Seaton Jiang主题吗?

    2022-12-12
    • Jalena

      @harley 是的。最底部有连接的

      2022-12-14