【问题标题】:Vagrant reverse port forwarding?Vagrant 反向端口转发?
【发布时间】:2013-04-26 20:20:46
【问题描述】:

我正在研究 Web 服务架构。我有一些软件需要在本地主机上运行,​​而不是在 Vagrant 中。但我想在来宾上运行一些客户端服务。

Vagrant 的config.vm.forwarded_port 参数将在主机上打开一个端口并将数据发送给客人。但是我怎样才能在来宾上打开一个端口并将数据发送到主机呢? (它仍然是端口转发,但方向相反。)

【问题讨论】:

标签: vagrant portforwarding


【解决方案1】:

当你运行vagrant ssh 时,它实际上是在使用这个底层命令:

ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1

SSH 支持使用-R guestport:host:hostport 选项将端口转发到您想要的方向。因此,如果您想连接到客户机上的端口 12345 并将其转发到 localhost:80,您可以使用以下命令:

ssh -p 2222 -R 12345:localhost:80 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1

由于 Eero 正确 cmet,您还可以使用命令 vagrant ssh -- -R 12345:localhost:80,它在更简洁的命令中具有相同的效果。

【讨论】:

  • 您可以使用vagrant ssh -- -R 12345:localhost:80 更简单地运行它这遵循ssh 选项语法-R [bind_address:]port:host:hostport ,其中第一个数字是在客户机内部侦听的端口号,后两个是从主机可见的服务地址。
  • 据我了解,反向转发仅适用于相应的 ssh shell。我认为 Dan Fabulich 想要一个无需 ssh 进入 vm 的解决方案。
  • @Alp 我相信它是整个系统可用的端口,而不仅仅是 ssh 进程可用的端口。对我来说很好用!
  • 对于那些使用 PuTTy 的人,配置 gui 的 SSH/Tunnels 部分允许远程端口转发(因此命令中的 -R)或本地端口转发(命令行中的 -L)
  • 如果你有多个 vagrant 设置,或者考虑到 vagrant 的潜在不同配置:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
【解决方案2】:

在Vagrant的创建者写的Vagrant: Up and Running(出版日期:2013年6月12日)一书中,他提到guest机器无法访问主机上运行的服务。

您可以使用Host-Only Networks 设置专用网络,而不是使用Forwarded Ports

  • 使用Host-Only Networks 而非Forwarded Ports 的优点

    1. 客户机可以访问宿主机上运行的服务

      这个功能可以解决你的问题。

    2. 访客机器可以访问其他访客机器上运行的服务

      此功能对于将服务分离到多台机器上以更准确地模拟生产环境非常有用。

    3. 安全

      外部机器无法访问来宾机器上运行的服务

    4. 工作量少

      无需配置每一个Forwarded Port


  • 如何配置Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0"#流浪版本#1

    config.vm.network :private_network, ip: "192.168.0.0"#Vagrant 版本 #2

    在您的Vagrantfile 中添加此行将指示 vagrant 创建具有静态 IP 地址的专用网络:192.168.0.0

    主机的 IP 地址始终是相同的 IP 地址,但最后一个八位字节为 1。在前面的示例中,主机的 IP 地址为 192.168.0.1

【讨论】:

  • 同理(也来自Vagrant: Up and Running),您可以建立一个桥接网络。在桥接网络上,本地网络中的其他机器可以访问您的虚拟机,反之亦然。但由于 IP 地址是通过 DHCP 分配的,因此您必须在虚拟机中 ifconfig 才能找到其 IP 地址。
  • 当你设置 config.vm.network :private_network, ip: "192.168.50.4" 意味着来宾将通过转到 "192.168.50.1" 来访问主机这一事实是关键位信息在这里。我在任何地方都找不到那个小花絮。
  • 我发现使用192.168.0.0 的答案地址不起作用 - 卷曲/ping主机导致连接t/o。使用@Nucleon 的地址(与主题上的Vagrant docs 一致)按广告宣传。
  • @Mingyu 否 - 使用您的配置行 config.vm.network :private_network, ip: "192.168.0.0" 并在 192.168.0.1 上卷曲/ping 主机会导致连接超时。将网络配置为192.168.50.4 解决了它,即在192.168.50.1 可用的主机。
  • "192.168.0.0" 不是一个很好的例子,x.x.x.0 通常用于广播
【解决方案3】:

您可以通过来宾操作系统内的默认网关访问主机上的端口。 (通常 IP 为10.0.2.2。)

例如,如果您在主机上的 8000 端口上运行网络服务器...

echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000

您可以在 Vagrant VM 内部通过 10.0.2.2:8000 访问它(前提是 10.0.2.2 是访客默认网关的 ip):

vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!

要在客户机操作系统中查找默认网关的 IP,请运行 netstat -rn(或在 Windows 客户机上运行 ipconfig)并查找目标 IP 为 0.0.0.0 的行(或标有“默认”的字段)网关”在 Windows 上):

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.33.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1

您可以使用netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2 以编程方式提取此 IP。

来源:How to connect with host PostgreSQL from vagrant virtualbox machineConnect to the host machine from a VirtualBox guest OS?

【讨论】:

  • 我也非常喜欢这个解决方案,因为它甚至不需要停止我当前的 vagrant ssh 会话就可以工作。谢谢!
  • 太棒了!这正是我一直在寻找的
  • 太棒了! ifconfigip address 没有得到我需要的东西,但 netstat -rn 做到了。
【解决方案4】:

将以下内容添加到主机上的~/.ssh/config

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

只要你通过vagrant ssh登录,它就可以让你从 Vagrant 访问主机端口 52698 上的服务。

您可以通过在 vagrant VM 上运行 netstat -lt 并记下以下几行来确认它是否有效:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN

【讨论】:

  • +1 这对我帮助很大。我添加了替换为端口 5037 的给定文本,以允许我的 vagrant box 能够监听在我的主机上运行的 android 模拟器。
【解决方案5】:

我可以通过其本地 IP 地址(而不是其环回地址)访问在我的主机上运行的服务。我通过在端口 80(然后在端口 987)和 curling 197.45.0.10:80 和 197.45.0.10:987(实际 IP 地址更改以保护无辜者)上创建 http 服务器进行测试。它两次都有效,而且我没有任何特殊的 vagrant 配置(没有 public_network,没有 forwarded_port),虽然我确实有一些通过 PuTTY 转发的端口,但我没有转发端口 80 和 987。所以也许可以尝试使用主机的本地或公共 IP 地址。

如果您想从另一个访客 vagrant 实例访问(ssh 到),您可以启用 public_network 以及从 Vagrantfile 中的端口 22 转发,如下所示:

config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200

然后,只要该端口打开(即在您的路由器配置中进行更多端口转发),您就可以从任何地方访问该机器,甚至是外部世界。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 2019-03-24
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多