【问题标题】:Vagrant forwarding ssh from remote serverVagrant 从远程服务器转发 ssh
【发布时间】:2013-10-12 19:37:14
【问题描述】:

我设置 vagrant 在主机操作系统上运行 vm。我想做的是能够从其他机器直接 ssh 到 vagrant vm(即,我不应该先 ssh 到主机,然后再 vagrant ssh 等进入 vagrant vm)。

目前,我可以使用ssh vagrant@127.0.0.1 -p 2222 ssh 不使用主机操作系统中的 vagrant 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 进入一个流浪虚拟机?

【问题讨论】:

  • 该端口在防火墙中打开了吗?
  • 是的。我可以使用我编写的示例程序来绑定和收听它,并从上面的其他机器接收消息。
  • 我能够通过使用不同于 2222 的端口号使其工作。例如,这适用于我:config.vm.network :private_network, ip: "192.168.0.2"config.vm.network :forwarded_port, guest: 22, host: 2022
  • 我不得不更改 VirtualBox 以使用 Bridged 而不是 Nat。然后我在guest上找到了带有ifconfig的内部ip。之后ssh-copy-id 从远程到vagrant@_ip_from_ifconfig_ 之后我可以在没有密码的情况下登录。
  • @dmarr - 你能否提供更多关于你的答案的细节?我真的不明白你做了什么来使它工作。谢谢

标签: ssh vagrant


【解决方案1】:

从 v1.2.3 开始,Vagrant 端口转发默认绑定 127.0.0.1,因此只允许本地连接

您收到“连接被拒绝”,因为端口转发未绑定到您的网络接口(例如 eth0、wlan0)。您主机上的端口2222 甚至不对同一网络中的主机开放(其他主机无法访问环回接口)。

如果你想从远程主机(在同一个局域网中)直接通过 SSH 连接到 Vagrant VM,最好和最简单的方法是使用公共网络(VirtualBox 的桥接网络模式)。

将以下内容添加到您的 Vagrantfile 并执行 vagrant reload

它应该通过公共网络接口之一进行桥接,您应该能够在 VM 启动后获取 IP 地址,vagrant ssh 进入其中并运行 ifconfig -aip addr 以获取 IP 地址以 ssh 到来自远程主机。

示例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)'

查看更多 => Public Network

【讨论】:

  • 感谢您的详细解答。几个问题:1)这表明来宾和主机将具有不同的IP地址,对吗? 2) 这要求 dhcp 服务器对分发 IP 地址非常宽容,对吧?如果我在 ec2 或其他云提供商上运行,我可以依赖它吗? (我很确定我不能......) 3)为什么你的回答说远程机器必须在同一个局域网中?
  • 我的config.vm.network 已经设置为公开,但我仍然无法从外部客户端通过 ssh 连接。 ssh -p 2222 vagrant@192.168.102.38 产生 Connection refused
  • 我不应该指定端口; sshing 无需指定端口即可正常工作。
【解决方案2】:

您还可以向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(如果您在 VM 运行时编辑了 Vagrantfile,则必须重新加载它),现在您可以使用“主机”端口(在我的情况下为 22)连接到 Vagrant从主机外部。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我认为这应该是正确的答案。做你想做的最小和破坏性最小的改变。
    • 这个解决方案曾经对我有用,但是当我在一台新机器上安装 Vagrant 1.9.7 时,我尝试使用这个解决方案但它失败了。我在网上搜索,发现解决方法是将0.0.0.0替换为localhost(source)
    • @AdamTaylor - 您的解决方案应在答案中标记,它帮助我使其工作。谢谢
    【解决方案4】:

    使用vagrant share --ssh

    Vagrant 现在有一个注册 Vagrant VM 的服务 自动进行远程 SSH 访问。

    请看这里:https://www.vagrantup.com/docs/share/ssh.html

    你打电话给vagrant share --ssh
    这会生成一个 SSH 密钥(加密并受密码保护), 将其上传到 Hashicorp 服务器, 并返回一个愚蠢的全局框名(例如“rambunctious-deer-3496”)。
    那么所有的人

    • 有一个 Hashicorp Atlas account
    • 知道盒子名称,
    • 知道密钥的密码,并且
    • 已安装 Vagrant (!)

    可以通过远程SSH到盒子 vagrant connect --ssh BOXNAME.
    Vagrant 负责幕后的所有管理工作(这里是some details)。

    按广告宣传。
    如果 Vagrant 主机(不仅仅是 VM)位于 NAT 之后,这甚至会起作用。

    限制:

    • vagrant share 会话过期 (currently after 8 hours)
    • 预计会有一些延迟,因为所有流量都是(大概) 通过 Altas 服务器路由
    • 我已经看到我的远程连接关闭(没有明显的原因) 在我大约 15 分钟没有使用它们之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多