Vagrant无法转发仅端口80。

24

我已经为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

我的vagrant虚拟机中,端口80是开放的

[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、带有Chef的CentOS 6.3镜像。

那么……为什么我无法从本地计算机连接到80端口呢?

7个回答

40

我认为,除非VirtualBox在主机上以root身份运行,否则无法将端口转发到主机的端口号<1024。

VirtualBox手册有关NAT模式限制的说明如下:

无法转发主机端口 < 1024:

在基于Unix的主机(例如Linux、Solaris、Mac OS X)上,非以root身份运行的应用程序不能绑定到低于1024的端口。因此,如果您尝试配置此类端口转发,则虚拟机将拒绝启动。

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


4
我尝试使用“sudo virtualbox”启动VirtualBox,但是结果与之前相同。有任何想法为什么会这样? - Ben Fischer
1
我认为这是因为Vagrant运行VirtualBox的无头实例,并且不会以root身份运行。 - haknick
2
请注意,至少在Vagrant 1.4.1版本中,即使将autocorrect设置为true,虚拟机也会启动,但端口将不会转发。 - msanford
1
VirtualBox是针对基于Unix的主机的,但我在Windows主机和Windows虚拟机上也遇到了同样的问题。端口80无法工作,而8800或8080端口可以正常工作。 - Mathias Conradt

24

Terry的答案正确地诊断了问题。以下是我的解决方案:

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

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


1
不可用的链接在这里可以找到(尽管它可能已经过时)https://web.archive.org/web/20181207164919/http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant - authentictech

13

如果您的机器上没有安装 ipfw(我在 Arch Linux 上没有安装),那么可以使用 SSH 作为替代。

如果您在客户端上运行的是端口 80 上的 Web 服务器,则可以使用 SSH 在后台运行端口转发。

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

7

更新:

ipfw已在OS X Mavericks中停用。您应该使用pfctl。我写了一篇文章详细介绍如何实现这一点,您可以在此处查看:

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


在Mac OS X Terminal中:

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 我发了一篇文章,可能值得一读。显然,自 Mavericks 以来,ipfw已被弃用,你应该使用pfctl,这也是我最终采用的方法。每当我运行vagrant up时,端口都会自动绑定。我编辑了帖子,加入了这篇文章。 - sgarbesi

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/即可 :-)

3

在OSX上为Vagrant设置端口转发:ipfw已经过时

在@sgarbesi的回答之后,自从OS X Mavericks以来,ipfw确实已经过时了。不幸的是,我无法访问他发布的解决方案,因为链接似乎已经失效。

然而,他在这里描述的解决方案中得到了认可: https://www.danpurdy.co.uk/web-development/osx-yosemite-port-forwarding-for-vagrant/

为了完整起见,我在这里粘贴解决方案,希望能帮助到某些人:

在虚拟机上设置端口转发

按照Vagrant文档的说明,将以下内容添加到您的Vagrantfile中:

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

安装Vagrant Triggers

要安装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,因此在添加规则时我们传递-e标志以启用pf,并传递-d标志以在删除端口转发时再次禁用它。


-1
你可以在VirtualBox中配置端口转发:

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

在这里,你可以添加所需的端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接