qemu 中文文档 下载 App

QEMU 网络不通、SSH 连不上、端口转发无效排查

先搞清楚你的网络模式

排障之前先确认你用的是哪种网络模式:

# 检查 QEMU 命令行里的网络参数
qemu-system-x86_64 -nic user,hostfwd=tcp::2222-:22 ...
# 模式: user mode + 端口转发

不同模式下的问题和解法完全不同。

User Mode:常见问题

1. Guest 里 ping 不通外网

User mode 不支持 ICMP(ping),这是正常设计。不是故障。

测试网络用:

# Guest 里
curl http://example.com
# 或
wget http://example.com
# 或
ping -4 -c 1 10.0.2.2   # 尝试 ping 默认网关(可能也不通)

TCP/UDP 流量应该正常工作。如果 curl 也超时,检查:

  1. DNS 是否正常:cat /etc/resolv.conf 应该有 nameserver
  2. 防火墙是否拦截:sudo iptables -L(Guest 里)
  3. 宿主是否能上网

2. 宿主 SSH 不到 Guest

User mode 默认宿主看不到 Guest。必须配置端口转发:

# 正确的端口转发写法
qemu-system-x86_64 \
  -nic user,hostfwd=tcp::2222-:22 \
  ...

# 宿主侧
ssh -p 2222 user@localhost

常见错误:

# 错误:只写端口不写 ip
-nic user,hostfwd=tcp:2222-:22

# 错误:Guest SSH 端口不是 22
# 如果 Guest 里 sshd 监听 2222:
-nic user,hostfwd=tcp::2222-:2222

# 错误:Guest 里 sshd 没启动
# Guest 里检查:
sudo systemctl status ssh

3. Guest IP 地址

User mode 下 Guest 的固定 IP 是 10.0.2.15,网关 10.0.2.2。你可以在 Guest 里手动配置静态 IP:

# Guest 里(Ubuntu netplan)
cat /etc/netplan/*.yaml
network:
  version: 2
  ethernets:
    ens3:
      dhcp4: false
      addresses: [10.0.2.15/24]
      routes:
        - to: default
          via: 10.0.2.2
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]

但配静态 IP 意义不大——User mode 的网段是固定的。

TAP + Bridge:常见问题

1. Guest 拿不到 IP

# 宿主检查桥接网卡
ip addr show br0
# br0 应该有 IP,状态 UP

# 宿主检查 TAP 设备
ip link show tap0
# tap0 应该状态 UP,master 是 br0

# Guest 里
sudo dhclient ens3
# 或检查网卡是否 UP
ip link show

如果 tap0 没有 master 或状态 DOWN:

sudo ip link set tap0 up
sudo ip link set tap0 master br0

2. 远程操作时桥接配错断 SSH

这是最经典的坑——把物理网卡加到桥上时,物理网卡的 IP 会被取消。如果你通过 SSH 连到宿主,立刻断连。

安全配置桥接的方法:

# 用脚本一次性完成(脚本里不要夹中间步骤)
cat > setup-bridge.sh << 'EOF'
#!/bin/bash
ip link add br0 type bridge
ip addr flush dev eth0
ip link set eth0 master br0
ip link set br0 up
ip link set eth0 up
ip addr add 192.168.1.100/24 dev br0
ip route add default via 192.168.1.1 dev br0
EOF
chmod +x setup-bridge.sh
# 执行脚本(SSH 连接会短暂断开,几秒后通过 br0 的 IP 重新连上)
./setup-bridge.sh

更安全的方式:用 virsh 或写好脚本通过 nohup 执行。

3. WiFi 桥接不工作

WiFi 的 AP 隔离特性会阻止桥接。大多数情况下WiFi 网卡不支持桥接。解决方法:

宿主机上用 curl 测试

无论哪种模式,用 curl 而不是 ping 最靠谱:

# 宿主测试端口转发
curl -v http://localhost:8080
# 应该能看到 Guest Web 服务的响应

# 如果连接被拒绝:
# - Guest 里的服务没启动
# - 端口转发参数写错了
# - Guest 里防火墙没开相应端口

# 如果连接超时:
# - Guest 网卡没连上
# - 宿主机防火墙拦截了

Windows 上的特殊情况

端口转发防火墙提示

Windows 防火墙第一次看到 QEMU 网络流量会弹窗,一定要勾选允许私人网络。否则所有网络功能被拦。

网络适配器优先级

Windows 有时会把 QEMU 的 TAP 适配器设成高优先级,影响上网。调整:

  1. 控制面板 → 网络和共享中心 → 更改适配器设置
  2. 右键「更改适配器选项」→「高级」→「高级设置」
  3. 把物理网卡的优先级提到 QEMU 适配器之上

macOS 上的特殊情况

macOS 的 SLIRP 网络和 User mode 类似,宿主默认看不到 Guest。用 -nic slirp,hostfwd=tcp::2222-:22 转发。

快速诊断清单

检查点命令
Guest 网卡是否存在Guest: ip link show
Guest 网卡是否 UPGuest: ip link set ens3 up
Guest 有没 IPGuest: ip addr show
DNS 是否可用Guest: cat /etc/resolv.conf
端口转发参数检查 QEMU 启动命令
宿主防火墙Linux: sudo iptables -L / Windows: 防火墙设置
sshd 是否在 Guest 运行Guest: sudo systemctl status ssh

下一步

网络通了?继续看 性能慢怎么优化。CPU feature 警告的处理也在那一页里。