Vagrant不会只转发80端口

时间:2013-07-02 22:54:38

标签: macos centos firewall vagrant portforwarding

我为流浪汉设置了端口转发

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@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和厨师的图片。

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

7 个答案:

答案 0 :(得分:36)

我认为你不能转发到主机端口< 1024,除非VirtualBox在主机上以root运行。

VirtualBox Manual说到NAT模式限制:

  

转发主机端口< 1024 不可能

     

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

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

答案 1 :(得分:22)

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

不是以root身份运行VirtualBox,而是向前移动两次。将vagrant设置为转发主机:8080 to guest:80。将其与主机上的某些端口转发规则(使用ipfw实用程序)相结合,使80在主机上转到8080。然后8080将在客户机上发回80.

似乎很复杂,但本文更清楚地描述了设置 http://www.dmuth.org/node/1404/web-development-port-80-and-443-vagrant

答案 2 :(得分:12)

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

如果您在guest虚拟机上的端口80上运行Web服务器,则可以使用SSH在后台运行端口。

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

答案 3 :(得分:7)

<强>更新

自OS X Mavericks起,

ipfw已被弃用。您应该使用pfctl代替。我写了一篇文章,详细介绍了如何在此完成此任务:

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


在Mac OS X上通过终端:

  
    

sudo ipfw将100个fwd 127.0.0.1,8080 tcp添加到任意80个

  

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

答案 4 :(得分: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 :(得分:3)

OSX上的Vagrant端口转发:ipfw已折旧

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

他在此处描述的解决方案中受到赞誉,但是:https://www.danpurdy.co.uk/web-development/osx-yosemite-port-forwarding-for-vagrant/

我在这里粘贴解决方案是为了完整性,希望它可以帮助某人:

在VM上设置端口fowarding

根据Vagrant documentation

将以下内容添加到您的Vagrant文​​件中

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标志。

答案 6 :(得分:1)

您可以将端口转发配置为VirtualBox:

  

您的VM - &gt;设置 - &gt;网络 - &gt;高级 - &gt;端口转发

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