Ssh
ssh -g 對 0.0.0.0 是多餘的嗎?
以下兩個命令有什麼區別嗎?
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(這反過來意味著 IPv4127.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