
根据p。 166 的掌握 KVM 虚拟化由 Chirammal 等人(Packt,2016)提出,“虚拟网络”选项卡虚拟管理器允许创建三种虚拟网络:
- NATed
- 路由
- 孤立
查看链接到该选项卡的网络创建对话,这似乎大致正确。
默认情况下,允许 Virt-Manager 在运行的 PC 上创建 NAT 虚拟网络Debian 9“拉伸”,我看到sudo brctl show
结果(为了隐私而修改的桥 ID):
bridge name bridge id STP enabled interfaces
virbr0 8000.5254009dcac5 yes virbr0-nic
这提出了一些问题,例如:
- 如果
virbr0
是一个桥,那么它如何也能起到网络地址转换? virbr0
当我允许 Virt-Manager 创建虚拟网络时,它是唯一创建的东西,还是创建了其他东西(例如,virbr0
连接到的虚拟 NAT 路由器)?- 附加问题:假设主机有一个物理(以太网)网卡连接到 LAN,并且两个来宾虚拟机 VM1 和 VM2 连接到
virbr0
,网络拓扑是什么样的?
附录
以下是迄今为止的评论和答案中提到的 iptables 和 ebtables 状态:
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
$ sudo iptables -t nat -vL
Chain PREROUTING (policy ACCEPT 1556 packets, 130K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 726 packets, 82025 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 15148 packets, 953K bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 15148 packets, 953K bytes)
pkts bytes target prot opt in out source destination
84 11805 RETURN all -- any any 192.168.122.0/24 base-address.mcast.net/24
0 0 RETURN all -- any any 192.168.122.0/24 255.255.255.255
267 16020 MASQUERADE tcp -- any any 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
206 15656 MASQUERADE udp -- any any 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
1 84 MASQUERADE all -- any any 192.168.122.0/24 !192.168.122.0/24
$ sudo ebtables -L
Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
答案1
如果
virbr0
是网桥,那它怎么也能起到NAT的作用呢?
嗯,事实并非如此。但是系统本身在网桥上有一个端口,如果网桥上设置了IP地址,那么它可以在网桥和其他接口之间进行路由/转发/NAT。
因此,假设您有,eth0
例如上行链路和virbr0
桥接虚拟机,它们显示为vmnic0
等等。然后你会得到这样的东西:
^
|
eth0 (192.0.2.111 - your external IP)
|
[[ routing / NAT ]]
|
virbr0 (10.0.1.1 - this system on the VM bridge)
|
+--+-----+-----+-------+ (the bridging part)
| | ... | |
vmnic0 vmnicN
这里,eth0
不是桥的一部分。如果是这样,虚拟机将桥接到外部网络而不需要路由。 (vmnic
s 可能以其他方式命名,我不记得使用的命名约定......)
ifconfig
或者ip addr
应该能够显示桥接 IP,并且您需要iptables -t nat -vL
查看 iptables NAT 规则。
现在,virbr0-nic
您的示例中的 显然是一个虚拟设备,旨在为网桥提供不变的 MAC 地址。根据libvirt-users
邮件列表中的解释:
这是内核错误/功能的解决方法。网桥的 MAC 是从连接的第一个 NIC 复制的。因此,如果从网桥上分离所有接口,然后仅连接一个接口,网桥将丢失之前的 MAC 并获得一个新的 MAC,与连接的接口相同。
因此,如果 libvirt 必须确保虚拟网桥有一个 MAC,它会创建这个虚拟设备(但不会路由任何流量)并将其附加到虚拟网桥。