Vagrant - 私有网络的端口转发行为

时间:2017-08-06 15:35:19

标签: nginx vagrant virtualbox

我正在测试nginx设置与vagrant但我似乎缺少一些细节,因为当我尝试在静态IP上从主机到达nginx时,连接超时。我的流浪档案:

   # -*- mode: ruby -*-
   # vi: set ft=ruby :
   $script = <<-SCRIPT
     sudo apt-get -y update
     sudo apt-get install -y nginx
   SCRIPT

   ###################################
   Vagrant.configure("2") do |config|
   # webserver server
   config.vm.define "webserver" do |webserver|
      webserver.vm.box = "bento/ubuntu-16.04"
      webserver.ssh.insert_key = false
      webserver.vm.network "private_network", ip: "192.168.10.101"
      webserver.vm.network "forwarded_port", guest: 80 , host: 4000, host_ip: "127.0.0.1"
      webserver.vm.hostname = "webserver"
      webserver.vm.provision "shell", inline: "sed 's/127\.0\.0\.1.*webserver.*/192\.168\.10\.101 webserver/' -i /etc/hosts"
      webserver.vm.provider "virtualbox" do |vb|
      # Customize VM
       vb.name = "webserver"
       vb.memory = "1024"
       vb.cpus = "2"
      end
   end
 end

我能够访问nginx vi localhost:4000,但如果我http://192.168.10.101:4000,则连接超时。我还试图阻止防火墙,如下所示:

 vagrant@webserver:~$ sudo ufw disable
 Firewall stopped and disabled on system startup

没有帮助。对此有任何指导吗?

编辑 - 1

我在阅读https://www.vagrantup.com/docs/virtualbox/networking.html处的文档后删除了虚拟机专用网络。但是,这个问题有点令人困惑,因为现在我可以在以下位置访问nginx测试页面: http://192.168.10.101但不是http://192.168.10.101:4000。虽然我可以访问http://localhost:4000。可能是我错过了什么。

编辑 - 2

在vm和转发端口中运行python simplehttpserver:

   python -m SimpleHTTPServer 8000

Vagrantfile

   dbserver.vm.network "forwarded_port", guest: 8000 , host: 5000, host_ip: "127.0.0.1"

但我可以访问我的测试页面:

http://192.168.10.102:8000/

但不是

http://192.168.10.102:5000/

所以这让我觉得有一些规则允许我访问我的虚拟机端口,而无需在专用网络上进行实际的端口转发。

  $> netstat -nr
  Routing tables

  Internet:
  Destination        Gateway            Flags        Refs      Use   Netif Expire
  default            192.168.0.1        UGSc           40        0     en0
  127                127.0.0.1          UCS             0        0     lo0
  127.0.0.1          127.0.0.1          UH              4    57934     lo0
  169.254            link#4             UCS             0        0     en0
  192.168.0          link#4             UCS             0        0     en0
  192.168.0.1/32     link#4             UCS             1        0     en0
  192.168.0.1        c0:a0:bb:c6:f5:58  UHLWIir        48     6051     en0   1188
  192.168.0.101/32   link#4             UCS             0        0     en0
  192.168.10         link#17            UC              2        0 vboxnet
  192.168.10.102     8:0:27:1b:d5:98    UHLWI           0       73 vboxnet    586
  224.0.0/4          link#4             UmCS            2        0     en0
  224.0.0.251        1:0:5e:0:0:fb      UHmLWI          0        0     en0
  239.255.255.250    1:0:5e:7f:ff:fa    UHmLWI          0     1067     en0
  255.255.255.255/32 link#4             UCS             0        0     en0

1 个答案:

答案 0 :(得分:1)

尝试分析并在vagrant site.中找到。

即使他们已经提供Defining a Forwarded Port,他们也会将免责声明视为以下内容。

  

对于大多数提供商,默认情况下转发的端口绑定到所有接口。这意味着网络上的其他设备可以访问转发的端口。如果要限制访问权限,请参阅下面的guest_ip和host_ip设置。

在这种情况下,虚拟机提供商似乎正在耍手段。它是默认的客户机端口。 我也觉得网络配置的forwarded_port选项效果不佳。

我在我的机器上使用上面给出的流浪文件尝试了相同的设置。

我的观察:

  • 您的流浪文件的脚本部分未在我的本地nginx安装vagrant
  • 我尝试在我的本地nginx中手动安装vagrant,并使其正常运行。
  • 我可以在主机浏览器中看到来宾机的nginx主页。
  • 在默认80端口上运行的来宾计算机nginx中。并且在主机中可以从端口80本身访问。

该链接的结论是:

  

对于大多数提供商,默认情况下转发的端口绑定到所有接口。

修改 即使尝试了在guest-machine中运行的示例python服务器,并经过测试,也可以在没有任何fwding端口的情况下访问python-webserver。

以下是从vagrant中的python服务器输出:

(envflask) vagrant@webserver:~/test$ ls
flasktest.py
(envflask) vagrant@webserver:~/test$ python flasktest.py 
Starting RestServer at port 9595
 * Running on http://0.0.0.0:9595/ (Press CTRL+C to quit)
127.0.0.1 - - [08/Aug/2017 13:35:01] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [08/Aug/2017 13:35:16] "GET / HTTP/1.1" 200 -