stream浪汉反向端口转发?

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

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

当你运行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选项以您想要的方向转发端口。 因此,如果您想连接到guest 12345上的端口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正确评论的那样,你也可以使用命令vagrant ssh -- -R 12345:localhost:80 ,它在一个更加简洁的命令中具有相同的效果。

Vagrant: Up and Running的创始人写的“ Vagrant: Up and Running (公开date:2013年6月12日)一书中,他提到访客机器无法访问在主机上运行的服务。

您可以使用“ Host-Only Networksnetworking”来build立专用networking,而不是使用“ Forwarded Ports

  • 通过Forwarded Ports使用Host-Only Networks优点

    1. 访客机器可以访问在主机上运行的服务

      这个function可以解决你的问题。

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

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

    3. 安全

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

    4. 减less工作

      无需configuration每一个Forwarded Port


  • 如何configurationHost-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" Version#1

    config.vm.network :private_network, ip: "192.168.0.0" Version#2

    Vagrantfile有这行Vagrantfile将指示vagrant创build一个具有静态IP地址的专用networking: 192.168.0.0

    主机的IP地址始终是相同的IP地址,但最终的八位字节为1.在上例中,主机的IP地址为192.168.0.1

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

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

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

您可以从10.0.2.2:8000的Vagrant VM内部访问它(提供的10.0.2.2是来宾的默认网关的IP地址):

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

要在客户操作系统中查找默认网关的IP,请在Windows客户机上运行netstat -rn (或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 netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2 netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2

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

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

 Host 127.0.0.1 RemoteForward 52698 127.0.0.1:52698 

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

您可以通过在vagrant虚拟机上运行netstat -lt并在以下几行注释来确认它的工作原理:

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

我可以通过本地IP地址(而不是其回送地址)访问在主机上运行的服务。 我通过在端口80(然后在端口987)上创build一个http服务器,并testing197.45.0.10:80和197.45.0.10:987(实际的IP地址改变以保护无辜者)来testing。 它工作两次,我没有任何特别的stream浪者configuration(没有public_network,没有forwarded_port),虽然我有一些端口通过PuTTY转发,我没有端口80和987转发。 所以也许尝试使用主机的本地或公共IP地址。

如果你想访问(ssh)一个来自另一个游客stream浪的实例,你可以启用public_network以及从stream量文件中的22端口转发,如下所示:

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

然后只要该端口是开放的(即在你的路由器configuration中做更多的端口转发),你可以从任何地方,甚至外部世界访问该机器。