如何通过主机从外部连接到VirtualBox客户机的SSH?

661

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

我找到了步骤(在VirtualBox主机和客户机之间设置SSH访问),能够从我的主机ssh到我的客户机,但仍然存在通过我的路由器访问的问题。

我想我可以在我的Windows机器上安装一个SSH服务器,然后进行多次隧道(虽然我不确定要使用本地、动态等哪些选项,或者如何设置多个隧道?),但有没有办法使虚拟机直接可访问我的路由器,以便我可以直接端口转发到它上面?


3
使用Vagrant可以更轻松地完成这个任务,它可以通过配置文件或GUI创建可用于SSH访问和IP访问的虚拟机。我不知道你的具体情况,但我已经撰写了一篇[如何使用Vagrant创建可用于SSH访问的Ubuntu服务器虚拟机](http://www.dev-metal.com/setup-virtual-machine-multiple-vagrant-puphpet/)的大型教程,当你想要设置一个基于LAMP的开发环境时非常有用。 - Sliq
1
Vagrant是一个很棒的工具,但它不兼容较新版本的VirtualBox。 - LizH
3
最佳答案在下方: https://dev59.com/Wm025IYBdhLWcg3wnXSf#10410527该答案解释了如何使用Java编写一个基本的TCP客户端程序,并与服务器进行通信。它包括通过套接字建立连接,发送和接收数据以及关闭连接等步骤。如果您正在寻找有关此主题的信息,这是一篇非常有用的文章。 - Michael
您可以查看此教程http://wiki.workassis.com/virtualbox-ssh-between-host-and-guest/。 - Bikesh M
认为建立一个新的、专门的讨论虚拟化的地方可能会很有用。请参考以下链接:https://area51.meta.stackexchange.com/questions/28201/proposal-for-a-site-about-virtualization - realtebo
15个回答

1354

登录Linux虚拟机的最佳方式是端口转发。默认情况下,您应该已经有一个使用NAT的接口。然后转到网络设置并单击端口转发按钮。添加一个新的规则。将规则名称设置为“ssh”。在“主机端口”中插入3022,在“虚拟机端口”中插入22。规则的其他所有内容都可以留空。

或者从命令行执行

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

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

VBoxManage showvminfo myserver | grep 'Rule'

就这些!请务必不要忘记在虚拟机中安装SSH服务器:

sudo apt-get install openssh-server

要SSH进入客户机VM,请输入:

ssh -p 3022 user@127.0.0.1

其中user是您在虚拟机中的用户名。


26
@Keyslinger,这是您在寻找的内容吗? ssh -p 3022 user@127.0.0.1 这是我之前遗漏的一步,后来在另一个网站上找到了它。 - D. Woods
10
我也添加了从2020端口到80端口的重定向,这样我就可以通过http://192.0.0.1:2020在浏览器中轻松访问Apache。VBoxManage modifyvm myserver --natpf1 "ssh,tcp,,2020,,80"。 - Eduardo Russo
4
thebigdog,您可以直接运行无界面模式: VBoxHeadless -s 'vmname' - vkostromin
6
为什么我们使用3022端口而不是默认的22端口? - Seraphim
4
为了让生活更轻松,打开~/.ssh/config文件,将以下内容“Host mybox HostName 127.0.0.1 User myuser Port 3022”添加到该文件中(请自行缩进),然后每次只需要输入“ssh mybox”即可 :) - vancexu
显示剩余30条评论

131

在VirtualBox中将适配器类型更改为桥接,然后将客户机设置为使用DHCP或设置一个静态IP地址,超出DHCP的范围。这将使虚拟机在您的家庭网络上像普通客户机一样运行。然后,您可以进行端口转发。


2
有没有想法如何使2个适配器配置工作?一个在NAT上,另一个在Host Only上? - CantGetANick
16
我认为将虚拟机暴露在本地网络中并不是最好的选择(例如在办公室网络中),@vkostromin 提出的解决方案保持了虚拟机在主机内部的封装。 - Victor P.
2
@VictorP. 你能否解释一下为什么在办公网络中这不是最佳选择?是因为安全性问题还是其他原因? - mdo123
1
即使知道这不是最佳选择,在我的当前配置中,将适配器设置为桥接是唯一可行的解决方案。 - James

70

2
只有这个答案对我起了作用,其他的都没有。另外,我只是添加了一个适配器就可以了,不需要编辑/etc/network/interfaces,谢谢! - brokenfoot
3
同意,这是最好的答案。否则,每次想访问常见服务(如sshsftp等),都需要绕过非标准端口,这样做就像是在跳跃障碍。 - Kirk Woll
1
我更喜欢链接到互联网档案馆:https://web.archive.org/web/20160523035053/https://muffinresearch.co.uk/howto-ssh-into-virtualbox-3-linux-guests/ - https://web.archive.org/web/20170701174835/http://christophermaier.name/2010/09/01/host-only-networking-with-virtualbox/ 是另一个很好的解释。 - Ben Creasy
1
另一个设置此项的好资源:https://2buntu.com/articles/1513/accessing-your-virtualbox-guest-from-your-host-os/ - mdo123
1
@Sparkler sshd运行了吗?是否有防火墙关闭了端口? - orip
显示剩余2条评论

27
您还可以在网络设置中使用桥接网络(或“桥接适配器”在较新的版本中)。这将使您的虚拟机与主机处于同一VLAN中。因此,您只需像这样ssh进入虚拟机即可。

ssh user@VM的IP地址


这个解决方案是否可以通过局域网进行SSH连接? - user2233706

24

如何在Solaris 10和Ubuntu 16.04上进行仅主机网络(比桥接更好

添加仅主机接口

  1. Virtualbox > File > Preferences > Network > Host-only Networks > Add
  2. Shutdown vm.
  3. VM's Settings > Network. First adapter should be Nat, second Host-only.
  4. Start cmd.exe and run ipconfig /all. You should see lines:

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

    Second adapter in guest should also be in 192.168.59.*.

  5. Start VM.

Solaris 10

  1. 检查设置ifconfig -a。你应该看到e1000g0和e1000g1。我们对e1000g1感兴趣。
  2. ifconfig e1000g down
  3. ifconfig e1000g 192.168.56.10 netmask 255.255.255.0 up
  4. 从主机检查这个接口是否可达:ping 192.168.56.10

保留这些设置以便在重新启动时使用

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

配置ssh服务管理)以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


3
如果您的主机网络是192.168.59.1,并且您为静态客户机IP指定了192.168.56.10,则此方法将无效。整个C类子网地址必须完全匹配,因此您必须在客户机中使用类似192.168.59.10的地址。请注意不要改变原文的意思。 - Quolonel Questions

19
为了从主机机器上的终端连接到在VirtualBox中运行的Ubuntu虚拟机,您需要为该虚拟机设置两个网络适配器。
首先,如果虚拟机还未停止,请将其停止。
然后选择该虚拟机并点击VirtualBox工具栏中的“设置”菜单:

enter image description here

设置适配器 1

enter image description here

设置适配器2

enter image description here

(注意:您不需要设置任何端口转发。)
就这样,一旦设置完成,您就可以启动虚拟机了。在您的虚拟机中,网络配置将如下所示,并且您也可以访问互联网:

enter image description here

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

enter image description here

请确保虚拟机中已安装并运行了SSH服务器。

$ 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

1
如果您没有任何主机专用适配器,您可以从以下位置创建一个:文件 > 主机网络管理器 > 创建 - Cirelli94
1
它可悲地没有连接到互联网网络。 - Cirelli94
这种方法很好,因为您可以从主机和非主机机器上访问您的虚拟机。太棒了! - Laenka-Oss

5

对于Windows主机,您可以:

  1. 在虚拟机管理器中:
    1. 选择虚拟机管理器中的 ctrl+G,
    2. 然后进入网络面板
    3. 添加一个私有网络
      1. 确保未选中启用DHCP
  2. 在网络管理(Windows)中
    1. 选择新创建的VirtualBox Host-Only Adapter和物理网络适配器
    2. 右键单击并选择“制作桥接”
  3. 享受吧

5
从INTERNET SSH回到您的家/办公室VirtualBox客户机

其他用户提供的答案: 如何通过主机从外部SSH到VirtualBox客户机?

……帮助我完成了从Internet连接到我的家庭计算机的guest虚拟机的任务。您应该能够使用计算机,平板电脑和智能手机(Android,iPhone等)进行连接。以下是一些额外步骤,以防对其他人有所帮助:

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

  • 远程设备 ---> INTERNET --> MODEM --> 路由器 --> 主机机器 --> GUEST VM

  • 远程设备 (SSH客户端) ---> PASS THRU DEVICES ---> GUEST VM (SSH服务器)

  • 远程设备 (保留ssh端口3022) ---> INTERNET --> MODEM --> ROUTER (FWD frm:p3022 to:p3022)--> HOST MACHINE (FWD frm:p3022 to:p22) --> GUEST VM (arrive ssh port 22)

对我来说关键是要意识到ALL connections都是通过中介设备从我的远程PC到达家中的guest虚拟机 - 因此需要端口转发!

注意: * 需要SSH客户端请求安全连接和一个运行的SSH服务器来处理安全连接。

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

  • 在需要的地方输入您的IP(家用调制解调器/路由器,主机IP,guest IP等)。所选名称仅为示例-使用或更改。

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

SSH客户端/设备可能的命令:ssh -p 3022 user-name@home_external_IP

2.端口转发=我们正在从路由器通过连接到主机计算机

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

  • 路由器的Pfwd SCREEN需要输入:AppName: SSH_Fwd,Port_from: 3022,Protocol: both(UDP/TCP),IP_address: hostIP_address,Port_to: 3022,其他内容可以留空

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

3.主机防火墙:开放端口3022 #以便转发端口可以通过到客户机

  • 主机:如果尚未安装VirtualBox、增强功能和客户机,请先安装它们

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

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

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

4.一些人建议为客户机使用网络桥接适配器=访问LAN和LAN上的其他计算机。这也会带来增加的安全风险,因为现在您的客户机暴露给了LAN机器,如果防火墙没有正确设置,则可能会暴露给INTERNET黑客。因此,我选择将网络适配器附加到NAT以减少桥接安全风险的曝光。

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

  • 客户机VirtualBox网络设置:适配器1:附加到NAT
  • 客户机VirtualBox端口转发规则:名称:External_SSH,协议:TCP,主机端口:3022,客户端口22,主机和客户端IP:留空
  • 在网络部分中单击高级,然后单击端口转发以输入规则
  • 客户机防火墙:开放端口22 #以便ssh连接可以进入
  • 客户机:确保安装了ssh服务器,并进行了适当的配置和运行
  • LINUX测试是否运行ssh服务器w/command:sudo service ssh status
  • 可以检查netstat是否连接到客户机上的端口22

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

  • wikipedia/Secure_Shell
  • wikipedia/Comparison_of_SSH_servers
  • wikipedia/Comparison_of_SSH_clients

对于Ubuntu用户:

  • ubuntu社区:SSHOpenSSH/Configuring
  • ubuntu/community: OpenSSH/Keys

就是这样。如果我犯了错误或想添加任何内容-请随意这样做-我仍然是一个新手。

希望这能帮助某些人。祝好运!


4
您还可以从虚拟机客户机向主机或任何其他服务器发起端口转发。如果您的虚拟机客户机被“锁定”或无法完成ModifyVM选项(例如没有VBoxManage权限),这将非常有用。
假设您能够满足以下三个要求:1)您可以通过“控制台”GUI、另一个客户机等方式登录到VirtualBox Guest,2)您在VirtualBox HOST(或其他服务器)上拥有帐户,3)SSH和TCP转发未被阻止。那么,请按照以下步骤操作:
1. 在Guest上运行netstat -rn并找到默认路由目标0.0.0.0的网关地址。假设它是“10.0.2.2”。该“网关”地址是VirtualBox Host虚拟IP之一。
2. 在Guest上运行ssh -R 2222:localhost:22 10.0.2.2,其中“10.0.2.2”是VirtualBox服务器的IP地址或您希望进行端口转发的任何其他服务器IP。
3. 在Host上运行ssh 10.0.2.2 -p2222,其中10.0.2.2是步骤1中找到的默认网关/VBHost虚拟IP。如果不是要进行端口转发的VirtualBox主机,则命令为ssh localhost -p2222

4

以下是使用putty从主机登录虚拟机中运行的Ubuntu VM的步骤(无需端口转发):

  1. On Virtualbox manager select the vm, click on settings icon. Then go Networks and enable two adaptors as below:

    • Adaptor 1 (For internet access): Attached to -> NAT, Advanced -> Check the cable connected.
    • Adaptor 2: Attached to -> Host only adaptor, Advanced -> Check the cable connected and Promiscuous mode -> Allow all.
  2. Start the ubuntu vm.

  3. Login to the VM as root.
  4. Edit the file '/etc/network/interfaces' as below and save it:

    auto lo
    iface lo inet loopback
    
    auto eth0
    iface eth0 inet dhcp
    
    auto eth1
    iface eth1 inet dhcp
    
  5. Restart the VM.

  6. Login to the VM and run below command to check the IP allocated to eth1:

    ifconfig
    
  7. Use this IP to open putty session for the VM.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接