ssh -g 与 0.0.0.0 是多余的吗?

ssh -g 与 0.0.0.0 是多余的吗?

下面两个命令有什么区别吗?

ssh -g -L 8080:localhost:80 [email protected]
ssh -L 8080:0.0.0.0:80 [email protected]

答案1

这是两个不相关的值。

openssh的选项-g相当于指定客户端的ssh_config选项-o GatewayPorts=yes。它们影响可以放在前面的不成文的可选部分-L选项:

-L [bind_address:]port:host:hostport

如果没有-gGatewayPorts默认no)也不指定任何本地绑定,ssh 默认绑定到本地主机(这又意味着 IPv4 127.0.0.1+ IPv6 ::1)。使用-g(或使用-o GatewayPorts=yes),它默认绑定到 INADDR_ANY ( 0.0.0.0) + in6addr_any ( ::)。无论存在什么默认值或选项,都可以通过在选项中添加要绑定到的 IP 地址来在客户端上覆盖本地地址-L

所以:

ssh -g -L 8080:localhost:80 [email protected]

相当于:

ssh -L 0.0.0.0:8080:localhost:80 [email protected]

或者在启用 IPv6 的系统上(如果需要两种协议):

ssh -L 0.0.0.0:8080:localhost:80 -L '[::]:8080:localhost:80' [email protected]

现在,与-gOP 无关的第二个命令:

ssh -L 8080:0.0.0.0:80 [email protected]

通常是一个明显的错误:它告诉远程端连接绑定至 INADDR_ANY。

为一个目的地这意味着:不要选择目的地,让系统决定何时连接套接字。在这种情况下,远程系统(根据远程sshd服务器的要求)选择自己的地址之一,并且可能选择 127.0.0.1 或 $HOST,或者我们不知道(在我的远程系统测试中,它选择了 127.0.0.1)。

connect(4, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16)

实际连接(在我的测试中)从 127.0.0.1 到 127.0.0.1

相关内容