Vagrant远程服务器转发ssh

24

我设置了Vagrant来在主机操作系统上运行虚拟机。 我想做的是能够直接从其他计算机ssh进入Vagrant虚拟机(即,我不应该通过在主机上进行ssh然后vagrant ssh等进入Vagrant虚拟机)。

目前,我可以使用ssh vagrant@127.0.0.1 -p 2222从主机操作系统中不使用vagrant ssh进行ssh。 但是,如果我运行相同的命令(将127.0.0.1替换为主机的IP地址),我会收到“ssh连接到主机XXXXX端口2222:连接被拒绝”的消息。

我尝试向Vagrant添加自己的端口转发规则:

config.vm.network :forwarded_port, guest: 22, host: 2222

但这并不允许从主机或网络中的任何其他计算机进行ssh连接。 此外,我在vagrant文档中花了一段时间使用config.ssh。 我认为其中大多数参数指定vagrant vm正在运行ssh的端口。

我真的不认为这应该很困难。 有人知道我可能做错了什么,或者我应该怎样才能从远程服务器ssh到vagrant vm吗?


防火墙中是否开放了该端口? - Matt Cooper
是的,可以。我可以编写一个示例程序来绑定和监听它,并从其他机器上接收消息。 - Behram Mistree
我通过使用不同于2222的端口号使其工作。例如,以下配置适用于我:
config.vm.network :private_network, ip: "192.168.0.2" config.vm.network :forwarded_port, guest: 22, host: 2022
- Carlos Barbosa
我不得不将VirtualBox从Nat更改为桥接模式。然后在虚拟机上使用ifconfig找到了内部IP地址。之后,从远程主机使用ssh-copy-id复制到vagrant@_ip_from_ifconfig_,这样我就可以无需密码登录了。 - dmarr
@aspirinemaga 抱歉我直到现在才看到评论。你解决了吗? - dmarr
显示剩余2条评论
4个回答

38

如果您不想将网络更改为公共网络,您可以通过以下方式覆盖默认的ssh端口转发:

config.vm.network :forwarded_port, guest: 22, host: 2222, host_ip: "0.0.0.0", id: "ssh", auto_correct: true

这将会把访客的22端口转发到您主机上的2222端口,并且可以从任何IP地址访问,因此您可以在本地机器之外访问它。


8
我认为这应该是正确的答案。最小化和减少对所需操作的影响。 - stewart99
2
这个解决方案以前对我有用,但是当我在新机器上安装了Vagrant 1.9.7后,我尝试使用这个解决方案,但它失败了。我在网上搜索并发现解决方案是将0.0.0.0替换为localhost来源)。 - Adam Taylor
@AdamTaylor - 你的解决方案应该被标记在答案中,它帮助了我让它正常工作。谢谢。 - aspirinemaga

18

自从v1.2.3版起,Vagrant端口转发默认绑定到127.0.0.1,因此只允许本地连接。

如果您看到“连接被拒绝”的错误信息,那是因为端口转发未绑定到您的网络接口(例如eth0、wlan0等),而主机上的端口2222也未对同一网络中的其他主机开放(回环接口对其他主机不可用)。

如果您想直接从远程主机(在同一局域网内)SSH登录到Vagrant VM,则最佳且最简单的方法是使用公共网络(VirtualBox的桥接网络模式)。

将以下内容添加到您的Vagrantfile文件中,并执行vagrant reload命令。

它应该通过其中一个公共网络接口进行桥接,启动VM后,您应该能够获取IP地址,然后使用vagrant ssh命令登录到VM并运行ifconfig -aip addr命令以获取要从远程主机连接的IP地址。

示例Vagrantfile

<!-- language: lang-rb -->

config.vm.network :public_network # 2nd interface bridged mode

或者更高级的,您可以为公共网络设置默认网络接口

<!-- language: lang-rb -->

config.vm.network "public_network", :bridge => 'en1: Wi-Fi (AirPort)'

查看更多 => 公共网络


1
感谢您详细的回答。有几个问题:1)这意味着客户端和主机将拥有不同的IP地址,对吗?2)这需要DHCP服务器很宽松地分配IP地址,对吗?如果我在EC2或其他云提供商上运行,我能依靠它吗?(我非常确定我不能...)3)为什么您的答案说远程机器必须在同一个局域网中? - Behram Mistree
我已经将config.vm.network设置为公共,但我仍然无法从外部客户端通过ssh连接。ssh -p 2222 vagrant@192.168.102.38会显示连接被拒绝(Connection refused) - Son of the Wai-Pan
我不应该指定端口;ssh连接在没有指定端口的情况下也能正常工作。 - Son of the Wai-Pan

6

您还可以向 Vagrantfile 添加以下规则:

config.vm.network :forwarded_port, guest: 1234, host: 22

使用默认端口(2222)连接到Vagrant,并编辑/etc/ssh/sshd_config,然后在Port 22下方添加之前配置为“guest”的端口,结果如下:

...
Port 22 #Uncomment this line if it's commented
Port 1234
....

最后,重新启动ssh守护进程或执行vagrant reload(如果在虚拟机运行时编辑了Vagrantfile,则必须重新加载),现在你可以从主机外部使用“主机”端口(我的情况下是22)连接到Vagrant。

你不能删除默认端口,因为启动Vagrant时会挂起。


2

使用vagrant share --ssh

Vagrant现在提供了一个服务,可以自动注册Vagrant虚拟机以进行远程SSH访问。

请参阅此处:https://www.vagrantup.com/docs/share/ssh.html

您可以调用vagrant share --ssh
这将生成一个SSH密钥(加密和密码保护),将其上传到Hashicorp服务器, 并返回一个愚蠢的全局框名称(例如“rambunctious-deer-3496”)。
然后,所有人都可以通过以下方式:

  • 拥有HashicorpAtlas账户
  • 知道框名称
  • 知道密钥的密码,并且
  • 已安装Vagrant!

通过vagrant connect --ssh BOXNAME执行远程SSH连接到框。
Vagrant会在幕后处理所有管理事务(这里有一些详细信息:https://atlas.hashicorp.com/help/vagrant/shares)。

效果如广告所述。
猜测即使Vagrant主机(而不仅仅是VM)位于NAT后面,这也将起作用。

限制:

  • vagrant share会话会过期(当前为8小时
  • 预计会有一些延迟,因为所有流量都(可能) 通过Altas服务器路由
  • 我曾经看到我的远程连接在大约15分钟未使用后关闭(原因不明)。

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