如何使用 putty (和/或 plink)命令行通过 2 个中间主机转发到数据库?

如何使用 putty (和/或 plink)命令行通过 2 个中间主机转发到数据库?

我需要为一些同事编写一个脚本,以便他们通过以下拓扑进行连接,并使用私钥进行身份验证(每个人的相同密钥适用于堡垒和数据库访问):

 ┌────────────┐    ┌────────────┐     ┌────────────┐     ┌────────────┐
 │            │    │            │     │            │     │            │
 │  desktop   │───>│  bastion   │────>│  db access │────>│  db 3306   │
 │  (windows) │    │  (linux)   │     │  (linux)   │     │  (mysql)   │
 └────────────┘    └────────────┘     └────────────┘     └────────────┘

我的同事随后将在桌面数据库查询工具中使用此连接。

为了尽可能简化部署,我想在命令行上指定所有配置,而不引用 Putty UI 中配置的任何已保存会话数据。我有脚本可以引用的私钥的 .ppk 文件。

什么(可能非常长的)putty和/或plink命令行可以实现此功能?

根据我对手册的理解,我尝试这样做:

plink -ssh -2  -i C:\temp\key.ppk -agent -A -t -l user -L 6035:127.0.0.1:6035 user@BASTION ssh -v -L 6035:DBHOST:3306 user@DBACCESS

这会让我进入堡垒,但它会在堡垒上寻找私钥以建立与数据库访问的连接。

我能够从我的 Mac 使用 ssh 连接到它(代码如下所示),所以我知道盒子的当前配置允许这种访问。我正在寻找用于从 Windows 盒子访问的 putty/plink 解决方案。

ssh -v -A -t \
-L ${LOCAL_PORT}:localhost:${LOCAL_PORT} ${USER}@${BASTION_HOST} \
-t ssh -v -L ${LOCAL_PORT}:${DB_HOST}:${DB_PORT} ${USER}@${DB_ACCESS_HOST}

答案1

随着 PuTTY 0.68 的发布,plink获得了一个名为 的新命令行选项-proxycmd。使用这个新功能可以得到一个更强大、更简洁的解决方案。

不幸的是,该选项没有太多帮助-proxycmd。它确实执行本地命令并将其用作代理。甚至可以使用plink-nc选项创建到db access主机的隧道。

对于您的拓扑,在命令提示符下的机器上执行的命令desktop如下所示:

plink -A ^
  -proxycmd "plink -A -nc DBACCESS:22 user@BASTION" ^
  -L 6035:DBHOST:3306 ^
  user@DBACCESS

注意:要实现无密码登录,peagent必须在主机上运行desktop 并加载适当的密钥。正如评论中提到的,必须在主机上启用代理转发bastion才能使其无缝运行。

连接看起来就像下面的 ASCII 图一样。外部隧道通过代理命令到达主机db access。封装在隧道中的运行plink并建立到主机的端口转发db

 ┌────────────┐    ┌────────────┐    ┌────────────┐    ┌────────────┐
 │            │    │            │    │            │    │            │
 │            ─────────────────────────────       │    │            │
 │                      (1)                       │    │            │  
 │           ────────────────────────────────────────────           │
 │                      (2)                                         │
 │           ────────────────────────────────────────────           │
 │            ─────────────────────────────       │    │            │
 │  desktop   │    │  bastion   │    │  db access │    │  db 3306   │
 │  (windows) │    │  (linux)   │    │  (linux)   │    │  (mysql)   │
 └────────────┘    └────────────┘    └────────────┘    └────────────┘

 1) Tunnel via `-proxycmd "plink -A -nc DBACCESS:22 user@BASTION"`
 2) Proxied `plink` connection with port forward `-L 6035:DBHOST:3306`  

相关内容