我正在尝试通过 ssh 执行本地端口转发到可以访问 mariadb 服务器(“数据库服务器”)的远程服务器(“跳转服务器”)。跳转服务器的公共 IP 地址为 1.2.3.4,而数据库服务器的内部 IP 地址为 10.5.6.7。以下命令按预期工作:
ssh -v -N [email protected] -L 3306:10.5.6.7:3306
但是,数据库服务器的内部 IP 地址不是静态的,所以我想依赖它的内部主机名 mariadb.local。但是下面的代码确实不是工作:
ssh -v -N [email protected] -L 3306:mariadb.local:3306
从跳转服务器上的 sshd 产生以下输出:
debug1: active: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: Entering interactive session for SSH2.
debug1: server_init_dispatch
debug1: server_input_global_request: rtype [email protected] want_reply 0
debug1: server_input_channel_open: ctype direct-tcpip rchan 2 win 2097152 max 32768
debug1: server_request_direct_tcpip: originator 127.0.0.1 port 58953, target mariadb.local port 3306
connect_to mariadb.local: unknown host (Try again)
debug1: server_input_channel_open: failure direct-tcpip
因此,这似乎肯定是 DNS 解析问题,但我不确定 DNS 解析在端口转发期间如何工作,所以我的知识就此失效了。明确地说,这是从跳转服务器执行 ping 的结果:
/ # ping mariadb.local
PING mariadb.local (10.5.6.7): 56 data bytes
注意:整个环境实际上都在 kubernetes 中,因此主机名 mariadb.local 通过服务提供,并通过 k8s coreDNS 解析。但是,我不明白这有什么影响,所以我从问题的主要描述中省略了它,以避免使问题进一步复杂化,并避免“使用 kubectl port-forward”的建议;这不是一个选项,因为我想让我不想授予 kubectl 访问权限的用户可以使用此服务。
答案1
问题是用户被 chroot 了,事实证明,如果UsePrivilegeSeparation
处于打开状态(从 openSSH 7.5 开始这是强制性的),那么分叉的进程也将 chroot 。
显然,这导致进程无法读取/etc/resolv.conf
正确解析主机名所需的信息。有几个解决方案对此,但本质上如果您遇到这样的问题,很可能resolv.conf
由于某种原因而无法读取(另一个可能的问题是该文件的权限)。