QEMU 网络
一、默认网络
不使用任何参数,默认也有一个基于 SLIRP 的 NAT 网络。使用 -nic none 或 -nodefaults 可以禁用网络
SLIRP 不支持某些网络协议。如 ICMP,即不能在虚拟机中使用 ping。另外开销很大,所以性能也较差
qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio udhcpc nslookup baidu.com wget -qO- http://baidu.com
二、基于 TAP 的 NAT 网络
需要在宿主机上手动创建 bridge 设备
sudo ip link add name br0 type bridge # brd + 表示使用默认广播地址,这样操作系统会根据给定的 IP 和子网掩码计算出对应的广播地址 sudo ip addr add 192.168.1.1/24 brd + dev br0 sudo ip link set br0 up # 使虚拟机可以通过 dhcp 获取 ip sudo apt install -y dnsmasq sudo dnsmasq --bind-interfaces --interface=br0 --dhcp-range=br0,192.168.1.100,192.168.1.200,12h # 允许对从 br0 流入的数据包进行 FORWARD sudo iptables -t filter -A FORWARD -i br0 -j ACCEPT sudo iptables -t filter -A FORWARD -o br0 -j ACCEPT # 也可以直接将 filter FORWARD 策略直接设置为 ACCEPT # sudo iptables -t filter -P FORWARD ACCEPT # 开启 NAT sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo sysctl -w net.ipv4.ip_forward=1 # sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
然后启动虚拟机配置 IP 进行测试
sudo mkdir -p /etc/qemu sudo sh -c 'echo allow br0 > /etc/qemu/bridge.conf' # 自动创建 tap,启动多个虚拟机时需手动指定 mac 地址,避免重复 sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic tap,helper=/lib/qemu/qemu-bridge-helper qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic bridge,mac=52:54:98:76:54:32 # 手动创建 tap sudo ip tuntap add mode tap dev tap0 user $USER sudo ip link set dev tap0 master br0 # 手动加入,不使用 script 指定脚本处理 sudo ip link set dev tap0 up qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic tap,ifname=tap0,script=no,downscript=no # 自动获取 udhcpc # 或手动设置 ip addr add 192.168.1.2/24 dev eth0 ip link set dev eth0 up # route add default gw 192.168.1.1 ip route add default via 192.168.1.1 dev eth0 sh -c 'echo nameserver 8.8.8.8 > /etc/resolv.conf' ping -c 4 baidu.com
三、基于 TAP 的 bridge 网络
需要在宿主机上手动创建 bridge 设备,并把物理网卡设备加入到 bridge
sudo ip link add name br0 type bridge sudo ip link set dev eth0 promisc on # 混杂模式 sudo ip link set dev eth0 master br0 sudo ip link set dev br0 type bridge stp_state 0 # 关闭生成树协议 sudo ip link set br0 up ls /sys/class/net/br0/brif/ bridge link
把物理网卡 eth0 的 ip 设置到 br0,先查下信息
$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:15:5d:37:1f:d7 brd ff:ff:ff:ff:ff:ff inet 172.30.161.52/20 brd 172.30.175.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::215:5dff:fe37:1fd7/64 scope link valid_lft forever preferred_lft forever $ ip route default via 172.30.160.1 dev eth0 proto kernel 172.30.160.0/20 dev eth0 proto kernel scope link src 172.30.161.52 $ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default DESKTOP-8P8K888 0.0.0.0 UG 0 0 0 eth0 172.30.160.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
根据信息设置 br0,有 dhcp 的话可以直使用 dhclient 接释放掉 eth0,让 br0 获取 ip
sudo ip address delete 172.30.161.52/20 dev eth0 sudo ip address add 172.30.161.52/20 brd + dev br0 sudo ip route add default via 172.30.160.1 dev br0
然后启动虚拟机配置 IP 进行测试
sudo mkdir -p /etc/qemu sudo sh -c 'echo allow br0 > /etc/qemu/bridge.conf' # 自动创建 tap,启动多个虚拟机时需手动指定 mac 地址,避免重复 sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic tap,helper=/lib/qemu/qemu-bridge-helper qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic bridge,mac=52:54:98:76:54:32 # 手动创建 tap sudo ip tuntap add mode tap dev tap0 user $USER sudo ip link set dev tap0 master br0 sudo ip link set dev tap0 up qemu-system-x86_64 -drive file=~/disk.img,format=raw -serial stdio -nic tap,ifname=tap0,script=no,downscript=no # 有 dhcp 服务这里就不用手动设置,可以使用 udhcpc ip addr add 172.30.161.53/20 brd 172.30.175.255 dev eth0 ip link set eth0 up # route add default gw 172.30.160.1 ip route add default via 172.30.160.1 dev eth0 sh -c 'echo nameserver 8.8.8.8 > /etc/resolv.conf' sh -c 'echo nameserver 172.30.160.1 > /etc/resolv.conf' wget -qO- http://baidu.com
https://wiki.qemu.org/Documentation/Networking
https://www.qemu.org/docs/master/system/invocation.html#hxtool-5

浙公网安备 33010602011771号