Ssh

ssh -g 對 0.0.0.0 是多餘的嗎?

  • October 1, 2022

以下兩個命令有什麼區別嗎?

ssh -g -L 8080:localhost:80 bob@example.com
ssh -L 8080:0.0.0.0:80 bob@example.com

這是兩個不相關的值。

openssh的選項-g等效於指定客戶端的ssh_config選項-o GatewayPorts=yes。它們影響可以附加在-L選項上的未寫的可選部分:

-L [bind_address:]port:host:hostport

沒有-g(並且GatewayPorts預設為no)也沒有指定任何本地綁定,ssh 預設綁定到localhost(這反過來意味著 IPv4 127.0.0.1+ IPv6 ::1)。使用-g(或使用-o GatewayPorts=yes)它預設綁定到 INADDR_ANY ( 0.0.0.0) + in6addr_any ( ::)。無論存在什麼預設值或選項,都可以通過在-L選項中添加要綁定的 IP 地址來替代客戶端上的本地地址。

所以:

ssh -g -L 8080:localhost:80 bob@example.com

相當於:

ssh -L 0.0.0.0:8080:localhost:80 bob@example.com

或者如果需要兩種協議,則在啟用 IPv6 的系統上:

ssh -L 0.0.0.0:8080:localhost:80 -L '[::]:8080:localhost:80' bob@example.com

現在,與 OP 的第二個命令無關-g

ssh -L 8080:0.0.0.0:80 bob@example.com

通常是一個明顯的錯誤:它告訴遠端端連接到而不是綁定到 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

引用自:https://unix.stackexchange.com/questions/719363