虚拟网络术语:NATed 或路由网桥是矛盾的吗?

1 linux networking virtual-machine debian bridge

根据 p。在 Chirammal 等人 (Packt, 2016)的Mastering KVM Virtualization的166 中,Virt-Manager 中的“Virtual Networks”选项卡允许创建三种虚拟网络:

  • NATed
  • 路由
  • 隔离的

查看链接到该选项卡的网络创建对话框,这似乎大致正确。

默认情况下,允许 Virt-Manager 在运行Debian 9 "Stretch"的 PC 上创建一个 NATed 虚拟网络,我看到sudo brctl show收益(为了隐私而修改桥 ID):

bridge name bridge id       STP enabled interfaces
virbr0      8000.5254009dcac5   yes     virbr0-nic
Run Code Online (Sandbox Code Playgroud)

这引发了一些问题,例如:

  • 如果virbr0网桥,那怎么还可以做NAT呢?
  • 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
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 5

如果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
Run Code Online (Sandbox Code Playgroud)

这里,eth0不是桥的一部分。如果是这样,VM 将桥接到外部网络而无需路由。(vmnics 可能以其他方式命名,我不记得使用的命名约定......)

ifconfig或者ip addr应该能够向您显示网桥 IP,并且您需要iptables -t nat -vL查看 iptables NAT 规则。


现在,virbr0-nic在您的示例中,显然是一个虚拟设备,用于为网桥提供一个不变的 MAC 地址。根据邮件列表中的解释libvirt-users

这是内核错误/功能的解决方法。网桥的 MAC 是从连接的第一个 NIC 复制的。因此,如果从桥接器上分离所有接口,然后只连接一个,桥接器将丢失以前的 MAC 并获得一个新的 MAC——就像连接的接口一样。

因此,如果 libvirt 必须确保虚拟网桥的 MAC - 它会创建这个虚拟设备(尽管没有流量通过)并将其附加到虚拟网桥。