在 Azure 上配置 Windows10 VM 作为 SSH 服务器以执行反向隧道

在 Azure 上配置 Windows10 VM 作为 SSH 服务器以执行反向隧道

目的: 使用反向隧道(类似 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

以下是我为 Azure VM 配置入站端口规则的方法: 在此处输入图片描述

以下是出站端口规则。我甚至暂时允许所有端口。 在此处输入图片描述

这是sshd_configAzure VM 上的文件。我做的唯一更改是设置GatewayPortsyes

# 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文件相同。GatewayPortsyes

请注意:我不是网络方面的专家。还有其他教程和操作指南介绍如何使用 Linux VM 进行同样的操作。但我只想利用现有的 Windows VM。

任何帮助将非常感激。

答案1

我已经找到解决办法了。它有两个方面:

  1. 我使用了ssh -R '*:5002:localhost:5002' xx.xx.xx.xxx而不是ssh -R 5002:localhost:5002 xx.xx.xx.xxx。星号使它sshd监听所有接口上的端口 5002。否则它只会监听环回接口。
  2. 我还必须在 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 转发以查看它是否仍然有效,结果确实有效。

相关内容