虛擬網路術語:NAT 或路由網橋是矛盾的嗎?
根據 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
不是橋的一部分。如果是這樣,虛擬機將被橋接到外部網路而無需路由。(vmnic
s 可能以其他方式命名,我不記得使用的命名約定……)
ifconfig
或者ip addr
應該能夠向您顯示網橋 IP,並且您需要iptables -t nat -vL
查看 iptables NAT 規則。現在,
virbr0-nic
在您的範例中,顯然是一個虛擬設備,旨在為網橋提供不變的 MAC 地址。根據郵件列表中的解釋libvirt-users
:這是核心錯誤/功能的解決方法。網橋的 MAC 是從連接的第一個 NIC 複製的。因此,如果從網橋中分離所有介面,然後僅連接一個,則網橋將失去先前的 MAC 並獲得新的 MAC - 與連接的介面相同。
因此,如果 libvirt 必須確保虛擬網橋的 MAC - 它會創建這個虛擬設備(儘管沒有流量通過)並將其附加到虛擬網橋。