为什么 ssh -g 说该地址已被使用?

为什么 ssh -g 说该地址已被使用?

我设置了带有端口转发的 SSH 连接,允许远程主机连接到本地转发的端口,如下所示:

ssh -g -L 5115:localhost:5115 <server>

即使我收到此错误消息,连接也可以正常工作:

绑定:地址已在使用中

无论我选择哪个端口,我都会收到此消息。我想知道为什么我会收到此消息,即使连接似乎工作正常。难道我做错了什么?

答案1

命令:

ssh -g -L 5115:localhost:5115 <server>

会导致本地ssh进程绑定到 0.0.0.0 端口 5115 以侦听要转发的连接。您收到的错误消息表明某些其他进程已绑定到此地址和端口,因此ssh无法执行此操作。

您应该能够通过运行 netstat 来验证这一点:

netstat -an | grep 5115

你可能会看到这样一行:

tcp4       0      0  *.22                   *.*                    LISTEN

“LISTEN”意味着某个东西正在监听连接。 ”.22" 是地址和端口;0.0.0.0 或 "” 表示“任何接口”。

您在这里的选择是找到正在使用端口 5115 的其他程序并使其停止,或者为您的 ssh 隧道使用不同的本地端口。

答案2

如果您运行的是 Linux,则可以通过运行以下命令(以 root 身份)来消除警告:

echo 1 > /proc/sys/net/ipv6/bindv6only

发生的事情是 ssh 在将 PF_INET 套接字绑定到[::]:5115之前先绑定了 PF_INET6 套接字0.0.0.0:5115。 PF_INET6 套接字绑定到两个协议,因此尝试绑定第二个套接字失败。通过打开,bindv6only您将使 PF_INET6 套接字不再接触 IPv4 地址。

一种不太具有破坏性的方法是使用 的四参数形式-L,您可以在其中显式指定绑定地址(使用0.0.0.0)。

相关内容