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

400次阅读
没有评论

调试环境:
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)配置网络访问外网

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