vagrant(7)网络类型及端口映射

网络与端口映射

目标:掌握 Vagrant 的网络配置,包括端口转发、私有网络、公有网络,理解网络类型的使用场景,并能够通过端口映射访问虚拟机中的服务。


官方文档

网络类型介绍

  • 网络类型详解

    • 端口转发(Forwarded Port):将虚拟机的端口映射到主机端口,适合访问虚拟机中的服务(如 Web 服务器)。
    • 私有网络(Private Network):主机与虚拟机通信(Host-Only),或虚拟机之间通信,适合本地开发和测试。
    • 公有网络(Public Network):虚拟机直接接入外部网络(桥接模式),适合模拟生产环境或局域网访问。
  • 端口转发应用:通过映射端口访问虚拟机中的服务(如 HTTP、SSH)。

  • 网络问题排查:解决端口冲突、防火墙限制、网络连接问题。

  • 高级网络配置:动态端口分配、多个端口映射、自定义网络接口。


网络示例

  1. 端口转发配置
    1
    config.vm.network "forwarded_port", guest: 80, host: 8080
  2. 私有网络配置
    1
    config.vm.network "private_network", ip: "192.168.56.10"
  3. 公有网络配置
    1
    config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"
  4. 多端口映射
    1
    2
    config.vm.network "forwarded_port", guest: 80, host: 8080
    config.vm.network "forwarded_port", guest: 22, host: 2222
  5. 多机网络配置
    1
    2
    3
    4
    5
    6
    config.vm.define "web" do |web|
    web.vm.network "private_network", ip: "192.168.56.10"
    end
    config.vm.define "db" do |db|
    db.vm.network "private_network", ip: "192.168.56.11"
    end

实战

1.配置端口转发

  1. 初始化项目
    • 创建一个新目录并初始化 Vagrant 项目:
      1
      2
      3
      mkdir vagrant-networking
      cd vagrant-networking
      vagrant init ubuntu/jammy64
  2. 配置端口转发
    • 编辑 Vagrantfile,映射虚拟机的 80 端口到主机的 8080:
      1
      2
      3
      4
      Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/jammy64"
      config.vm.network "forwarded_port", guest: 80, host: 8080
      end
  3. 安装 Web 服务器(Nginx)
    • 启动虚拟机并登录:
      1
      2
      vagrant up
      vagrant ssh
    • 安装 Nginx 并启动:
      1
      2
      3
      4
      sudo apt update
      sudo apt install -y nginx
      sudo systemctl start nginx
      sudo systemctl enable nginx
  4. 验证端口映射
    • 在主机浏览器访问 http://localhost:8080,应显示 Nginx 默认页面:
      Welcome to nginx!
    • 或者使用 curl 测试:
      1
      curl http://localhost:8080

5.执行provison shell

1
2
3
4
5
6
7
8
9
10
11
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.network "forwarded_port", guest: 80, host: 8080

config.vm.provision "shell", inline: <<-SHELL
sudo apt update
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
SHELL
end

local access.png

2.配置私有网络

  1. 添加私有网络
    • 修改 Vagrantfile,为虚拟机分配一个静态 IP(Host-Only 网络):
      1
      2
      3
      4
      5
      Vagrant.configure("2") do |config|
      config.vm.box = "Ubuntu/jammy64"
      config.vm.network "private_network", ip: "192.168.56.10"
      config.vm.network "forwarded_port", guest: 80, host: 8080
      end
  2. 启动并验证
    • 启动虚拟机:
      1
      vagrant up
    • 登录虚拟机,检查 IP 地址:
      1
      2
      vagrant ssh
      ip addr show | grep 192.168.56.10
    • 从主机访问虚拟机的 Nginx 服务:
      1
      curl http://192.168.56.10

3.配置公有网络

  1. 添加公有网络(桥接模式)
    • 修改 Vagrantfile,配置桥接网络,让虚拟机获取局域网 IP:
      1
      2
      3
      4
      Vagrant.configure("2") do |config|
      config.vm.box = "Ubuntu/jammy64"
      config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)" # 替换为你的网络接口
      end
    • 注意bridge 参数需根据主机网络接口调整,Windows 用户可能需要手动选择接口,macOS/Linux 可通过 ifconfigip link 查看接口名。
  2. 启动并验证
    • 启动虚拟机:
      1
      vagrant up
    • 登录虚拟机,查看分配的局域网 IP:
      1
      2
      vagrant ssh
      ip addr show | grep inet
    • 从局域网内其他设备访问虚拟机的 IP(需确保 Nginx 已运行)。

4.动态端口分配和多个端口映射

  1. 动态端口分配
    • 如果不指定主机端口,Vagrant 会自动分配一个可用端口(前提是8080被占用)
      1
      config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
    • 启动后,Vagrant 会显示分配的端口:
      ==> default: Forwarding ports…
      default: 80 (guest) => 49152 (host) (adapter 1)
  2. 多个端口映射
    • 映射多个端口(如 HTTP 和 SSH):
      1
      2
      3
      4
      5
      Vagrant.configure("2") do |config|
      config.vm.box = "Ubuntu/jammy64"
      config.vm.network "forwarded_port", guest: 80, host: 8080
      config.vm.network "forwarded_port", guest: 22, host: 2222
      end
    • 验证 SSH 映射:
      1
      ssh vagrant@localhost -p 2222

5.配置多机环境下的网络

  1. 多机私有网络
    • 配置两台虚拟机,确保它们在同一私有网络中可以通信:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      Vagrant.configure("2") do |config|
      config.vm.define "web" do |web|
      web.vm.box = "Ubuntu/jammy64"
      web.vm.network "private_network", ip: "192.168.56.10"
      web.vm.network "forwarded_port", guest: 80, host: 8080
      end

      config.vm.define "db" do |db|
      db.vm.box = "Ubuntu/jammy64"
      db.vm.network "private_network", ip: "192.168.56.11"
      db.vm.network "forwarded_port", guest: 3306, host: 3306
      end
      end
  2. 测试通信
    • 启动虚拟机:
      1
      vagrant up
    • 登录 Web 虚拟机,测试与 DB 虚拟机的通信:
      1
      2
      vagrant ssh web
      ping 192.168.56.11

6.错误处理

  1. 端口冲突
    • 问题:主机端口(如 8080)已被占用。
    • 解决
      1. 检查占用端口:
        1
        netstat -tuln | grep 8080
      2. 更换主机端口:
        1
        config.vm.network "forwarded_port", guest: 80, host: 8081
      3. 或使用动态分配(host: 0)。
  2. 服务未启动
    • 问题:Nginx 或其他服务未运行,导致映射端口无响应。
    • 解决
      • 检查服务状态:
        1
        sudo systemctl status nginx
      • 启动服务:
        1
        sudo systemctl start nginx
  3. 防火墙限制
    • 问题:主机或虚拟机防火墙阻止访问。
    • 解决
      • 虚拟机内允许端口(以 ufw 为例):
        1
        2
        3
        4
        sudo ufw allow 80/tcp
        sudo ufw allow 22/tcp
        or
        sudo ufw disable
      • 主机检查防火墙(如 Windows Defender),允许相应端口。
  4. 私有网络 IP 冲突
    • 问题:IP 地址(如 192.168.56.10)已被占用。
    • 解决
      • 更换 IP:
        1
        config.vm.network "private_network", ip: "192.168.56.11"
      • 检查主机网络:
        1
        ip addr show | grep 192.168.56
  5. 公有网络无 IP 分配
    • 问题:虚拟机未获取局域网 IP。
    • 解决
      • 确保 DHCP 服务可用。
      • 指定桥接接口正确:
        1
        ifconfig  # 或 ip link,查看接口名
      • 手动指定 IP(可选):
        1
        config.vm.network "public_network", ip: "192.168.1.200"
  6. 多机通信失败
    • 问题:虚拟机间 ping 无响应。
    • 解决
      • 确保两台虚拟机在同一网络段(IP 前缀一致)。
      • 检查防火墙:
        1
        sudo ufw allow from 192.168.56.0/24

7.常见问题与解决(FAQ)

  1. Q:端口转发后无法访问?
    A:检查主机端口是否被占用,虚拟机服务是否运行,防火墙是否阻止。使用 netstatss 查看端口状态。
  2. Q:私有网络 IP 无法访问?
    A:确保虚拟机已分配正确 IP,主机网络适配器(VirtualBox Host-Only Adapter)正常,防火墙未阻止。
  3. Q:公有网络未分配 IP?
    A:确认桥接接口正确,DHCP 服务可用,或者手动指定 IP。
  4. Q:多机间通信失败?
    A:检查 IP 地址是否在同一网段,防火墙是否阻止,尝试使用 pingtraceroute 调试。
  5. Q:动态端口分配后找不到端口?
    A:查看 vagrant up 输出,记录分配的主机端口,或使用 vagrant port 查看映射。