如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]

Posted

技术标签:

【中文标题】如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]【英文标题】:How to SSH to a VirtualBox guest externally through a host? [closed] 【发布时间】:2011-08-19 20:54:17 【问题描述】:

我有一个在我的 Windows 7 机器上运行的 Ubuntu 虚拟机。如何设置它以便我可以通过 SSH 从外部访问网络服务器?

我找到了步骤 (Setup SSH access between VirtualBox Host and Guest VMs) 可以从我的主机 ssh 到我的客人,但这仍然给我留下了通过路由器访问它的问题。

我想我可以在我的 Windows 机器上安装一个 SSH 服务器,然后隧道几次(尽管我不是 100% 确定在本地、动态等方面使用什么或如何设置多个隧道?),但是有没有办法让我的路由器直接访问虚拟机,以便我可以直接端口转发到它?

【问题讨论】:

有一种更简单的方法可以做到这一点,使用 Vagrant(从配置文件或 GUI 创建准备就绪的虚拟机(ssh-accessable、ip-accessable))。我不知道你的用例,但我在How to create an ssh-accessable Ubuntu server VM with Vagrant 上写了一个大型教程,当你想设置基于 LAMP 的开发机器时很有用。 Vagrant 是一个很棒的工具,但它与最新版本的 virtualbox 不兼容 最佳答案在下面:***.com/a/10410527/2214806 可以查看本教程wiki.workassis.com/virtualbox-ssh-between-host-and-guest 是否有一个新的、特定的地方来谈论虚拟化area51.meta.stackexchange.com/questions/28201/… 【参考方案1】:

将 VirtualBox 中的适配器类型更改为桥接,并设置来宾使用DHCP 或在 DHCP 范围之外设置静态IP address。这将导致虚拟机在您的家庭网络中充当普通访客。然后你就可以转发了。

【讨论】:

知道 2 适配器配置如何工作吗?一个在 NAT 上,另一个在主机上? 在我看来,将 VM 暴露在本地网络上并不是最好的选择(例如在办公室网络中),@vkostromin 提出的解决方案将 VM 封装在主机内。跨度> @VictorP。您能解释一下为什么它不是办公网络中的最佳选择吗?是出于安全考虑还是? 即使知道这不是最佳选择,在我当前的配置中,将适配器设置为桥接是唯一可行的解​​决方案。【参考方案2】:

保留 NAT 适配器并添加第二个仅主机适配器效果非常好,并且对于笔记本电脑(外部网络总是在变化)至关重要。

http://muffinresearch.co.uk/archives/2010/02/08/howto-ssh-into-virtualbox-3-linux-guests/

记得在virtualbox本身创建一个host-only网络(GUI -> settings -> network),否则你不能在guest上创建host-only接口。

【讨论】:

只有这个答案对我有用,没有别的。另外,我刚刚添加了额外的适配器,它可以工作,不需要编辑/etc/network/interfaces,谢谢! 同意这是最好的答案。否则,每次您想访问公共服务(sshsftp 等)时,您都会遇到麻烦,因为您必须通过非标准端口。 我更喜欢链接到 Internet Archive:web.archive.org/web/20160523035053/https://muffinresearch.co.uk/… - web.archive.org/web/20170701174835/http://christophermaier.name/… 是另一个很好的解释。 另一个很好的设置资源2buntu.com/articles/1513/… @Sparkler 正在运行 sshd?是否有防火墙关闭端口?【参考方案3】:

登录来宾 Linux VirtualBox VM 的最佳方式是port forwarding。默认情况下,您应该已经有一个使用NAT 的接口。然后进入网络设置并点击端口转发按钮。添加一个新的规则。作为规则名称,插入“ssh”。作为“主机端口”,插入 3022。作为“访客端口”,插入 22。规则的其他所有内容都可以留空。

或从命令行

VBoxManage modifyvm myserver --natpf1 "ssh,tcp,,3022,,22"

其中“myserver”是创建的虚拟机的名称。检查添加的规则:

VBoxManage showvminfo myserver | grep 'Rule'

就是这样!请确保您不要忘记在 VM 中安装 SSH 服务器:

sudo apt-get install openssh-server

要通过 SSH 访问来宾虚拟机,请编写:

ssh -p 3022 user@127.0.0.1

user 是您在 VM 中的用户名。

【讨论】:

@Keyslinger,这就是你要找的东西吗? ssh -p 3022 user@127.0.0.1 那是我错过的一步,只是去另一个网站找到。 我还添加了从 2020 到 80 的端口重定向,因此我可以使用 192.0.0.1:2020 从浏览器轻松访问 Apache。 VBoxManage modifyvm myserver --natpf1 "ssh,tcp,,2020,,80" thebigdog,可以直接无头:VBoxHeadless -s 'vmname' 为什么我们使用端口 3022 而不是默认的 22? 为了让生活更轻松,打开~/.ssh/config,在该文件中添加以下Host mybox HostName 127.0.0.1 User myuser Port 3022(自己添加缩进),然后每次只需要ssh mybox:)跨度> 【参考方案4】:

VirtualBox 文档中很好地解释了如何使用 NAT 配置端口转发: http://www.virtualbox.org/manual/ch06.html#natforward

【讨论】:

【参考方案5】:

只需将网络设置设置为桥接即可。

执行此操作时,您的 IP 将发生变化。但是,就我而言,它并没有立即改变。 ifconfig 返回相同的 IP。我重新启动了 vm 并繁荣,ip 设置为以 192.* 开头的一个,我立即被允许 ssh 访问。

【讨论】:

我猜测的这些信息在一般意义上部分甚至完全不准确,我不知道。 downvoter 懒得说。 也就是说,“对于某些人来说,它不起作用。”【参考方案6】:

在安全网络上,将您的网络设置为桥接可能不起作用。如果交换机在一个端口上检测到多个 MAC,管理员只能允许每个端口使用一个 MAC 地址,甚至更糟糕的是会阻止该端口。

在我看来,最好的解决方案是设置额外的网络接口来处理您希望在您的机器上运行的额外服务。因此,当我将笔记本电脑带回家时,我有一个桥接接口允许桥接,并且可以从网络上的其他设备通过 SSH 连接到它,并且当我想在连接时从笔记本电脑通过 SSH 连接到我的虚拟机时,我可以使用仅主机适配器到校园的eduroam wifi网络。

【讨论】:

【参考方案7】:

对于 Windows 主机,您可以:

    在虚拟机管理器中:
      在你的 virtualbox 管理器中选择 ctrl+G, 然后转到网络面板 添加专用网络
        确保未选择激活 DHCP
    在网络管理中 (windows)
      选择新创建的 virtualbox host only 适配器和物理网卡 右键单击并选择“制作桥梁”
    享受

【讨论】:

【参考方案8】:

您还可以在网络设置中使用桥接网络(或“桥接适配器”,在较新版本中)。这会将您的虚拟机与您的机器放在一个 VLAN 中。所以你可以像这样通过 ssh 进入虚拟机。

ssh 用户@IP_OF_VM

【讨论】:

使用此解决方案,SSH 连接是否跨局域网?【参考方案9】:

如何为 Solaris 10 和 Ubuntu 16.04 设置仅主机网络(better 而非桥接)

添加 Host-only 接口

    Virtualbox > 文件 > 首选项 > 网络 > 仅限主机的网络 > 添加 关闭虚拟机。 VM 的设置 > 网络。第一个适配器应该是 Nat,第二个是 Host-only。

    启动 cmd.exe 并运行 ipconfig /all。您应该看到以下线条:

    Ethernet adapter VirtualBox Host-Only Network:
       ...
       IPv4 Address. . . . . . . . . . . : 192.168.59.1
    

    guest 中的第二个适配器也应该在 192.168.59.*.

    启动虚拟机。

Solaris 10

    检查settingsifconfig -a。您应该看到 e1000g0 和 e1000g1。我们对 e1000g1 感兴趣。 ifconfig e1000g down ifconfig e1000g 192.168.56.10 netmask 255.255.255.0 up 从主机检查此接口是否可达:ping 192.168.56.10

重启时保留这些设置

# vi /etc/hostname.e1000g1
192.168.56.10 netmask 255.255.255.0
# reboot

Configure ssh 服务 (administering) 以 root 身份登录(不建议)

检查 ssh 是否启用

# svcs -a | grep ssh
online         15:29:57 svc:/network/ssh:default

修改 /etc/ssh/sshd_config 所以有

PermitRootLogin yes

重启ssh服务

svcadm restart ssh

从主机检查它

ssh root@192.168.56.10

Ubuntu 16.04

列出接口:

ip addr

您应该看到三个接口,例如 lo、enp0s3、enp0s8。我们将使用第三个。

编辑 /etc/network/interfaces

auto enp0s8
iface enp0s8 inet static
    address 192.168.56.10
    netmask 255.255.255.0

然后sudo ifup enp0s8。检查 enp0s8 是否得到正确的地址。你应该看到你的ip:

 $ ip addr show enp0s8
 ...
    inet 192.168.56.10/24 brd 192.168.56.255 scope global secondary enp0s8

如果没有,你可以运行sudo ifdown enp0s8 && sudo ifup enp0s8

https://superuser.com/questions/424083/virtualbox-host-ssh-to-guest/424115#424115

【讨论】:

如果您的仅主机网络位于 192.168.59.1 并且您为静态访客 IP 指定 192.168.56.10,则此方法不起作用。整个 C 类子网地址必须完全匹配,因此您必须在来宾内部使用 192.168.59.10 之类的东西。【参考方案10】:

您还可以从您的访客发起到您的主机或任何其他服务器的端口转发。如果您的访客被“锁定”或无法以其他方式完成 ModifyVM 选项(例如,没有 VBoxManage 权限),这将特别有用。

三个次要要求是 1)您是/可以登录 VirtualBox 来宾(通过“控制台”GUI、另一个来宾等),2)您在 VirtualBox 主机(或其他服务器)上有一个帐户,以及 3) SSH 和 TCP 转发没有被阻止。

假设您可以满足 3 个要求,以下是步骤:

    在客户机上,运行netstat -rn 并找到默认路由目标 0.0.0.0 的网关地址。假设它是“10.0.2.2”。此“网关”地址是 VirtualBox Host 虚拟 IP 之一。 在客户机上,运行ssh -R 2222:localhost:22 10.0.2.2,其中“10.0.2.2”是 VirtualBox 服务器的 IP 地址 - 或 - 您希望端口转发到的任何其他服务器 IP。 在主机上,运行ssh 10.0.2.2 -p2222,其中 10.0.2.2 是在步骤 1 中找到的默认网关/VBHost 虚拟 IP。如果它不是您要端口转发到的 VirtualBox 主机,则命令为ssh localhost -p2222

【讨论】:

【参考方案11】: 从 INTERNET SSH 回到您的家/办公室 VirtualBox 访客机器

其他用户在这里提供的答案:How to SSH to a VirtualBox guest externally through a host?

...帮助我完成了从互联网连接到我家计算机的访客机器的任务。您应该能够使用计算机、平板电脑和智能手机(android、iPhone 等)进行连接。我再添加几个步骤以防对其他人有帮助:

这是我的设置的快速图表:

Remote device ---> INTERNET --> MODEM --> ROUTER --> HOST MACHINE --> GUEST VM

Remote device (ssh client) ---> PASS THRU DEVICES ---> GUEST VM (ssh server)

Remote device (leave ssh port 3022) ---> INTERNET --> MODEM --> ROUTER (FWD frm:p3022 to:p3022)--> HOST MACHINE (FWD frm:p3022 to:p22) --> GUEST VM (arrive ssh port 22)

对我来说,关键是要意识到所有连接都是PASSING-THROUGH 中间设备,用于从我的远程 PC 到我家中的来宾虚拟机——因此端口转发!

注意事项: * 需要 ssh 客户端请求安全连接和运行 ssh 服务器来处理安全连接。

我将转发上面选择的答案中使用的端口 3022。

在需要的地方输入您的 IP(家庭调制解调器/路由器、主机 IP、访客 IP 等),选择的名称只是示例 - 使用或更改。

1.在调制解调器的 IP/路由器的外部 IP 地址上创建到端口 3022 的 ssh 隧道。

ssh client/device possible commands: ssh -p 3022 user-name@home_external_IP

2.Port forward = 我们正在通过从路由器到主机的连接

还要确保路由器上的防火墙/IPtable 规则允许端口转发(如果需要,打开)

路由器的 Pfwd SCREEN 所需条目:AppName:SSH_Fwd, Port_from: 3022, Protocol:both (UDP/TCP), IP_address:hostIP_address, Port_to:3022,其他都可以为空

DD-WRT路由器软件资源/信息:

DD-WRT Port_Forwarding

DD-WRT Static_DHCP

3.主机防火墙:开放3022端口#这样转发的端口就可以通过来宾机器

主机:安装 VirtualBox、来宾添加和来宾计算机(如果尚未完成)

配置客户机,然后按照下面的网络部分进行操作

我使用 VirtualBox GUI 来设置访客的网络 - 比 CLI 更容易

如果你想使用其他方法参考:VirtualBox/manual/ch06.html#natforward

4.有些人建议使用网桥适配器让访客=访问局域网和局域网上的其他机器。这也会增加安全风险,因为如果防火墙设置不正确,您的访客机器现在会暴露给 LAN 机器,并且可能会受到 INTERNET 黑客的攻击。因此,我选择了连接到 NAT 的网络适配器,以减少桥接安全风险。

在客户机上执行以下操作:

来宾机器 VirtualBox 网络设置:适配器 1:附加到 NAT 访客机器 VirtualBox 端口转发规则:名称:External_SSH,协议:TCP,主机端口:3022,访客端口 22,主机和访客 IP:留空 点击网络部分的高级,然后点击端口转发进入规则 访客机器防火墙:开放22端口#so ssh连接可以进入 Guest Machine:确保 ssh 服务器已安装、配置正确且正在运行 LINUX 测试以查看 ssh 服务器是否正在运行以下命令:sudo service ssh status 可以检查 netstat 以查看是否与客户机上的端口 22 建立了连接

根据使用的平台,还有不同的 ssh 服务器和客户端。

wikipedia/Secure_Shell wikipedia/Comparison_of_SSH_servers wikipedia/Comparison_of_SSH_clients

对于 Ubuntu 用户:

ubuntu community: SSHOpenSSH/Configuring ubuntu/community: OpenSSH/Keys

应该是这样的。如果我犯了错误或想添加任何内容-请随意-我仍然是菜鸟。

希望这对某人有所帮助。祝你好运!

【讨论】:

【参考方案12】:

使用 NAT 网络适配器并添加端口转发。提及实际主机 ip。请勿使用 127.0.0.1 或 localhost。

【讨论】:

【参考方案13】:

按照以下步骤,使用 putty 从主机登录到在虚拟机中运行的 ubuntu VM(无端口转发):

    在 Virtualbox 管理器上选择虚拟机,点击设置图标。然后转到网络并启用两个适配器,如下所示:

    适配器 1(用于 Internet 访问):连接到 -> NAT,高级 -> 检查连接的电缆。 适配器 2:已连接到 -> 仅主机适配器,高级 -> 检查连接的电缆和混杂模式 -> 全部允许。

    启动 ubuntu 虚拟机。

    以 root 身份登录虚拟机。

    如下编辑文件'/etc/network/interfaces'并保存:

    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet dhcp
    
    auto eth1
    iface eth1 inet dhcp
    

    重启虚拟机。

    登录虚拟机并运行以下命令检查分配给 eth1 的 IP:

    ifconfig
    

    使用此 IP 为 VM 打开 putty 会话。

【讨论】:

【参考方案14】:

为了从您的主机通过 ssh 连接到在 VirtualBox 中运行的 Ubuntu VM,您需要为该 VM 设置两个网络适配器。

首先,如果还没有,请停止 VM。

然后选择VM并点击VirtualBox工具栏中的设置菜单:

设置适配器 1

设置适配器 2

(注意:您不需要设置任何端口转发。)

就是这样。设置完成后,您可以启动虚拟机。在您的 VM 中,网络配置如下所示,您也可以访问 Internet:

同样在您的主机中,您可以通过 ssh 连接到您的虚拟机:

确保 SSH 服务器已安装并在 VM 中运行。

$ ps aux | grep sshd
root 864 0.1 0.5 65512 5392 ? Ss 22:10 0:00 /usr/sbin/sshd -D

如果没有,请安装它:

$ sudo apt-get install openssh-server

也供您参考:

我的 VirtualBox 版本:5.2.6 r120293 (Qt5.6.2), 2018 我的 Ubuntu 版本:Ubuntu 16.04.3 LTS 我的主机:Windows 10

【讨论】:

如果您没有任何仅主机适配器,您可以从以下位置创建一个:File > Host Network Manager > Create 遗憾的是它没有连接到互联网 这种方法很好,因为您还可以从 HOST 和非 HOSTS 机器访问您的 VM。太棒了!【参考方案15】:

Ubuntu 18.04 LTS

使用桥接配置查看服务器 ip,并在没有“端口转发”的情况下连接

VirtualBox > 右键单击​​服务器 > 设置 > 网络 > 启用适配器 2 > 选择“桥接” > 混杂模式:全部允许 > 检查连接的电缆 > 启动服务器

在 ubuntu 服务器上,编辑 sudo nano /etc/netplan/*init.yaml 文件,

我的示例文件:

network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
        enp0s8:
            addresses: [192.168.0.200/24]
            dhcp4: no
            dhcp6: no
            nameservers:
               addresses: [8.8.8.8, 8.8.4.4]
    version: 2

对您有帮助的命令

nano /etc/netplan/file.yaml     # file to specify the rules of network
reboot now                      # restart ubuntu server right now
netplan apply                   # do after edited *.yaml, to apply changes
ifconfig -a                     # show interfaces with ip, netmask, broadcast, etc...
ping google.com                 # to see if there is internet

Configure Static IP Addresses On Ubuntu 18.04 LTS Server - with NetPlan

【讨论】:

以上是关于如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代理跳转(堡垒主机)通过 ssh 隧道连接到 mongodb 服务器

如何使用 Fabric 通过 2 个网关将 SSH 隧道连接到远程主机?

如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)

从 MySQL 客户端通过 AWS 堡垒主机连接到 MySQL RDS 实例

如何通过 SSH 连接到 MySQL Docker 容器?

连接到 ssh 远程主机(在 *** 网络中)超时