Networking

通過遠端主機名的埠轉發無法連接,通過 IP 工作

  • April 17, 2019

我正在嘗試通過 ssh 將本地埠轉發到可以訪問 mariadb 伺服器(“數據庫伺服器”)的遠端伺服器(“跳轉伺服器”)。跳轉伺服器的公網 IP 地址為 1.2.3.4,而 DB 伺服器的內網 IP 地址為 10.5.6.7。以下命令按預期工作:

ssh -v -N user@1.2.3.4 -L 3306:10.5.6.7:3306

但是,數據庫伺服器的內部 IP 地址不是靜態的,所以我想依靠它的內部主機名 mariadb.local。但是以下方法不起作用

ssh -v -N user@1.2.3.4 -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 no-more-sessions@openssh.com 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 訪問的使用者可以使用此服務。

問題是使用者被 chroot 了,事實證明,如果UsePrivilegeSeparation是 on(從 openSSH 7.5 開始是強制性的)也將 chroot 分叉程序。

顯然,這導致程序無法讀取/etc/resolv.conf正確解析主機名所必需的內容。有一些解決方案,但基本上如果您遇到這樣的問題,很可能resolv.conf由於某種原因不可讀(另一個可能的問題是該文件的權限)。

引用自:https://serverfault.com/questions/958753