由于某种原因,互联网上关于此过程的文档非常缺乏或过时。基本上,我在 VMWare Fusion 中有一个来宾 VMWare 虚拟机(运行 Ubuntu 10.10),并且我有 Mac OSX 10.6 作为主机。我希望能够从 Mac 通过 SSH 连接到 Linux VM。我该如何配置才能实现这一点?
答案1
绝对如此 - 这只是使用本地或桥接接口的问题,并计算出运行 ssh 服务器的系统的 ip 地址(使用 ifconfig 命令)。在 VM 上安装 openssh-server,使用您的 ssh 客户端,就完成了。
如果您使用NAT接口,则可能会更复杂,一般不建议这样做。
答案2
实际上,有很多很好的理由在虚拟机中使用 NAT,而不是桥接接口。(这是一个老问题,但它是我在搜索如何执行此操作时出现的第一个结果,从我一直这样做的 VirtualBox 迁移而来,所以我认为值得添加)
使用 NAT 的几个原因如下:
- 简单又便携
- 如果你在客户局域网中,需要已知的 MAC 地址才能获取 IP(否则你将不得不尝试猜测未使用的 MAC 地址,这有可能发生冲突,并且通常会引起人们的不良注意 :) ),
- 比如允许您的虚拟机使用主机上的单个代理服务器(例如,如果您不控制您所在的网络),或者能够在一个方便的地方对传出的广播(窗口等)流量进行防火墙/过滤。
- 能够为它们分配一个固定或保留的 IP,以便您可以从主机外部通过名称/IP 引用它们(同样,如果您无法通过桥接接口在网络上获得保留)
- 但最重要的是,它允许您隐藏在主机上的单个防火墙配置后面,并以更受保护的方式在您/他们之间共享内容,而不是将每个虚拟机暴露在“野外”并必须单独保护它们等等。就像您使用互联网调制解调器/路由器一样
无论如何,对于我的情况(VMWare Workstation 10、Linux 主机、OS X Guest)以及任何偶然发现这一点的人来说,这是对我有用的概述。除了犹豫不决和假设之外,实际上只有 3 个主要步骤。
- 因此,首先您需要决定要从主机“外部”允许虚拟机/客户机访问哪些内容(请注意,如下所示,您将能够从主机本身轻松访问它)。安全的做法是只向子网上的机器公开/允许 SSH(端口 22)。如果您在虚拟机上有 Web 服务器等,您还可以允许端口 80/443,并且您还可以使用“隧道”通过 SSH 访问其他服务(下面将给出示例),并使用 FUSE/SSHFS 授予主机文件系统访问权限。(或者 VMWare 上的共享文件夹功能,但我还没有使用它)。
因此,这个想法是这样的:“允许主机本地网络上的东西(例如 10.1.1.0/24 或 192.168.1.0/24)连接到主机上的端口 22222,我们将转发到特定来宾的端口 22”。当然,它必须是特定的来宾(这使得能够配置您的 IP 更加有用,并且您可以在一个地方更改它们而无需打开每个虚拟机),就像通过您的互联网路由器允许游戏通过等一样。
接下来,决定你需要哪些服务
允许主机通过 iptables/firewall 连接到“外部”端口。端口 22 可能已被主机上的 sshd 使用,因此您可以使用 22222 之类的值。在这种情况下,将类似以下内容添加到 /etc/ufw/before.rules(并重新启动 ufw)
# 你的本地网络/子网掩码可能是这样的10.1.1.0/24...
-A ufw-before-input -p tcp --dport 22222 -m state --state NEW -s my_subnet_and_mask -j 接受 `
在主 VMware DHCP 配置中为您的虚拟机提供一个保留 IP(可选,但如果您想从主机“针孔”到它,则更容易依赖),在 /etc/vmware/vmnet8/dhcpd/dhcpd.conf 的底部添加类似这样的内容
# Just like a normal dhcpd reservation host my_vm_1 { hardware ethernet *your_vm_eth_mac_here**; # This is in default range for guests, but outside the 'pool'. # - check that it matches your vmware config fixed-address 192.168.198.10; # And/or your own internal nameserver etc option domain-name-servers 8.8.8.8; option domain-name "some_domain_suffix"; # This is the default default-route of the VM option routers 192.168.198.2; }
通过将其添加到 /etc/vmware/vmnet8/nat/nat.conf 的 [incomingtcp] 部分,告诉 VMWare 将连接从 22222 转发到 guest:22,然后重新启动 vmware 服务(参见下面的注释)
[传入 TCP]
22222 = 192.168.198.10:22
您可能还需要允许端口 22 连接在您的客户机,具体取决于它是什么/它是否有自己的防火墙。在这个 OS X 客户机案例中,它通过共享设置启用“远程登录”,在 Linux 上,它可能通过 ufw 启用,如上面的主机一样,等等
因此,一旦完成所有操作,您就可以使用笔记本电脑或 LAN 上的其他机器,通过 22222 上的 ssh 连接到您的工作站(vmware 主机),然后您将被转移到您告诉它转发给您的客户端。如上所述,如果您还想连接到客户端上的 postgres 服务器(或通常未加密的 vnc 服务器),您可以在相同的命令中建立隧道(而不是将其也添加到 dhcp conf)。例如
console ~> ssh root@hostip -p 22222 -L 54320:localhost:5432
然后,您将通过 vmware 中的 ip 转发 ssh 进入客户机,并可以将 pgadmin3 工具指向笔记本电脑上的 localhost:54320(非特权),并且网络上的流量将被加密。(请注意,那里的“localhost”已转发给客户机)
笔记
- 有各种各样的方法可以做到这一点。首先,您可以直接隧道连接到主机并在 -L 中指定来宾的 IP,它会“突破”并指向那里,但 nat.conf 选项很好用且方便,您不必每次都输入它。还有其他端口转发方式
- 我曾在几个帖子中看到过关于使用虚拟网络 GUI 来实现这一点(比如 virtualbox 就有),但我在这个版本中找不到它
- 我不用 Windows,所以尽管我假设配置为主机非常相似,但我不确定。NAT 配置应该适用于任何 vmware 客户端(尽管我没有使用任何其他版本的 VMWare)
VMware 设置了一条路由,以便主机可以直接联系 NAT 客户机,即从主机的控制台,我可以直接 ping/ssh 等 NAT 客户机 192.168.198.10(上面定义)
console ~> route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface <snip> 192.168.198.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8 192.168.233.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1
- 从 Linux 说明来看,需要对 vmware 和 systemd init 进行一些调整,才能使其自动顺利启动,同时我发现我无法重新启动 vmware(vmci 不会再次加载),我必须重新启动我的机器才能使上面的 NAT/DHCP 内容生效,但您可能不会遇到此问题。不过,有一些线程提供了 systemd 解决方案
答案3
为了简化事情:
- 运行虚拟机
- 从菜单 > 虚拟机 > 网络适配器 > 桥接。
- 在您的虚拟机中,找到您的 IP 地址,例如在 linux 中:
ifconfig
。 - 从主机,使用 ssh
ssh user@ip
。
我假设您已经安装并正在运行 SSH 服务。