下面两个命令有什么区别吗?
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
如果没有-g
(GatewayPorts
默认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]
现在,与-g
OP 无关的第二个命令:
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