虚拟网络术语:NAT 或路由桥是否矛盾?

虚拟网络术语:NAT 或路由桥是否矛盾?

根据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不是桥的一部分。如果是这样,虚拟机将桥接到外部网络而不需要路由。 (vmnics 可能以其他方式命名,我不记得使用的命名约定......)

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


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

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

因此,如果 libvirt 必须确保虚拟网桥有一个 MAC,它会创建这个虚拟设备(但不会路由任何流量)并将其附加到虚拟网桥。

相关内容