流浪者反向端口转发?

时间:2013-04-26 20:20:47

标签: vagrant portforwarding

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

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

5 个答案:

答案 0 :(得分:125)

当您运行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并将其转发到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,它在更简洁的命令中具有相同的效果。

答案 1 :(得分:97)

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

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

  • 使用Host-Only Networks优于Forwarded Ports

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

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

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

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

    3. 安全

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

    4. 减少工作量

      无需配置每一个Forwarded Port


  • 如何配置Host-Only Networks

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

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

    Vagrantfile中包含此行将指示vagrant创建一个具有静态IP地址的专用网络:192.168.0.0

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

答案 2 :(得分:62)

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

例如,如果您的主机上有端口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。

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

答案 3 :(得分:7)

将以下内容添加到主机上的~/.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

答案 4 :(得分:2)

我可以通过本地IP地址(而不是其环回地址)访问在我的主机上运行的服务。我通过在端口80上创建一个http服务器(然后在端口987上)和curl 197.45.0.10:80和197.45.0.10:987(实际IP地址已更改以保护无辜者)进行测试。它有两次工作,我没有任何特殊的流浪汉配置(没有public_network,没有forwarding_port),虽然我有一些端口通过PuTTY转发,但我没有转发端口80和987。因此,可以尝试使用主机的本地或公共IP地址。

如果您想从另一个访问(ssh into)一个来宾流浪者实例,您可以启用public_network以及Vagrantfile中的端口22转发,如下所示:

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

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