调试环境:
MacOS(M4)+VMware(Ubuntu22.04)+qemu(ARM64+linux)
1. 在 Ubuntu 上创建 TAP 设备
安装必要的工具:
sudo apt update
sudo apt install -y bridge-utils
创建一个 tap0 设备:
sudo ip tuntap add dev tap0 mode tap user $(whoami)
sudo ip link set tap0 up
给 Ubuntu 添加一个 IP 地址,作为网关。
sudo ip addr add 192.168.100.1/24 dev tap0
2. 使用 TAP 设备启动 QEMU
qemu-system-aarch64 -nographic -machine virt -cpu cortex-a57 -m 1024 -smp 4 -kernel arch/arm64/boot/Image --append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8" -drive if=none,file=rootfs.img,id=hd0 -device virtio-blk-device,drive=hd0 -device virtio-net-device,netdev=net0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no
3. 在 qemu 内配置网络
ip addr add 192.168.100.2/24 dev eth0
ip link set eth0 up
ip route add default via 192.168.100.1
或用 ifconfig
ifconfig eth0 192.168.100.2/24
测试网络连通:
ping 192.168.100.1 # Ubuntu 的 tap0 设备
ping 8.8.8.8 # 测试外网连接
发现 192.168.100.1 是通的,外网不通
4. 检查网络:
ubuntu 开启 tcpdump 抓包
sudo tcpdump -i any icmp
qemu
ping -c 4 8.8.8.8
16:17:53.658278 tap0 In IP 192.168.100.2 > dns.google: ICMP echo request, id 784, seq 1, length 64
16:17:54.677696 tap0 In IP 192.168.100.2 > dns.google: ICMP echo request, id 784, seq 2, length 64
16:17:55.702926 tap0 In IP 192.168.100.2 > dns.google: ICMP echo request, id 784, seq 3, length 64
16:17:56.726833 tap0 In IP 192.168.100.2 > dns.google: ICMP echo request, id 784, seq 4, length 64
可知,qemu(192.168.100.2)确实已经将 ICMP 请求发送到外网(dns.google),但从 tcpdump 中没有看到返回数据包,即 ICMP 包发送到 ubuntu,后续链路是有问题的。
5. 配置 ubuntu 转发:
5.1 配置 IP 转发
sudo sysctl -w net.ipv4.conf.all.forwarding=1
永久开启 IP 转发(重启不丢失)
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
重启验证:
cat /proc/sys/net/ipv4/ip_forward
5.2 配置 iptables NAT 规则
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -L -v |grep MASQUERADE
作用:设置 NAT(网络地址转换),使 QEMU 内部的 ARM64 Linux 通过 Ubuntu 主机访问外网。
iptables:Linux 防火墙工具,用于配置 NAT 和数据包转发规则。-t nat:指定 NAT 表(iptables 有 filter、nat、mangle 等表)。-A POSTROUTING:在 POSTROUTING 规则链中添加新规则(即数据包离开本机时修改)。-o eth0:表示应用于 eth0 网卡(假设 Ubuntu 主机的网卡是 eth0,可以用 ip a 确认)。-j MASQUERADE:启用 IP 伪装(动态 NAT),使 QEMU 内部网络的流量看起来像是来自 Ubuntu 主机,从而能访问外网。
如果需要保留规则,防止重启丢失,可以使用 iptables-save:
sudo iptables-save | sudo tee /etc/iptables.rules
然后编辑 /etc/network/interfaces 或 systemd 网络配置,在 aaa01 启动时自动加载:
echo "pre-up iptables-restore < /etc/iptables.rules" | sudo tee -a /etc/network/interfaces
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
5.3 防火墙配置:
虽然 MASQUERADE 规则已经存在,但有可能存在其他防火墙规则(例如 ufw 或 iptables 默认规则)阻止流量转发。你可以暂时禁用防火墙(ufw)进行测试:
sudo ufw allow out on eth0
sudo ufw allow in on tap0
或直接关闭防火墙
sudo ufw disable
配置完成:
正文完