流浪者反向端口转发?

Dan*_*ich 116 portforwarding vagrant

我正在开发一个Web服务架构.我有一些软件需要在本机主机上运行,​​而不是在Vagrant中运行.但我想在访客上运行一些客户服务.

Vagrant的config.vm.forwarded_port参数将打开主机上的端口并将数据发送给guest虚拟机.但是如何在guest虚拟机上打开端口并将数据发送给主机?(它仍然是端口转发,但反方向.)

wlr*_*chi 127

当你运行时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选项按所需方向转发端口.因此,如果您想连接到12345guest 虚拟机上的端口并将其转发到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正确评论一样,您也可以使用该命令vagrant ssh -- -R 12345:localhost:80,该命令在更简洁的命令中具有相同的效果.

  • 你可以使用`vagrant ssh - -R 12345:localhost:80`更简单地运行它.这遵循ssh选项语法** - R**_ [bind_address:] port:host:hostport_,其中第一个数字是要在客户机内部侦听的端口号,最后两个是从主机可见的服务地址. (63认同)
  • 或者,如果你有多个流浪汉设置,可以考虑流浪汉的潜在不同配置:`vagrant ssh-config | ssh -F/dev/stdin $ BOX -R $ PORT_VM:localhost:$ PORT -N` (3认同)
  • 据我了解,反向转发仅适用于相应的 ssh shell。我认为 Dan Fabulich 想要一个无需通过 ssh 进入虚拟机的解决方案。 (2认同)
  • @Alp我相信它是整个系统可用的端口,而不仅仅是ssh进程可用的端口.对我来说工作正常! (2认同)

Min*_*gyu 97

Vagrant: Up and Running由Vagrant的创建者撰写的书(Pub.date:2013年6月12日)中,他提到客户机无法访问在主机上运行的服务.

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

  • 使用的优点Host-Only NetworksForwarded Ports

    1. 来宾计算机可以访问主机上运行的服务

      此功能可以解决您的问题.

    2. 来宾计算机可以访问在其他来宾计算机上运行的服务

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

    3. 安全

      外部计算机无法访问客户机上运行的服务

    4. 减少工作量

      无需配置每一个 Forwarded Port


  • 如何配置 Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" #Vagrant版本#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.

  • 当您设置config.vm.network:private_network时,ip:"192.168.50.4"意味着访客将通过转到"192.168.50.1"来访问主机,这是此处的关键信息.我无法在任何地方找到那些小故事. (28认同)
  • @Mingyu否 - 使用您的配置行`config.vm.network:private_network,ip:"192.168.0.0"`并在192.168.0.1`上卷曲/ ping主机导致连接超时.将网络配置为"192.168.50.4"解析它,即主机可用于"192.168.50.1". (8认同)
  • 同样(也来自"Vagrant:Up and Running"),您可以设置桥接网络.在桥接网络上,本地网络中的其他计算机可以访问您的虚拟机,反之亦然.但由于IP地址是通过DHCP分配的,因此您必须在虚拟机中使用`ifconfig`来查找其IP地址. (2认同)
  • "192.168.0.0"不是一个好例子,xxx0通常用于广播 (2认同)

Aje*_*i32 63

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

例如,如果您的主机上有端口8000运行的Web服务器...

echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000
Run Code Online (Sandbox Code Playgroud)

您可以从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!
Run Code Online (Sandbox Code Playgroud)

要在guest虚拟机操作系统中查找默认网关的IP,请运行netstat -rn(或ipconfig在Windows guest虚拟机上)并查找目标IP为0.0.0.0(或Windows上标记为"Default Gateway"的字段)的行:

$ 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
Run Code Online (Sandbox Code Playgroud)

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

来源:如何从vagrant virtualbox机器连接主机PostgreSQL ; 从VirtualBox来宾操作系统连接到主机?


sta*_*aka 8

~/.ssh/config在主机上添加以下内容:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
Run Code Online (Sandbox Code Playgroud)

只要您通过登录,它就允许您从Vagrant访问主机端口52698上的服务vagrant ssh.

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

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
Run Code Online (Sandbox Code Playgroud)

  • +1这对我有很大帮助。我添加了给定的文本,替换为端口5037,以使我的无所事事的盒子能够收听在我的主机上运行的android模拟器。 (2认同)