【问题标题】:Vagrant won't forward ONLY port 80Vagrant 不会只转发端口 80
【发布时间】:2013-06-30 12:03:27
【问题描述】:

我为 vagrant 设置了端口转发

Vagrant.configure("2") do |config|
  config.vm.box = "centOS"
  config.vm.network :forwarded_port, guest: 80, host: 80
  config.vm.network :forwarded_port, guest: 8443, host: 8443
  config.vm.network :forwarded_port, guest: 8443, host: 9443
  config.vm.network :forwarded_port, guest: 8445, host: 8445
  config.vm.network :forwarded_port, guest: 8000, host: 8000 
  config.vm.hostname = "www.vagrant.com"
end

80 端口已从我的 vagrant virtual box 中打开

[vagrant@www ~]$ nmap -sT 0.0.0.0 -p 80 

Starting Nmap 5.51 ( http://nmap.org ) at 2013-07-02 22:25 UTC
Nmap scan report for 0.0.0.0
Host is up (0.000063s latency).
PORT   STATE SERVICE
80/tcp open  http

但它已从我的主机关闭

Ben-Fischer:~ bfischer$ nmap -sT 0.0.0.0 -p 80 

Starting Nmap 6.25 ( http://nmap.org ) at 2013-07-02 17:38 CDT
Nmap scan report for 0.0.0.0
Host is up (0.000086s latency).
PORT   STATE  SERVICE
80/tcp closed http

我的主机上的 80 端口上没有其他东西在监听

Ben-Fischer:~ bfischer$ sudo lsof -n -i4TCP:80 | grep LISTEN
[no output]

Iptables 关闭了,我的 mac 防火墙也关闭了

[vagrant@www ~]$ sudo service iptables stop

所有其他转发端口都可以正常工作(8443,9443,8445,8000)

盒子是来自 vagrant, centOS 6.3 with chef的图片。

那么...为什么我不能从本地机器连接到端口 80?

【问题讨论】:

    标签: macos centos firewall vagrant portforwarding


    【解决方案1】:

    我认为您不能转发到主机端口 root 运行。

    VirtualBox Manual 说明了 NAT 模式限制:

    转发主机端口不可能:

    在基于 Unix 的主机(例如 Linux、Solaris、Mac OS X)上,无法从非 root 运行的应用程序绑定到低于 1024 的端口。因此,如果您尝试配置这样的端口转发,VM 将拒绝启动。

    这些限制通常不会影响标准网络的使用。但是 NAT 的存在具有微妙的影响,可能会干扰正常工作的协议。一个例子是 NFS,服务器通常被配置为拒绝来自非特权端口(即低于 1024 的端口)的连接。

    【讨论】:

    • 我尝试使用 sudo virtualbox 启动 VirtualBox,但我得到了相同的结果。任何想法为什么?
    • 我认为这是因为 vagrant 运行 virtualbox 的无头实例,它不会以 root 身份运行它。
    • 请注意,至少从 Vagrant 1.4.1 开始,VM 将启动,即使 autocorrect 设置为 true,但端口不会转发。
    • VirtualBox 指的是基于 Unix 的主机,但我对 Windows 主机和 Windows VM 也有同样的问题。 80端口不工作,8800或8080端口工作正常。
    【解决方案2】:

    您可以在 VirtualBox 中配置端口转发:

    你的虚拟机 -> 设置 -> 网络 -> 高级 -> 端口转发

    您可以在此处添加您需要的端口。

    【讨论】:

      【解决方案3】:

      Vagrant 在 OSX 上的端口转发:ipfw 已贬值

      除了@sgarbesi 的回应,ipfw 确实在 OS X Mavericks 中贬值了。不幸的是,由于链接似乎已损坏,我无法访问他发布的解决方案。

      这里描述的解决方案归功于他:https://www.danpurdy.co.uk/web-development/osx-yosemite-port-forwarding-for-vagrant/

      为了完整起见,我将解决方案粘贴在这里,希望对某人有所帮助:

      在虚拟机上设置端口转发

      根据Vagrant documentation,将以下内容添加到您的 Vagrantfile 中:

      config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.network "forwarded_port", guest: 443, host: 4443

      安装 Vagrant 触发器

      要安装 vagrant-triggers,您应该在终端窗口中导航到保存 Vagrantfile 的文件夹并运行以下命令:

      vagrant plugin install vagrant-triggers

      使用 Vagrant Triggers 自动启用端口转发

      将以下内容添加到您的 Vagrantfile 中:

      config.trigger.after [:provision, :up, :reload] do
            system('echo "
              rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080  
              rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 443 -> 127.0.0.1 port 4443
        " | sudo pfctl -ef - > /dev/null 2>&1; echo "==> Fowarding Ports: 80 -> 8080, 443 -> 4443 & Enabling pf"')  
        end
      
        config.trigger.after [:halt, :destroy] do
          system("sudo pfctl -df /etc/pf.conf > /dev/null 2>&1; echo '==> Removing Port Forwarding & Disabling pf'")
        end
      

      这会将端口 80 和 443 分别绑定到 Vagrant Provision 上的端口 8080 和 4443,启动并重新加载并在停止或销毁时将其删除。请注意,在 OSX 上默认情况下不启用 pf,因此我们在添加启用 pf 的规则时传递 -e 标志,并在删除端口转发时再次禁用 -d 标志。

      【讨论】:

        【解决方案4】:

        您可以使用网桥适配器,然后指向本地 IP 地址,而不是使用 localhost。 由于这可能因主机而异(例如正在使用的本地 IP 地址等),所以我会将所有内容放入外部 config.yml 文件中。

        # ...
        
        require 'yaml'
        
        current_dir    = File.dirname(File.expand_path(__FILE__))
        configs        = YAML.load_file("#{current_dir}/config.yml")
        vagrant_config = configs['config'][configs['config']['use']]
        
        VAGRANTFILE_API_VERSION = "2"
        
        Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
        
        # http://docs.vagrantup.com/v2/virtualbox/networking.html
        config.vm.network vagrant_config['vm']['network_type'],
            ip: vagrant_config['vm']['network_ip'],
            bridge: vagrant_config['vm']['network_bridge'],
            virtualbox__intnet: vagrant_config['vm']['network_intnet']
        config.vm.network "forwarded_port", 
            guest: 80, 
            host: vagrant_config['http_server']['host_port']
        
        # ...
        

        遵循 config.yml 文件:

        config:
            use: "public"
            private: # this is the old configuration that doesn't let you forward on port 80
            vb:
                cpus: 2
                memory: 4096
            vm:
                network_type: "private_network"
                network_ip: "192.168.33.10"
                network_intnet: true
                network_bridge: ""
                synced_folder: "/home/francesco/whatever/vagrant-synced-folder"
            http_server:
                host_port: 8080
            public: # here follows the new bridged configuration that let you use port 80!
            vb:
                cpus: 2
                memory: 4096
            vm:
                network_type: "public_network"
                network_ip: "192.168.1.123"
                network_intnet: false
                network_bridge: "eth0" # or whatever is your adapter name!
                synced_folder: "/home/francesco/whatever/vagrant-synced-folder"
            http_server:
                host_port: 80
        

        那就去http://192.168.1.123:80/ :-)

        【讨论】:

          【解决方案5】:

          更新:

          ipfw 自 OS X Mavericks 起已被弃用。您应该改用pfctl。我写了一篇文章,详细介绍了如何在此处完成此操作:

          http://salvatore.garbesi.com/vagrant-port-forwarding-on-mac/


          在 Mac OS X 上通过终端:

          sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to me 80 in

          这会将 127.0.0.1:80 上的所有传入流量重定向到 127.0.0.1:8080

          【讨论】:

          • @SinanEldem 我发布了一篇关于此的文章,可能值得一读。显然ipfw 在 Mavericks 中已被弃用,您可能应该使用pfctl,这就是我最终要使用的。每当我运行 vagrant up 时,我都会自动绑定端口。我编辑了帖子以包含这篇文章。
          【解决方案6】:

          我没有在我的机器(Arch Linux)上安装的 ipfw 的替代方法是 SSH。

          如果您在来宾的 80 端口上运行网络服务器,那么您可以使用 SSH 在后台运行端口转发。

          sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
          

          【讨论】:

            【解决方案7】:

            特里的回答正确诊断了问题。这是我的解决方案:

            不要以 root 身份运行 VirtualBox,而是进行两次端口转发。设置 vagrant 将主机:8080 转发到访客:80。将其与主机上的一些端口转发规则(使用 ipfw 实用程序)相结合,以便主机上的 80 转到 8080。然后 8080 将被发送回客户机上的 80。

            看起来很复杂,但这篇文章更清楚地描述了设置 http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant

            【讨论】:

            猜你喜欢
            • 2016-11-27
            • 2014-08-20
            • 2013-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多