我正在尝试在我的 QEMU 机器中创建默认 NAT and 桥接接口。自然地,我在单独的文件中创建了桥接口
/etc/network/intefaces.d/virbr2
。这是 virbr2 文件配置:
# Configuring network virtual interface
# to be a virt switch
auto virbr2
iface virbr2 inet static
bridge_ports enp1s0
address 192.168.1.3
netmask 255.255.255.0
broadcast 192.168.1.255
up ip route add 192.168.1.2 via 192.168.1.1 via enp1s0
brdige_stp off
bridge_waitport 0
bridge_fd 0
我的通用接口配置文件很简单
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# auto launch enp1s0 interface after the host os is booted
# since we want create a bridge interface, let's attach
# it to bridge interface br0
auto enp1s0
iface enp1s0 inet manual
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
因此,使用正确的 IP 地址创建了接口 virbr2
$ ip a | grep -A 5 virbr2
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virbr2 state UP group default qlen 1000
link/ether e8:d8:d1:51:15:c2 brd ff:ff:ff:ff:ff:ff
3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 04:ea:56:59:cf:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.31.69/24 brd 192.168.31.255 scope global dynamic noprefixroute wlp0s20f3
valid_lft 41947sec preferred_lft 41947sec
--
4: virbr2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d6:71:34:e1:fa:9b brd ff:ff:ff:ff:ff:ff
inet 192.168.1.3/24 brd 192.168.1.255 scope global virbr2
valid_lft forever preferred_lft forever
inet6 fdf7:2246:8eb:0:d471:34ff:fee1:fa9b/64 scope global dynamic mngtmpaddr
valid_lft forever preferred_lft forever
inet6 fe80::d471:34ff:fee1:fa9b/64 scope link
valid_lft forever preferred_lft forever
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242daa58f02 no
virbr0 8000.525400d87725 yes
virbr2 8000.d67134e1fa9b no enp1s0
创建桥接口后,我尝试使用下一个命令启动我的虚拟机:
qemu-system-x86_64 \
-m 4096 \
-smp 4 \
-drive 'file=debian-opkg-server.qcow2,if=virtio,format=qcow2' \
-net 'user,hostfwd=tcp::2200-:22' \
-net nic \
-netdev 'tap,id=br1,ifname=virbr2,script=no,downscript=no' \
-device 'virtio-net-pci,netdev=br1'
脚本启动后,我收到下一条错误消息
Unable to init server: Could not connect: Connection refused
qemu-system-x86_64: could not configure /dev/net/tun (virbr2): Invalid argument
论证无效怎么可能?接口名称是正确的,所以我不知道它不起作用的原因。
在回答问题时,参数无效,因为 virbr2 是一个bridge,而-netdev 的“tap”方法需要一个tuntap 设备。
你可以这样做来设置你的桥梁:
auto br0
iface br0 inet static
address 192.168.100.254/24
# Create the bridge interface:
pre-up ip link add dev br0 type bridge
# This is because I have dnsmasq listing on the bridge:
post-up resolvectl dns br0 192.168.100.254
# Delete the link when done, returning true regardless if success
post-down ip link del dev br0 type bridge || true
auto virif0
iface virif0 inet manual
# Create a TAP interface named virif0
pre-up ip tuntap add mode tap name virif0
# Attach the the TAP interface to the bridge
pre-up ip link set master br0 virif0
# Delete link when done, returning true regardless of success
post-down ip link del dev virtif1 || true
像这样设置 NAT:
UPSTREAM=eth0
iptables -t nat -A POSTROUTING -o $UPSTREAM -j MASQUERADE
sysctl net.ipv4.ip_forward=1
然后,在您的 qemu 调用中,将 ifname=virbr0 更改为 ifname=virif0。您将为要同时运行的每个虚拟机创建一个 tuntap 接口,例如 virif1、virtif2 等。此外,请务必为网桥上的每个接口指定不同的 MAC 地址,否则你会遇到困难。