目的: 使用反向隧道(类似 ngrok 的服务)将本地机器上运行的 Web 应用程序暴露给外界。
我在 Azure 上运行 Windows 10 Pro VM。我在那里安装了 OpenSSH 服务器,并使用本地端口转发和动态端口转发(socks 代理)对其进行了测试。两者都运行良好。
但我似乎无法让反向隧道发挥作用。
这是我在本地机器上使用的命令:
ssh -R 5002:localhost:5002 xx.xx.xx.xxx
其中,xx.xx.xx.xxx 是 Azure 上 Win10 VM 的公共 IP。5002 是我的 Web 应用程序在本地计算机上运行的端口,我也希望为 Azure VM 保留相同的端口。
上述命令提示我输入密码,输入密码后,终端上显示以下提示,这可能表明连接成功。
me@VMW10Pro C:\Users\me>
但是当我尝试访问本地运行的 Web 应用程序时,如下所示,什么也没有发生:
https://xx.xx.xx.xxx:5002/myapp
我也尝试过,但没有成功:
http://xx.xx.xx.xxx:5002/myapp
这是sshd_config
Azure VM 上的文件。我做的唯一更改是设置GatewayPorts
为yes
:
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
#HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
#AuthorizedPrincipalsFile none
# For this to work you will also need host keys in %programData%/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
#AllowAgentForwarding yes
#AllowTcpForwarding yes
GatewayPorts yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp sftp-server.exe
# Example of overriding settings on a per-user basis
#Match User anoncvs
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
我本地机器上的文件也与上面设置为 的sshd_config
文件相同。GatewayPorts
yes
请注意:我不是网络方面的专家。还有其他教程和操作指南介绍如何使用 Linux VM 进行同样的操作。但我只想利用现有的 Windows VM。
任何帮助将非常感激。
答案1
我已经找到解决办法了。它有两个方面:
- 我使用了
ssh -R '*:5002:localhost:5002' xx.xx.xx.xxx
而不是ssh -R 5002:localhost:5002 xx.xx.xx.xxx
。星号使它sshd
监听所有接口上的端口 5002。否则它只会监听环回接口。 - 我还必须在 Azure Win10 VM 的 Windows Defender 防火墙中允许端口 5002。
这样就成功了。现在我可以通过互联网使用 Azure VM 公共 IP 访问在端口 5002 上本地运行的 Web 应用程序:https://xx.xx.xx.xxx:5002/myapp
注意:我按照 John Hanley 在上述评论中的建议,在网络接口 (Azure) 和 VM OS 上启用了 IP 转发。但在应用上述两个步骤后,我禁用了 IP 转发以查看它是否仍然有效,结果确实有效。