將 Azure 上的 Windows10 VM 配置為 SSH 伺服器以執行反向隧道
目的: 使用反向隧道(類似 ngrok 的服務)將在本地機器上執行的 Web 應用程序暴露給外界。
我有一個在 Azure 上執行的 Windows 10 Pro VM。我在那里安裝了 OpenSSH 伺服器,並使用本地埠轉發和動態埠轉發(襪子代理)對其進行了測試。兩者都工作正常。
但我似乎沒有讓反向隧道工作。
這是我在本地機器上使用的命令:
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。
任何幫助將非常感激。
我已經想出了解決方案。這是兩方面的:
- 我用
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 訪問我在 Internet 上在埠 5002 上本地執行的 Web 應用程序:
https://xx.xx.xx.xxx:5002/myapp
注意:按照上面評論中 John Hanley 的建議,我在網路介面 (Azure) 和 VM 作業系統上都啟用了 IP 轉發。但是在應用了上面提到的兩個步驟之後,我禁用了 IP 轉發,看看它是否仍然有效並且確實有效。