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

https://tomwei7.com/2021/10/09/qemu-network-config

https://segmentfault.com/a/1190000009491002

posted @ 2020-08-19 11:16  江湖小小白  阅读(726)  评论(0)    收藏  举报