QEMU 支持多种网络模式,简单介绍如何使用这几种网络模式。
一、QEMU支持的网络模式
qemu-kvm主要向客户机提供了4种不同模式的网络。
1)基于网桥(bridge)的虚拟网卡;
2)基于NAT的虚拟网络(网络地址转换NAT);
3)QEMU内置的用户模式网络(user mode networking);
4)直接分配网络设备的网络(包括VT-d和SR-IOV)
二、基于网桥(bridge)的虚拟网卡
建立一个bridge,将其绑定到一个可正常工作的网络接口上,同时让bridge成为连接本机与外部网络的接口。
brctl addr br0
brctl addif br0 eth0
brctl stp br0 on
建立bridge后的状态是让网络接口eth0进入混杂模式(promiscuous mode,接收网络中所有数据包),网桥br0进入转发状态(forwarding state),并且与eth0具有相同的MAC地址.
建立一个TAP设备,将其绑定到网桥上
tunctl -u $(whoami) -t tap0
brctl addif br0 tap0
使用TAP设备
qemu -net nic -net tap,ifname=tap0
QEMU网络启动关闭脚本
客户机启动网络前会执行的脚本由”script”选项配置的(默认为/etc/qemu-ifup)。一般在该脚本上创建一个TAP设备并将其中与bridge绑定起来。
准备qemu-ifup和qemu-ifdown脚本
# cat /etc/qemu-ifup
#!/bin/bash
switch=br0
if [ -n "$1" ];then
#tunctl -u $(whoami) -t $1 #一些较旧版本中不会自动创建TAP设备
ifconfig $1 up
sleep 0.5s
brctl addif $switch $1
exit 0
else
echo 'Error: no specifed interface.'
exit 1
fi
由于qemu-kvm工具在客户机关闭时会解除TAP设备的bridge绑定,也会自动删除已不再使用的TAP设备,所有qemu-ifdown这个脚本不是必需的,最好设置为downscript=no(qemu-kvm的script参数是虚拟机启动时执行的脚本,downscript参数是虚拟机关闭时执行的参数)
# cat /etc/qemu-ifdown
#!/bin/bash
switch=br0
if [ -n $1 ];then
tunctl -d $1
brctl delif ${switch} $1
ip link set $1 down
exit 0
else
echo "Error: no interface specified"
exit 1
fi
三、基于NAT的虚拟网络(网络地址转换NAT)
网络设备,虚拟机连接主机
主机网卡:enp0s3
TAP设备:tap0
初始化TAP设备
tunctl -u $(whoami) -t tap0
ip addr add 192.168.0.1/24 dev tap0
ip link set dev tap0 up
虚拟机的启动命令行增加网络参数
-net nic -net tap,ifname=tap0
设置虚拟机IP,此处enp0s3为虚拟机网卡
ip addr add 192.168.0.2/24 dev enp0s3
虚拟机通过主机连接internet,现在实现了虚拟机和host的联网,如果需要虚拟机连接internet,则要在host设置NAT:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o enp0s3 -s 192.168.0.0/24 -j MASQUERADE
虚拟机添加DNS服务器
# /etc/resolv.conf
...
namserver 8.8.8.8
四、内置的用户模式网络(user mode networking)
虚拟机的启动命令行增加网络参数
-net nic -net user
五、仅主机(Host-only)模式
建立一个TAP设备,将其绑定到网桥上
tunctl -u $(whoami) -t tap0
brctl addif br0 tap0
使用TAP设备
qemu -net nic -net tap,ifname=tap0
六、桥接网络
重点注意:模拟主机网卡桥接模式,且混杂模式为全部允许
配置qemu虚拟机与主机在同一网络(主机所在网段)下,且可对外访问(一般为互联网),可以使用脚本1或脚本2。
脚本1
# net-bridge.sh
# network card 1: enp0s3
# network card 2: enp0s8
# network bridge: br0
# tap device: tap0
sysctl -w net.ipv4.ip_forwoard=1
ifconfig enp0s8 down
brctl addbr br0
brctl addif br0 enp0s8
brctl stp br0 off
brctl setfd br0 1
brctl sethello br0 1
ifconfig br0 0.0.0.0 promisc up
ifconfig enp0s8 0.0.0.0 promisc up
tunctl -t tap0 -u hsfengbyte
ip link set dev tap0 down
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up
脚本2
# net-iproutes-bridge.sh
# network card 1: enp0s3
# network card 2: enp0s8
# network bridge: br0
# tap device: tap0
#!/bin/bash
sysctl -w net.ipv4.ip_forward=1
ip link add name br0 type bridge
ip link set dev enp0s8 master br0
ip link set dev br0 up promisc on
ip link set dev enp0s8 up promisc on
ip tuntap add dev tap0 mode tap user hsfeng
ip link set dev tap0 master br0
ip link set dev tap0 up promisc on
dhclient
# dhcpcd
运行脚本1或脚本2后,主机网络:
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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:06:c3:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.8.209/24 brd 192.168.8.255 scope global dynamic enp0s3
valid_lft 42100sec preferred_lft 42100sec
inet 192.168.8.208/24 brd 192.168.8.255 scope global secondary noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::aa8:7bf2:99b:fcf2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 08:00:27:08:4b:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.8.143/24 brd 192.168.8.255 scope global dynamic enp0s8
valid_lft 41193sec preferred_lft 41193sec
inet 192.168.8.142/24 brd 192.168.8.255 scope global secondary noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::cfe0:a989:e6f0:a482/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 08:00:27:08:4b:8c brd ff:ff:ff:ff:ff:ff
inet 192.168.8.143/24 brd 192.168.8.255 scope global dynamic br0
valid_lft 42100sec preferred_lft 42100sec
inet 192.168.8.142/24 brd 192.168.8.255 scope global secondary noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::5c79:b0f1:69eb:54d8/64 scope link
valid_lft forever preferred_lft forever
6: tap0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether aa:dd:8b:c9:3c:55 brd ff:ff:ff:ff:ff:ff
inet 169.254.7.232/16 brd 169.254.255.255 scope link tap0:avahi
valid_lft forever preferred_lft forever
虚拟机网络:
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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:06:c3:ec brd ff:ff:ff:ff:ff:ff
inet 192.168.8.208/24 brd 192.168.8.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::aa8:7bf2:99b:fcf2/64 scope link
valid_lft forever preferred_lft forever
七、其他问题
自动获取dhcp
sudo apt intall dhcpcd
sudo systemctl enable dhcpcd
sudo systemctl start dhcpcd
sudo dhcpcd #获取ip
sudo dhcpcd -k #清空ip
文档信息
- 本文作者:hsfeng
- 本文链接:https://hsfeng.site/hsfengbyte.github.io.old/2020/12/02/qemu-network-mode/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)