请教,过堡垒机访问内部服务如何配置 ssh 隧道?

2024-06-03 15:30:47 +08:00
 a33291

之前请教过一次,但是实验之后还是不行

先看拓扑图(来自 MX,测试环境) https://imgur.com/a/iKd2LGb

现在已知所有内网服务都必须过堡垒机 a(192.168.192.130)访问,然后在内部服务器 b(192.168.192.129)上有一个 mysql 服务监听端口为 3306 现在可以通过堡垒机 web 页面直接启动一个 xshell,无需输入任何用户名或密码就会建立一个到 b 服务器的 ssh 连接 现在我尝试利用 ssh 隧道功能,将服务器 b 上的 3306 端口转发到 xshell 所在客户端机器(此处端口号为 33306) https://imgur.com/473D7Km

然后我用 navicat 连接客户端机器的 33306,无法链接,并且如果直接 telnet 这个端口会被立即关闭

当前已做如下尝试 1.由于我已知测试环境堡垒机 a 的 ssh 账户,所以如果我先通过 xshell 新建一个普通的 ssh 会话并连接到 a,然后添加一个隧道此时是可以正常连接 2.如果通过堡垒机的网页建立的 xshell 会话,新建同样的隧道就无法连接

由于堡垒机连接时每次的用户名密码都是随机且不可见的,所以在尝试使用 MX 中的隧道功能时,ssh server 处的用户名密码无法填写

现在的疑问就是,这种情况是有可能打通的吗?

补充一下场景 在服务器 b 上的数据库有时候想要去定位一下问题,在 cli 内直接执行 sql 看着太累了,所以想要把 mysql 服务暴露在本地通过 navicat 连接这样方便调试,并不会暴露到不安全环境,而且用完则关

再次感谢大家

1484 次点击
所在节点    程序员
10 条回复
a33291
2024-06-03 16:45:52 +08:00
刚测试了一下把 web 上启动的 xshell 临时会话另存为标准会话后,解密了会话中的用户名密码
在会话不断开的情况下,使用其他 ssh 客户端使用账号密码去连接堡垒机,会发现无法连接,提示密码错误
换句话说,这个密码应该是一次性密码,用一次就失效

不是很确定 ssh 隧道是否是单独启动独立的 ssh 会话去建立隧道,如果是的话那肯定就不行,因为密码已经失效了
F7TsdQL45E0jmoiG
2024-06-04 09:36:07 +08:00
给 ssh 的用户加密钥登录,再建 tunnel 时用密钥验证
a33291
2024-06-04 10:54:44 +08:00
@morenacl 感谢建议,不得行,我对堡垒机没有控制权,别人只给了这种方式😁
Volekingsg
2024-06-04 14:12:23 +08:00
> 不是很确定 ssh 隧道是否是单独启动独立的 ssh 会话去建立隧道
可以不是,另外 ssh 连接也可以复用

我都是用命令行,不清楚 MX 指什么,本质上还是看是否限制 ssh 连接到堡垒机,如果可以就可以
a33291
2024-06-04 15:07:11 +08:00
@Volekingsg 感谢回复,MX 指 MobaXterm

现在堡垒机启动的时候都是直接 web 页面唤起 xshell 或者是 MobaXterm,然后如果唤起的是 xshell,则可以在 "转移规则"处右键新建一个隧道,但是实际测试发现看似建立成功但是无法正常工作
而如果唤起的是 MobaXterm,也有一个新建隧道的能力(也就是图 1),但是他要求填这个堡垒机或者目标机器的密码,实际情况是我无法知道堡垒机或者目标机器的 ssh 用户名和密码
现在也无法控制堡垒机给出其他连接方案,比如楼上说的开放 token 连接,他 web 唤起的程序用到的用户名密码都是随机的,而且一旦唤起的程序连接之后,在用相同用户名密码就无法建立独立的 ssh 连接(xshell 中的"赋值渠道"是可以,但是隧道仍然不行)

如果能通过稳定的用户名密码连接到远程 ssh,这个情况我测试过,隧道的确正常
yiranzed
2024-06-04 15:38:49 +08:00
堡垒机要对 ssh 进行代理审计,一般不支持这种隧道形式。他本地调起 xshell 就是将一次一密传给 xshell ,你可以在本地动点手脚,让他启动你自己的脚本,用他给的一次一密来试试开启 ssh 隧道。但我猜测应该是不行的。你用哪家的堡垒机?
Orlion
2024-06-04 15:47:36 +08:00
跟我司开发环境差不多,专门写了个用 http 转发 mysql 包的工具方便从本地连接测试环境的 mysql 。大概原理就是在本机伪装出一个“假 mysql server”,本机 mysql client 连接到本地的假 mysql server ,然后这个假 mysql server 将数据包通过 http 转发到测试环境的一台机器上,这台机器将数据包转发给真正的 mysql server 。

https://github.com/Orlion/hersql

不知道能否解决你的问题
a33291
2024-06-04 17:46:46 +08:00
@yiranfxh 感谢指点
我开始也想过是不是可以对 xshell 或者 mx 本身动手脚,这样当从 web 唤起的时候就执行额外的命令,在首次连接时即能建立一个隧道,但是尚未验证过
生产环境是奇安信的堡垒机,我自己搭建用于测试和验证的开源的 jumpserver
a33291
2024-06-04 17:51:21 +08:00
@Orlion 感谢
通过 http 转发 mysql 协议的话,navicat 这种客户端能连上吗?

此外这应该包含一个隐含的要求就是过堡垒机能暴露出一个 http 端口,目前环境下只给我们开了一个 web 端口(页面访问),此外不再对外暴露任何端口,所以我猜测也比较难
Orlion
2024-06-05 09:59:30 +08:00
@a33291 所有客户端都可以连上。确实需要内网有一台机器能暴露 http 端口,我们是在内网有一台机器,被 nginx 监听,我用 nginx 转发请求到内网的 hersql transport 服务上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1046394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX