为什么“卷曲` 的行为与 `curl localhost` 不同吗?

为什么“卷曲` 的行为与 `curl localhost` 不同吗?

(重定向自网络工程.stackexchange

我的网络上有两个 Raspberry Pi - 我们称它们为 Pi 和 Rho。

我正在尝试通过它们之间的 ssh 隧道设置端口转发,以便应用程序可以连接到 Rho 上的端口并从监听 Pi 上端口的服务器获取结果(我的最终目标实际上是设置端口转发,以便不同网络上的主机可以通过与 Rho 的 ssh 连接访问 Pi 上的 Samba 共享,而无需我完全打开到 Pi 的防火墙端口)。

我的 LAN 中的 Pi 的 IP 是192.168.42.69,而 Rho 的 IP 是192.168.42.112- 这些是我从本地网络 ssh 连接到它们的 IP。

为了测试这一点,我SimpleHTTPServer在 Pi 的 8000 端口上启动了一个最小的 Python 服务器(带有),并在 Rho 上运行。当我在Rho 上时,我得到了我期望的响应。但是,当我在 Rho 上时,我得到了拒绝连接;详细输出如下:sudo ssh -L 140:localhost:8000 [email protected] -Ncurl localhost:140curl 127.0.0.1:140curl 192.168.42.112:140

$ curl -vvv 192.168.42.112:140
* Expire in 0 ms for 6 (transfer 0x2cd880)
*   Trying 192.168.42.112...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x2cd880)
* connect to 192.168.42.112 port 140 failed: Connection refused
* Failed to connect to 192.168.42.112 port 140: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 192.168.42.112 port 140: Connection refused

造成这种差异的原因是什么?

拥有检查了另一个问题,我确认HTTP_PROXYRho 上没有设置环境变量,也没有设置NO_PROXY

答案1

在您的 ssh 命令中,您没有bind_address为您的-L选项指定。

根据man ssh

默认情况下,本地端口将根据设置进行绑定。但是,可以使用GatewayPorts显式地址将连接绑定到特定地址。表示监听端口仅供本地使用,而空地址或表示该端口应可从所有接口使用。bind_addressbind_addresslocalhost*

允许所有接口上的连接,而不仅仅是localhost(这是127.0.0.1,地址环回接口),在您的选项中指定bind_address一个,例如0.0.0.0-L

sudo ssh -L 0.0.0.0:140:localhost:8000 [email protected] -N

如果您希望它在特定的 IP 上监听,您可以指定它而不是0.0.0.0

答案2

这是什么man 1 ssh状态:

-L [bind_address:]port:host:hostport
-L [bind_address:]port:remote_socket
-L local_socket:host:hostport
-L local_socket:remote_socket

指定将与本地(客户端)主机上给定 TCP 端口或 Unix 套接字的连接转发到远程端的给定主机和端口或 Unix 套接字。[…]

默认情况下,本地端口将根据GatewayPorts设置进行绑定。但是,可以使用显式 bind_address 将连接绑定到特定地址。bind_address 表示localhost侦听端口仅绑定供本地使用,而空地址或*表示端口应可从所有接口使用。

GatewayPorts提到的是来自的那个ssh_config(不是来自的那个sshd_config,这个是针对的-R)。来自man 5 ssh_config

GatewayPorts

指定是否允许远程主机连接到本地转发端口。默认情况下,ssh(1)将本地端口转发绑定到环回地址。这可以防止其他远程主机连接到转发端口。GatewayPorts可用于指定ssh应将本地端口转发绑定到通配符地址,从而允许远程主机连接到转发端口。参数必须是yesno(默认值)。

您的命令

ssh -L 140:localhost:8000 [email protected] -N

未指定bind_address,则符合“默认”条件。GatewayPorts对于,它看起来ssh像是no

请注意,“空地址”看起来有所不同:-L :140:localhost:8000。额外的冒号很重要。此变体指定bind_address为空字符串,而您使用的根本-L 140:localhost:8000没有指定。bind_address

要绑定到所有接口,请使用空地址(-L :140:localhost:8000)或*(在 shell 中您应该引用它,例如-L '*':140:localhost:8000)。

相关内容