Networking

KVM nat 命令行

  • January 15, 2022

在 KVM vm 和主機之間設置 NAT 網路的正確方法是什麼?

KVM 虛擬機:

未安裝防火牆

$ sudo arp-scan -r 5 -t 1000 –interface=eth0 –localnet

10.0.2.2     52:55:0a:00:02:02    locally administered
10.0.2.3     52:55:0a:00:02:03    locally administered

$ ip r

default via 10.0.2.2 dev eth0 proto dhcp metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100

如果配置

eth0: inet 10.0.2.15 netmask 255.255.255.0 broacast 10.0.2.255
     ether 52:54:00:12:34:56
lo: inet 127.0.0.1 netmask 255.0.0.0
     inet6 ::1

主持人:

:~$ ip r

0.0.0.0/1 via 10.211.1.10 dev tun0 
default via 192.168.1.1 dev wlan0 proto dhcp metric 600 
10.21xxxxxxxx dev tun0 proto kernel scope link src 10.21xxxxx 
xxxxxxxxxxxx dev wlan0 
128.0.0.0/1 via 10.211.1.10 dev tun0 
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.172 metric 600 
192.168.4.0/22 dev eth0 proto kernel scope link src 192.168.4.8 metric 100 

:~$ ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
   inet 10.0.2.3  netmask 255.0.0.0  broadcast 10.255.255.255
   inet6 fe80::76c8:79b4:88d4:7f5c  prefixlen 64  scopeid 0x20<link>
   ether ec:8e:b5:71:33:6e  txqueuelen 1000  (Ethernet)
   RX packets 1700  bytes 194730 (190.1 KiB)
   RX errors 0  dropped 0  overruns 0  frame 0
   TX packets 2862  bytes 246108 (240.3 KiB)
   TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
   device interrupt 16  memory 0xe1000000-e1020000  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
   inet 127.0.0.1  netmask 255.0.0.0
   inet6 ::1  prefixlen 128  scopeid 0x10<host>
   loop  txqueuelen 1000  (Local Loopback)
   RX packets 13251  bytes 7933624 (7.5 MiB)
   RX errors 0  dropped 0  overruns 0  frame 0
   TX packets 13251  bytes 7933624 (7.5 MiB)
   TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
   inet 10.211.1.69  netmask 255.255.255.255  destination 10.211.1.70
   inet6 fe80::a920:941c:ffa8:5579  prefixlen 64  scopeid 0x20<link>
   unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
   RX packets 4348  bytes 2242726 (2.1 MiB)
   RX errors 0  dropped 0  overruns 0  frame 0
   TX packets 3823  bytes 404190 (394.7 KiB)
   TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
   inet 192.168.1.172  netmask 255.255.255.0  broadcast 192.168.1.255
   inet6 fe80::651b:5014:7929:9ba3  prefixlen 64  scopeid 0x20<link>
   ether d8:55:a3:d5:d1:30  txqueuelen 1000  (Ethernet)
   RX packets 114455  bytes 117950099 (112.4 MiB)
   RX errors 0  dropped 0  overruns 0  frame 0
   TX packets 67169  bytes 14855011 (14.1 MiB)
   TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 

~$ sudo arp-scan -r 5 -t 1000 –localnet

just hangs......

主機無法 ping 10.0.2.2

沒有啟用防火牆

試過了

$ sudo ip route add default via 10.0.2.0
$ sudo ip route add default via 10.0.2.2
$ sudo ip route add default via 10.0.2.0/24

NAT 可以在沒有 virsh 的情況下工作嗎?

只能從命令行修復 NAT 嗎?

更新:

$ sudo ip link add natbr0 type bridge
$ sudo ip link set dev natbr0 up
$ sudo ip link set dev eth0 up
$ sudo ip link set dev eth0 master natbr0

可以將 eth0 slave 橋接到 kvm - vm 可以 ping 網路上的其他電腦。但不是主機@Tom Yan 的回答結合上面創建的可以ping其他網路IP的命令的archlinux-Network_bridge

所以我試圖改變工作橋連接以允許主機和 kvm 交談。

Goal: host$ ping kvm

$ sudo ip link add natbr0 type bridge
$ sudo ip link set dev natbr0 up
$ sudo ip a add 10.0.2.1/24 dev natbr0
$ sudo kvm -m 3G -hdb /dev/sde  -nic bridge,br=natbr0
kvm$ sudo ip link add natbr0 type bridge
kvm$ sudo ip a add 10.0.2.2
kvm$ sudo ip link set dev natbr0 up
kvm can ping it self 

$ ping 10.0.2.2

PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.027 ms

但是 kvm$ping 10.0.2.1

Destination Host Unreachable

主機$ ping 10.0.2.2

(just hangs)

更喜歡命令行來測試程序/系統裸骨的彈性,而不是許多可能對失敗造成更多脆弱性的腳本。- 命令行工作與否,錯誤更容易追踪、隔離和重現。根據 linux 風格,某些腳本/部分腳本(如包含在提供的 xml 替代解決方案中的那些)可能工作或不工作。如果可以通過以下命令在任何 linux 風格上重現與 kvm 的橋接……那麼似乎也可以使用 cli 命令來實現 kvm NAT - 只是為了澄清這篇文章的重點,NAT kvm 的 cli 步驟將是更標準化,所以更可取。

通常@NikitaKipriyanov 的答案是正確的道路,這是答案,但需要調整命令

$ sudo kvm -m 3G -hdb /dev/sde -net nic -net user,hostfwd=tcp::1810-:22

使用命令調整 vm 可以像預設一樣與網際網路通信,也可以通過 ssh 與主機通信。感謝@NikitaKipriyanov 和@cnst 的調整https://stackoverflow.com/a/54120040

使用者將需要使用 localhost 地址使用埠 1810 進行 ssh

$ ssh p@localhost -p 1810

NAT 的常見想法是您看不到已轉換的地址。你沒有通往他們的路線。它們不為你而存在。您只能看到被翻譯成的地址。

QEMU 案例沒有什麼不同。在這種情況下,您的主機在“外部”,您的虛擬機在“內部”,因此分配給它的地址永遠無法訪問虛擬機。您有 VM 的 10.0.2.2/24 地址,但是當它到達 Internet 時,它的數據包被QEMU 程序轉換為 192.168.1.172 ,因此主機認為這些數據包是由 QEMU 程序創建的,並將它們視為任何其他數據包,比如說,從本地執行的網路瀏覽器或類似的東西。

如何從主機訪問虛擬機?當我們有 NAT 時,為了到達隱藏在它後面的主機,我們安裝DNAT規則。同樣,QEMU 的情況也不例外,您必須在其中設置一些規則,然後您可以通過將數據包發送到主機的選定埠來從主機(如果需要,可以從其他主機)與 VM通信地址。

根據QEMU 文件,要將 DNAT 規則設置到其使用者模式 NAT 中,請使用該hostfwd子句。讓我們在其命令行中引入以下內容:

   -netdev user,id=usernet0,hostfwd=tcp::11111-:22 \
   -device virtio-net-pci,netdev=usernet0,mac=08:00:27:92:B0:51

然後,tcp 埠 11111 將被我機器上的程序佔用qemu-system-x86_64,如果你連接到localhost埠 11111,則會連接到 VM 的 22 埠。

一般形式是hostfwd=hostip:hostport-guestip:guestport,但如果省略hostip,它將是 localhost ,如果省略guestip,它將是訪客網路中的第一個“非網關”地址。

我注意到你被提到了virsh。你在跑步libvirt嗎?那麼問題是重複的;看評論。

引用自:https://serverfault.com/questions/1073264