KVM nat 命令行
在 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
嗎?那麼問題是重複的;看評論。