做人呢,最紧要就系开心啦

Ubuntu虚拟机中运行qemu(ARM+Linux)配置网络访问外网

290次阅读
没有评论

调试环境:
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 虚拟机中运行 qemu(ARM+Linux)配置网络访问外网
给 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

Ubuntu 虚拟机中运行 qemu(ARM+Linux)配置网络访问外网

测试网络连通:

ping 192.168.100.1  # Ubuntu 的 tap0 设备
ping 8.8.8.8        # 测试外网连接 

发现 192.168.100.1 是通的,外网不通
Ubuntu 虚拟机中运行 qemu(ARM+Linux)配置网络访问外网

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

配置完成:
Ubuntu 虚拟机中运行 qemu(ARM+Linux)配置网络访问外网

正文完
 
admin
版权声明:本站原创文章,由 admin 2025-02-18发表,共计2278字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)