(重定向自网络工程.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] -N
curl localhost:140
curl 127.0.0.1:140
curl 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_PROXY
Rho 上没有设置环境变量,也没有设置NO_PROXY
。
答案1
在您的 ssh 命令中,您没有bind_address
为您的-L
选项指定。
根据man ssh
:
默认情况下,本地端口将根据设置进行绑定。但是,可以使用
GatewayPorts
显式地址将连接绑定到特定地址。表示监听端口仅供本地使用,而空地址或表示该端口应可从所有接口使用。bind_address
bind_address
localhost
*
允许所有接口上的连接,而不仅仅是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
应将本地端口转发绑定到通配符地址,从而允许远程主机连接到转发端口。参数必须是yes
或no
(默认值)。
您的命令
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
)。