使用持久 SSH 隧道对 MariaDB 进行远程 CRUD

使用持久 SSH 隧道对 MariaDB 进行远程 CRUD

希望有人能帮助我解决这个问题。

我的设置

我有一个客户端和服务器设置,都运行 Ubuntu 18.04.4 LTS。它们都位于不同的网络上。我希望能够在客户端计算机上使用安装在服务器上的 MariaDB 数据库。我正在尝试设置 SSH,以便如果我在客户端计算机上为特定端口 (3306) 发送 localhost 命令,它会被路由到服务器并在服务器上进行处理,就像它是发送到服务器的 localhost 命令一样。

为此,我在客户端和服务器上都添加了一个用户。客户端和服务器上的用户和密码都是相同的。

我已将服务器上的默认 SSH 端口更改为端口 8888(因为我不喜欢“默认”设置)我能够以我创建的用户身份通过​​ SSH 进入服务器(从客户端计算机),一切顺利(端口转发和路由问题已解决)。通过 SSH 连接到服务器后,我能够登录 MariaDB 并 CRUD 数据库。

我发现很多网站都声称 SSH 可以让我设置隧道,一旦隧道到位,就可以在服务器上执行发送到特定端口的命令。这就是应该的工作方式:

ssh [email protected] -p 8888 -L 3306:localhost:3306 -N

请注意,对于本次讨论

  • 用户 - 客户端和服务器上的帐户的用户名。此用户的唯一限制是用户帐户不在 sudoers 文件中。用户拥有主目录和所有内容。
  • myserver.mycomany.com-能够解析服务器所在位置的 IP
  • 8888-路由到服务器的端口
  • 3306 - 可访问 MariaDB 的端口
  • MariaDB 已配置用户/密码

问题

我遇到的问题是,当我使用以下命令时,按下回车键后光标就挂起了(好像命令没有完成),因为它没有让我回到提示符(我必须按 CTRL+C 才能退出它),即光标只是在下一行闪烁:

ssh [email protected] -p 8888 -L 3306:localhost:3306 -N

但是,如果我从命令中删除 -N,则命令似乎已成功完成,但我无法从客户端计算机登录 MariaDB。所以它实际上什么也没做。

有人能帮我找出我做错的地方吗?或者告诉我我疯了才会尝试这个,这是不可能的?

我暗暗希望

我希望能够在弄清楚如何操作后使用 autossh 运行此隧道。然后我所要做的就是登录到客户端计算机并运行数据库命令,这些命令都会路由到服务器,而无需进行任何设置。

我目前所做的

根据 Jos 的建议,我运行了

ssh -vv [email protected] -p 8888 -L 3306:localhost:3306 -N

并获得了更多信息。它挂在

client_input_global_request: rtype [email protected] want_reply 0

我发现重新启动 systemd-logind 可能会解决这个问题,所以我做了:

systemctl restart systemd-logind

这次我走得更远,命令确实退出了,但状态为 127。这是一个巨大的输出,但这里是从看起来相关的内容开始的最后 85 行:

Authenticated to hiding.myservername.com ([hiding.my.ip.com]:8888).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 80
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug3: receive packet: type 91
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x08
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug3: Ignored env LS_COLORS
debug3: Ignored env SSH_CONNECTION
debug3: Ignored env LESSCLOSE
debug1: Sending env LANG = en_CA.UTF-8
debug2: channel 0: request env confirm 0
debug3: send packet: type 98
debug3: Ignored env XDG_SESSION_ID
debug3: Ignored env USER
debug3: Ignored env PWD
debug3: Ignored env HOME
debug3: Ignored env SSH_CLIENT
debug3: Ignored env SSH_TTY
debug3: Ignored env MAIL
debug3: Ignored env TERM
debug3: Ignored env SHELL
debug3: Ignored env SHLVL
debug3: Ignored env LOGNAME
debug3: Ignored env XDG_RUNTIME_DIR
debug3: Ignored env PATH
debug3: Ignored env LESSOPEN
debug3: Ignored env _
debug1: Sending command: 3306:localhost:3306 -N
debug2: channel 0: request exec confirm 1
debug3: send packet: type 98
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
debug2: channel 0: rcvd ext data 38
debug3: receive packet: type 96
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug3: receive packet: type 98
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug3: receive packet: type 98
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug2: channel 0: rcvd eow
debug2: channel 0: close_read
debug2: channel 0: input open -> closed
debug3: receive packet: type 97
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug2: channel 0: obuf_empty delayed efd 6/(38)
sh: 1: 3306:localhost:3306: not found
debug2: channel 0: written 38 to efd 6
debug3: channel 0: will not send data after close
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug3: send packet: type 97
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cc -1)

debug3: send packet: type 1
Transferred: sent 2432, received 2528 bytes, in 0.5 seconds
Bytes per second: sent 5324.3, received 5534.5
debug1: Exit status 127

我不知道接下来该去哪里。

我将 MySQL 端口 3306 转发到了服务器(虽然我认为我不需要这样做,因为我希望通过 SSH 端口 8888 进行访问)。我仍然卡在。

client_input_global_request: rtype [email protected] want_reply 0

这次重新启动 systemd-logind 没有帮助。

我用以下方法测试了服务器上的 MySQL 端口

User@Server:~$ telnet localhost 3306
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
t
5.5.5-10.4.12-MariaDB-1:10.4.12+maria~bionic-log$j0Mqri9!�5&`3y+fBUf"smysql_native_passwordConnection closed by foreign host.

我觉得还可以。

如果我通过网络进行 telnet,我会收到“连接被拒绝”的信息,这是因为 MariaDB 已配置为仅进行本地主机身份验证。

继续探索。我在服务器所在的本地网络上安装了一个新的 Ubuntu 系统。我使用本地 IP 地址(而不是 DNS 解析的主机名)运行 SSH 命令,由于 2 个系统位于一个子网中,我已消除网关上的任何路由/NAT/端口转发问题。我仍然有一个挂起的 client_input_global_blablabla

我使用与 Sudoers 文件中的用户帐户的连接进行了测试。没有运气。

下一步...重新安装服务器并尝试相同的连接,无需任何公钥认证。

相关内容