我有一个远程托管资源 (webapp),必须将其隧道传输到服务器才能进行远程访问。我可以使用 完成本地端口转发命令,然后在浏览器中-L
访问远程资源。localhost:port
为了简单和持久,我想通过隧道进入远程主机(使用我的密钥通过 SSH),但在本地提供网页,以便我可以使用本地网络上的不同计算机访问它。
例如:
Old way:
Remote-server --|SSH_Tunnel|-- Local-host:port
New way:
Remote-server --|SSH_Tunnel|-- Local-host:port || local-net:port == local_http-traffic == different-local-computer
答案1
总结一下?使用ssh -g …
。
我认为你使用的命令是这样的
ssh -L 1234:server:5678 ssh_server
这将在本地监听127.0.0.1:1234
(IPv4) 和(IPv6)。与这些地址中的任何一个的本地连接都将从到达。LAN 上的其他计算机无法到达隧道,因为和是环回地址;对于任何机器来说,它们都是指机器本身。[::1]:1234
server:5678
ssh_server
127.0.0.1
[::1]
要使隧道可供其他计算机使用,请将其绑定到它们可以访问的地址。假设192.168.0.14
是运行的客户端的有效地址ssh
;绑定到它:
ssh -L 192.168.0.14:1234:server:5678 ssh_server
或所有可用地址(选择一个命令):
ssh -L 0.0.0.0:1234:server:5678 ssh_server # IPv4
ssh -L [::]:1234:server:5678 ssh_server # IPv6
ssh -L 0.0.0.0:1234:server:5678 -L [::]:1234:server:5678 ssh_server # IPv4 and IPv6
后者最“开放”的隧道也可以用 创建-g
。从man 1 ssh
:
-g
允许远程主机连接到本地转发端口。
-g
相当于文件中的设置-o GatewayPorts=yes
。此摘录自GatewayPorts yes
ssh_config
man 5 ssh_config
解释得更好:
GatewayPorts
指定是否允许远程主机连接到本地转发端口。默认情况下,ssh(1)
将本地端口转发绑定到环回地址。这可防止其他远程主机连接到转发端口。GatewayPorts 可用于指定应将本地端口转发ssh
绑定到通配符地址,从而允许远程主机连接到转发端口。参数必须是yes
或no
。默认值为no
。
所以:
ssh -g -L 1234:server:5678 ssh_server
笔记:
- 不要忘记在防火墙上打开所选的端口。
- 你可能会发现
autossh
有用… - …以及
ExitOnForwardFailure
选项ssh
(解释于man 5 ssh_config
)。 - 通常,HTTP 服务器可能会拒绝它认为不是自己的 URL。您说的 URL
localhost:port
在浏览器中有效。如果像 URL 这样的 URLhttp://192.168.0.14:1234
尽管有隧道却不起作用,请检查服务器设置。
其他资源: