25

我为 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 和厨师的图像。

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

4

7 回答 7

40

我认为您不能转发到主机端口 < 1024,除非 VirtualBoxroot在主机上运行。

VirtualBox 手册说明了 NAT 模式限制:

转发主机端口 < 1024不可能

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

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

于 2013-07-02T23:53:00.463 回答
25

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

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

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

于 2013-07-03T18:21:19.733 回答
13

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

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

sudo ssh -p 2222 -gNfL 80:localhost:80 vagrant@localhost -i ~/.vagrant.d/insecure_private_key
于 2014-03-12T14:48:47.800 回答
7

更新:

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

于 2014-04-07T01:48:49.717 回答
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/:-)

于 2015-04-22T11:21:16.267 回答
3

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

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

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

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

在 VM 上设置端口转发

根据Vagrant 文档,将以下内容添加到您的 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 标志以再次禁用它。

于 2017-09-14T12:03:00.173 回答
-1

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

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

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

于 2017-11-14T14:23:20.070 回答