vagrant(7)网络类型及端口映射
网络与端口映射
目标:掌握 Vagrant 的网络配置,包括端口转发、私有网络、公有网络,理解网络类型的使用场景,并能够通过端口映射访问虚拟机中的服务。
官方文档
网络类型介绍
网络类型详解:
- 端口转发(Forwarded Port):将虚拟机的端口映射到主机端口,适合访问虚拟机中的服务(如 Web 服务器)。
- 私有网络(Private Network):主机与虚拟机通信(Host-Only),或虚拟机之间通信,适合本地开发和测试。
- 公有网络(Public Network):虚拟机直接接入外部网络(桥接模式),适合模拟生产环境或局域网访问。
端口转发应用:通过映射端口访问虚拟机中的服务(如 HTTP、SSH)。
网络问题排查:解决端口冲突、防火墙限制、网络连接问题。
高级网络配置:动态端口分配、多个端口映射、自定义网络接口。
网络示例
- 端口转发配置:
1
config.vm.network "forwarded_port", guest: 80, host: 8080
- 私有网络配置:
1
config.vm.network "private_network", ip: "192.168.56.10"
- 公有网络配置:
1
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)"
- 多端口映射:
1
2config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 22, host: 2222 - 多机网络配置:
1
2
3
4
5
6config.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.配置端口转发
- 初始化项目:
- 创建一个新目录并初始化 Vagrant 项目:
1
2
3mkdir vagrant-networking
cd vagrant-networking
vagrant init ubuntu/jammy64
- 创建一个新目录并初始化 Vagrant 项目:
- 配置端口转发:
- 编辑
Vagrantfile
,映射虚拟机的 80 端口到主机的 8080:1
2
3
4Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.network "forwarded_port", guest: 80, host: 8080
end
- 编辑
- 安装 Web 服务器(Nginx):
- 启动虚拟机并登录:
1
2vagrant up
vagrant ssh - 安装 Nginx 并启动:
1
2
3
4sudo apt update
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
- 启动虚拟机并登录:
- 验证端口映射:
- 在主机浏览器访问
http://localhost:8080
,应显示 Nginx 默认页面:
Welcome to nginx! - 或者使用
curl
测试:1
curl http://localhost:8080
- 在主机浏览器访问
5.执行provison shell
1 | Vagrant.configure("2") do |config| |
2.配置私有网络
- 添加私有网络:
- 修改
Vagrantfile
,为虚拟机分配一个静态 IP(Host-Only 网络):1
2
3
4
5Vagrant.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
- 修改
- 启动并验证:
- 启动虚拟机:
1
vagrant up
- 登录虚拟机,检查 IP 地址:
1
2vagrant ssh
ip addr show | grep 192.168.56.10 - 从主机访问虚拟机的 Nginx 服务:
1
curl http://192.168.56.10
- 启动虚拟机:
3.配置公有网络
- 添加公有网络(桥接模式):
- 修改
Vagrantfile
,配置桥接网络,让虚拟机获取局域网 IP:1
2
3
4Vagrant.configure("2") do |config|
config.vm.box = "Ubuntu/jammy64"
config.vm.network "public_network", bridge: "en0: Wi-Fi (AirPort)" # 替换为你的网络接口
end - 注意:
bridge
参数需根据主机网络接口调整,Windows 用户可能需要手动选择接口,macOS/Linux 可通过ifconfig
或ip link
查看接口名。
- 修改
- 启动并验证:
- 启动虚拟机:
1
vagrant up
- 登录虚拟机,查看分配的局域网 IP:
1
2vagrant ssh
ip addr show | grep inet - 从局域网内其他设备访问虚拟机的 IP(需确保 Nginx 已运行)。
- 启动虚拟机:
4.动态端口分配和多个端口映射
- 动态端口分配:
- 如果不指定主机端口,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)
- 如果不指定主机端口,Vagrant 会自动分配一个可用端口(前提是8080被占用):
- 多个端口映射:
- 映射多个端口(如 HTTP 和 SSH):
1
2
3
4
5Vagrant.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
- 映射多个端口(如 HTTP 和 SSH):
5.配置多机环境下的网络
- 多机私有网络:
- 配置两台虚拟机,确保它们在同一私有网络中可以通信:
1
2
3
4
5
6
7
8
9
10
11
12
13Vagrant.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
- 配置两台虚拟机,确保它们在同一私有网络中可以通信:
- 测试通信:
- 启动虚拟机:
1
vagrant up
- 登录 Web 虚拟机,测试与 DB 虚拟机的通信:
1
2vagrant ssh web
ping 192.168.56.11
- 启动虚拟机:
6.错误处理
- 端口冲突:
- 问题:主机端口(如 8080)已被占用。
- 解决:
- 检查占用端口:
1
netstat -tuln | grep 8080
- 更换主机端口:
1
config.vm.network "forwarded_port", guest: 80, host: 8081
- 或使用动态分配(
host: 0
)。
- 检查占用端口:
- 服务未启动:
- 问题:Nginx 或其他服务未运行,导致映射端口无响应。
- 解决:
- 检查服务状态:
1
sudo systemctl status nginx
- 启动服务:
1
sudo systemctl start nginx
- 检查服务状态:
- 防火墙限制:
- 问题:主机或虚拟机防火墙阻止访问。
- 解决:
- 虚拟机内允许端口(以
ufw
为例):1
2
3
4sudo ufw allow 80/tcp
sudo ufw allow 22/tcp
or
sudo ufw disable - 主机检查防火墙(如 Windows Defender),允许相应端口。
- 虚拟机内允许端口(以
- 私有网络 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
- 更换 IP:
- 问题:IP 地址(如
- 公有网络无 IP 分配:
- 问题:虚拟机未获取局域网 IP。
- 解决:
- 确保 DHCP 服务可用。
- 指定桥接接口正确:
1
ifconfig # 或 ip link,查看接口名
- 手动指定 IP(可选):
1
config.vm.network "public_network", ip: "192.168.1.200"
- 多机通信失败:
- 问题:虚拟机间
ping
无响应。 - 解决:
- 确保两台虚拟机在同一网络段(IP 前缀一致)。
- 检查防火墙:
1
sudo ufw allow from 192.168.56.0/24
- 问题:虚拟机间
7.常见问题与解决(FAQ)
- Q:端口转发后无法访问?
A:检查主机端口是否被占用,虚拟机服务是否运行,防火墙是否阻止。使用netstat
或ss
查看端口状态。 - Q:私有网络 IP 无法访问?
A:确保虚拟机已分配正确 IP,主机网络适配器(VirtualBox Host-Only Adapter)正常,防火墙未阻止。 - Q:公有网络未分配 IP?
A:确认桥接接口正确,DHCP 服务可用,或者手动指定 IP。 - Q:多机间通信失败?
A:检查 IP 地址是否在同一网段,防火墙是否阻止,尝试使用ping
和traceroute
调试。 - Q:动态端口分配后找不到端口?
A:查看vagrant up
输出,记录分配的主机端口,或使用vagrant port
查看映射。