(重定向自networkengineering.stackexchange)
我的网络上有两个 Raspberry Pi - 我们称它们为 Pi 和 Rho。
我正在尝试通过它们之间的 ssh 隧道设置端口转发,以便应用程序可以连接到 Rho 上的端口并从侦听 Pi 上的端口的服务器获取结果(我的最终目标实际上是设置端口转发这样不同网络上的主机可以通过与 Rho 的 ssh 连接访问 Pi 上的 Samba 共享,而无需我完全打开通往 Pi 的防火墙端口)。
我的 LAN 中的 Pi 的 IP 是192.168.42.69
,而 Rho 的192.168.42.112
IP 是 - 这些是我从本地网络 ssh 以连接到它们的 IP。
为了对此进行测试,我SimpleHTTPServer
在 Pi 的 8000 端口上启动了一个最小的 Python 服务器(带有 ),并sudo ssh -L 140:localhost:8000 [email protected] -N
在 Rho 上运行。当我curl localhost:140
或curl 127.0.0.1:140
在 Rho 上时,我得到了我期望的响应。但是,当我curl 192.168.42.112:140
在 Rho 上时,连接被拒绝;下面的详细输出:
$ 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
。
在您的 ssh 命令中,您没有
bind_address
为您的-L
选项指定 a 。根据
man ssh
:要允许所有接口上的连接而不仅仅是
localhost
(它是 的别名,环回接口127.0.0.1
的地址),请在您的选项中指定 a of ,例如bind_address
0.0.0.0
-L
如果您希望它在特定 IP 上侦听,您可以指定它而不是
0.0.0.0
.这就是
man 1 ssh
状态:GatewayPorts
提到的是来自的ssh_config
(不是来自的sshd_config
,这个是给的-R
)。来自man 5 ssh_config
:你的命令
没有指定
bind_address
,它有资格“默认”。它看起来像GatewayPorts
for 。ssh
no
注意“空地址”看起来不同:
-L :140:localhost:8000
. 额外的冒号很重要。此变体确实指定bind_address
为空字符串,而-L 140:localhost:8000
您使用的根本没有指定bind_address
。要绑定到所有接口,请使用空地址 (
-L :140:localhost:8000
) 或*
(在 shell 中您应该引用它,例如-L '*':140:localhost:8000
)。