首页 文章

流浪者反向端口转发?

提问于
浏览
111

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

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

5 回答

  • 97

    当你运行 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 ,它在更简洁的命令中具有相同的效果 .

  • 54

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

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

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

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

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

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

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

    • 安全

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

    • 减少工作量

    无需配置每一个 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 Version#2

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

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

  • 123

    您可以通过来宾操作系统内的默认网关访问主机上的端口 . (其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!
    

    要在guest虚拟机操作系统中查找默认网关的IP,请在Windows guest虚拟机上运行 netstat -rn (或 ipconfig )并查找目标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
    

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

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

  • 2

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

    我可以通过本地IP地址(而不是其环回地址)访问在我的主机上运行的服务 . 我通过在端口80(然后在端口987上)和 curl ing 197.45.0.10:80和197.45.0.10:987(更改实际IP地址以保护无辜)创建了一个http服务器进行了测试 . 它有效,但我没有转发端口80和987 . 因此,可以尝试使用主机的本地或公共IP地址 .

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

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

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

相关问题