Linux

虛擬網路術語:NAT 或路由網橋是矛盾的嗎?

  • November 8, 2017

根據 p。Chirammal 等人 (Packt, 2016)在Mastering KVM Virtualization的第166節中, Virt-Manager中的“虛擬網路”選項卡允許創建三種虛擬網路:

  • 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

這提出了一些問題,例如:

  • 如果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

如果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 - 它會創建這個虛擬設備(儘管沒有流量通過)並將其附加到虛擬網橋。

引用自:https://unix.stackexchange.com/questions/403315