SSH隧道应用1:访问同一内网中某主机内的虚拟机


0. 前言

采用SSH隧道,可以访问同一内网中某主机内的虚拟机。

(无用之用,方为大用)

博主于实验室内,出于某种不可告人的需求,指懒得迁移和同步虚拟机数据,要用台式机访问笔记本中的虚拟机。遂成此文。

下面将从以下几个方面进行说明:

  1. 应用情境与配置需求
  2. SSH与SSH Tunnel
  3. SSH Client与SSH Server安装与配置
  4. 建立SSH隧道——访问同一内网中某主机内的虚拟机
  5. Plus: 建立内网Git仓库/使用内网编程环境

文末附参考链接。

1. 应用情境与配置需求

本节进行SSH隧道应用情境的说明,以及相应的配置需求。

1.1 应用情境

博主于实验室内,由于懒得迁移和同步虚拟机数据,要用内网中的台式机,访问同一内网下笔记本中的虚拟机,其中虚拟机采用NAT模式。

遂想到SSH隧道——本地端口转发的方法。

对于此情境,不难总结出以下内容:

  1. 台式机D(Desktop)和笔记本L(Laptop)位于同一内网中;
  2. L是虚拟机V(virtual machine)的宿主机;
  3. D可以访问L,D不可以访问V,但L可以访问V。

进一步抽象出以下情境:

  1. 主机V的某端口提供某服务;
  2. 主机D需要该服务却无法访问主机V或主机V的该端口,但主机L可以;
  3. 而主机D又可以访问主机L。

于是有了这样一个思路:将主机L作为转发服务器/代理,连接V与L:

  1. 方法:SSH与端口转发
  2. 数据通路:SSH隧道

1.2 配置需求

Host IP User Name OS SSH Ohters
D 192.168.3.91 94416 Win11 SSH Client same intranet
L 192.168.3.165 Duck Win11 SSH Server same intranet
V 192.168.18.130 ws Ubuntu Default SSH Virtual Machine in L, NAT

P.S. Windows 11自带了SSH Client,但无SSH Server(按需安装);Linux类系统多自带SSH(使用即可)。

2. SSH与SSH Tunnel

本节对SSH和SSH Tunnel进行了介绍,由ChatGPT协助生成。

2.1 SSH

SSH,全称Secure Shell,是一种用于在不安全网络上进行加密通信的协议和工具集合。它旨在提供安全的远程访问和数据传输,确保敏感信息在互联网上的传输过程中不受到窃听和篡改的威胁。SSH 是一种取代了传统的 Telnet 和 rlogin 等不安全远程访问协议的安全解决方案。

SSH 的主要特点包括:

  1. 加密通信: SSH 使用加密技术来保护数据在传输过程中的安全性,使得黑客难以窃听用户的敏感信息。

  2. 身份验证: SSH 提供多种身份验证方法,包括密码、公钥、证书等。其中,公钥认证是一种常用的安全身份验证方式,能够防止密码被截获并减少暴力破解的风险。

  3. 端口转发: SSH 支持端口转发功能,使得用户可以在安全通道内传输其他协议的流量,从而增加了网络服务的安全性。

  4. 远程访问: SSH 允许用户在远程服务器上执行命令,实现远程管理和维护。

  5. 文件传输: SSH 还提供了安全的文件传输协议,如 SCP(Secure Copy Protocol)和 SFTP(SSH File Transfer Protocol),使用户可以在本地系统和远程服务器之间传输文件。

  6. 代理功能: SSH 可以用作代理服务器,为用户提供安全的隧道以绕过网络限制或保护其隐私。

SSH 通常由两个组件组成:SSH 客户端SSH 服务器。用户使用 SSH 客户端连接到远程 SSH 服务器,进行远程管理、文件传输等操作。常用的 SSH 客户端工具包括 OpenSSH、PuTTY(Windows 环境下)、SSH Secure Shell 等。

总之,SSH 是一种广泛应用于网络安全领域的协议,能够提供安全的远程访问和数据传输,帮助保护用户敏感信息免受网络威胁。

2.2 SSH Tunnel

SSH隧道(SSH tunnel)是通过SSH协议建立的加密通道,用于在不安全的网络上传输数据,同时保护数据的机密性和完整性。这种隧道可以用于多种用途,包括绕过网络限制、保护隐私、安全访问远程服务等。SSH隧道的工作原理是将一种网络流量通过SSH连接加密传输到另一个网络端点。

有两种主要类型的SSH隧道:本地端口转发和远程端口转发。

  1. 本地端口转发: 本地端口转发允许你在本地计算机上创建一个加密的SSH连接,然后将来自本地计算机的特定端口的流量转发到远程服务器的指定端口。这在以下情况下很有用:访问受限的服务、加密流量以保护隐私,或者将本地服务暴露给远程网络。

  2. 远程端口转发: 远程端口转发允许你在远程服务器上创建一个加密的SSH连接,然后将来自远程服务器的特定端口的流量转发到本地计算机的指定端口。这对于访问本地网络上的服务或资源,而不必直接将它们暴露在互联网上,是非常有用的。

使用SSH隧道时,流量在本地计算机和远程服务器之间进行加密传输,从而确保数据的安全性。这种加密通信阻止了潜在的窃听者从拦截、监视或篡改数据。

3. SSH Client与SSH Server安装与配置

本节进行SSH Client和SSH Server的安装与配置说明。一般来说,只在Windows系统安装即可,Linux系统大多自带SSH相关服务组件。

此外,在Windows中安装时,建议以管理员身份打开PowerShell进行安装

3.1 SSH Client和SSH Server安装

以管理员身份运行 PowerShell,并输入以下命令:

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

如果两者均尚未安装,则此操作应返回以下输出:

Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

然后,根据需要安装服务器或客户端组件:

# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

这两者应该都会返回以下输出:

Path          :
Online        : True
RestartNeeded : False

3.2 SSH Server启动与配置

以管理员身份运行 PowerShell,并输入以下命令:

# Start the sshd service
Start-Service sshd

(可选)将服务设置为自动启动,若不设置,则每次开机都需要手动启动sshd服务。

# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'

检查并创建防火墙规则:

# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}

4. 建立SSH隧道——访问同一内网中某主机内的虚拟机

本节介绍SSH隧道的建立。核心为SSH本地端口转发

4.1 SSH连接测试

1.2 配置需求中,已经介绍了内网中各个主机的信息,这里可以进行一些简易测试。

例如,在L中启动sshd服务:

(base) PS C:\Windows\system32> Start-Service sshd
(base) PS C:\Windows\system32>

在D中使用ssh命令进行连接(参数-p及其对应的内容可以省略,默认22端口):

PS C:\Windows\system32> ssh -p 22 Duck@192.168.3.165
Duck@192.168.3.165's password:

输入密码后,成功连接到L:

duck@LAPTOP-XXXXXXXX C:\Users\Duck>

4.2 建立SSH隧道

内网中各个主机的信息已经在1.2 配置需求中介绍,下面进行SSH隧道的建立。

  1. 对于L,启动sshd服务:

    Start-Service sshd
  2. 对于V,作为L的虚拟机,确保已经启动,并可以与L正常进行SSH通信即可。

  3. 对于D,首先进行本地端口转发:

    PS C:\Windows\system32> ssh -L 22022:192.168.18.130:22 Duck@192.168.3.165
    Duck@192.168.3.165's password:

    上述命令中,-L用于指定本地转发的端口,后续内容用 : 分隔开。

    其中,22022为本机(D)用于转发的端口;192.168.18.130:22为虚拟机的IP和SSH端口;Duck@192.168.3.165为主机L的用户名和主机名。

    输入密码后,可以看到已经连接到L:

    duck@LAPTOP-XXXXXXX C:\Users\Duck>

    保持此命令行窗口/PowerShell对应的SSH连接不要断开。

  4. 随后,仍然在D中,可以另开一个命令行窗口/PowerShell,并输入以下命令:

    ssh -p 22022 ws@127.0.0.1

    其中,22022为上述设置的本地转发端口,ws为虚拟机的用户名,这里需要特别注意。

    输入密码后,可以看到已经与虚拟机成功连接:

    PS C:\Windows\system32> ssh -p 22022 ws@127.0.0.1
    ws@127.0.0.1's password:
    Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-78-generic x86_64)
    ...
    Your Hardware Enablement Stack (HWE) is supported until April 2025.
    Last login: Sun Aug  6 22:12:49 2023 from 192.168.18.1
    ws@ws-virtual-machine:~$

    可以与虚拟机进行交互:

    ws@ws-virtual-machine:~$ ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.18.130  netmask 255.255.255.0  broadcast 192.168.18.255
            inet6 fe80::10fa:4a3c:7d8f:174b  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:ae:ce:cd  txqueuelen 1000  (Ethernet)
            RX packets 1165  bytes 417587 (417.5 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 373  bytes 46929 (46.9 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 192  bytes 16166 (16.1 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 192  bytes 16166 (16.1 KB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ws@ws-virtual-machine:~$

    连接成功。

5. Plus: 建立内网Git仓库/使用内网编程环境

在与虚拟机连接成功后,我们可以进行一些操作以获取更好的体验。

5.1 建立内网Git仓库

我们可以指定主机L或者虚拟机V作为内网Git仓库,便于小组开发、代码管理与维护。这里属于Git的范畴,不再赘述。

5.2 使用内网编程环境

在一些场景中,小组内成员需要使用同样的环境进行Coding。我们可以依赖VS Code,结合Remote SSH插件等,进行远程开发,使用相同的环境进行编程。

具体操作如下:

4.2 建立SSH隧道中,前3点操作相同,将第4点在VS Code的Remote SSH对应的配置文件中进行配置即可:

Host remoteVM
    HostName 127.0.0.1
    User ws
    Port 22022

随后依照常规的VS Code远程开发步骤即可。

Done.

参考链接

SSH Client and SSH Server :

https://learn.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_install_firstuse#install-openssh-using-windows-settings

SSH Tunnel and Port Forwad:

https://www.ssh.com/academy/ssh/tunneling

https://zhuanlan.zhihu.com/p/148825449

https://blog.csdn.net/xiezhaoxuan/article/details/72974429

https://www.cnblogs.com/ayanmw/p/15792727.html

AI Cooperator :

https://chat.openai.com/


文章作者: 好想摸鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 好想摸鱼 !
评论
  目录