使用Vagrant进行端口转发时连接重置

32
我正在运行一个Ubuntu 12.04 LTS操作系统的Vagrant/VirtualBox。我已经配置了Vagrant将客户端端口8000转发到主机端口8888。
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 8000 => 8888 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use! 

当虚拟机启动时,我会在8000端口上启动Django开发服务器。
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

好的,我可以将其放在后台,并且甚至可以使用curl localhost:8000从服务器获取一些输出。

<div id="explanation">
  <p>
    You're seeing this message because you have <code>DEBUG = True</code> in your
    Django settings file and you haven't configured any URLs. Get to work!
  </p>
</div>

但是当我尝试使用Firefox/Chrome/Telnet从我的主机向服务器发起请求时,会出现连接重置/连接丢失/ERR_CONNECTION_RESET等问题。

起初我以为可能是iptables的问题,但事实证明Ubuntu默认允许所有连接。我也关闭了主机防火墙。我该如何找到问题所在呢?

4个回答

87

我把 Django 监听在 127.0.0.1:8000 上(默认端口)

正如 Mitchell 在这里的回答所解释的那样:Vagrant's port forwarding not working,我应该监听在 0.0.0.0 上。以下是他回答的摘录:

我希望补充一点,通常这是由于 VM 内部的服务器绑定到了 127.0.0.1 上(回环地址)所致。你需要确保服务器绑定到 0.0.0.0,以便所有接口都能访问它。

如果你正在使用 Django,则可以像这样启动开发服务器:./manage.py runserver 0.0.0.0:8000


2
如果您正在使用Rails,并且恰巧看到了这篇Django文章,则相应的“rails”选项是rails -b 0.0.0.0 - sameers
你刚刚让我大开眼界,伙计 :) - kta

4

1). 项目必须以 python manage.py runserver 0.0.0.0:8000 运行。
如果这不能解决你的问题,那么

2). 打开你的 Vagrantfile 并添加
config.vm.network "forwarded_port", guest: 8000, host: 8001 在这个行之后
# config.vm.network "forwarded_port", guest: 80, host: 8080

这在我的情况下有效 ;)

注意:当运行 vagrant up 时提供了此端口转发信息
....
==> default: Forwarding ports...

default: 8000 => 8001 (adapter 1)
default: 22 => 2222 (adapter 1)


2

另一个解决方法是使用 vagrant 的 ssh 隧道。 打开终端并进入存放 Vagrantfile 的目录。 假设你的虚拟机已经启动 (vagrant up),执行以下命令。

# save vagrant ssh config to a file named `vagrant-ssh-config`
vagrant ssh-config > vagrant-ssh-config

之后,将访客的端口8000转发到主机。
ssh -L 8000:127.0.0.1:8000 -F vagrant-ssh-config default

现在打开您的浏览器并检查 127.0.0.1:8000

请注意,前面的命令还将在ssh服务器上打开一个shell。如果您想打开不带ssh服务器上的shell的ssh隧道,请添加-N

ssh -N -L 8000:127.0.0.1:8000 -F vagrant-ssh-config default

更新:2019年10月4日
转发端口的更简单解决方案。
vagrant ssh -- -N -L 8000:127.0.0.1:8000

本文在Vagrant 2.0.2版本上测试通过,但可能也适用于旧版本。


0

补充 @GrvTyagi 的答案。

我正在使用 Ubuntu: "hashicorp/bionic64"

我的 Vagrant 文件

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/bionic64"
  #Ubuntu 18.04
  config.vm.box_check_update = false
  config.vm.network "forwarded_port", guest: 8081, host: 8080
    config.vm.provider "virtualbox" do |vb|
      vb.gui = false
      vb.cpus = 2
      vb.memory = "4096"
    end
  
  config.vm.provision "shell", inline: <<-SHELL
  # your script to execute while provision the server goes here
  SHELL

end

由于某些原因,官方文档建议的默认端口(80)无法工作。因此,以下配置将无法正常工作:

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

通过运行一个简单的服务器来测试您的端口转发

python3 -m http.server 8081

你应该能够使用命令从主机连接到它

curl http://localhost:8080/ --trace-ascii dump.txt

一旦成功,强制在主机0.0.0.0和端口8081上运行您的应用程序。 在本地主机上运行将无法正常工作。

yourappserver --bindhost 0.0.0.0 -bindport 8081

你应该能够从主机连接它

http://0.0.0.0:8080

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