對在另一個網路命名空間中執行的 KVM QEMU VM 執行 Ping 操作

對在另一個網路命名空間中執行的 KVM QEMU VM 執行 Ping 操作

我無法從在單獨的網路命名空間中執行的 KVM QEMU VM ping 到預設網路命名空間。

這是我的設定:

ip netns add test-ns

# Creating veth
ip link add if-in-ns type veth peer name if-notin-ns
# Default namespace
ip link addr add 10.21.0.10/24 dev if-notin-ns
ip link set dev if-notin-ns up
# Test-ns namespace
ip link set dev if-in-ns netns test-ns
ip netns exec test-ns ip addr add 10.21.0.20/24 dev if-in-ns
ip netns exec test-ns ip link set dev if-in-ns up

# Creating a tap device in the namespace
ip netns exec test-ns ip tuntap add tap0 mode tap
ip netns exec test-ns ip addr add 10.0.2.2/24 dev tap0
ip netns exec test-ns ip link set dev tap0 up

# Create route to 10.0.2.0/24 if default namespace:
ip route add 10.0.2.0/24 dev if-notin-ns

# Run VM
ip netns exec test-ns qemu-system-x86_64 -drive file=img.qcow2,format=qcow2,media=disk -accel kvm -cpu host -m 2G -netdev tap,id=vm0,ifname=tap0,script=no,downscript=no -device virtio-net-pci,netdev=vm0,mac=52:54:77:6a:cc:02

這些是結果:

# In default namespace:
ping 10.21.0.20 # Works
ping 10.0.2.2 # Works
ping 10.0.2.3 # Doesn't work

# In test-ns namespace:
ping 10.21.0.10 # Works
ping 10.0.2.3 # Works

# Inside the image:
ping 10.0.2.2 # Works
ping 10.21.0.20 # Works
ping 10.21.0.10 # Doesn't work

這樣虛擬機器就可以 ping devif-in-ns和開發if-in-ns可以 ping 通其對等方if-notin-ns。我認為這意味著虛擬機器應該能夠 ping devif-notin-ns也可以,但是不能。我有什麼誤解嗎?

編輯:對 Salim Aljayousi 答案的評論:

命名空間 test-ns 已經有一條透過 dev 到達預設命名空間的路由if-in-ns

ip netns exec test-ns ip route
10.0.2.0/24 dev tap0 proto kernel scope link src 10.0.2.2 
10.21.0.0/24 dev if-in-ns proto kernel scope link src 10.21.0.20

如果我刪除該一項並添加您建議的一項:

ip netns exec ns ip route del 10.21.0.0/24 dev if-in-ns
ip netns exec ns ip route add 10.21.0.0/24 dev tap0

然後在虛擬機器中我得到:

ping 10.21.0.10
From 10.0.2.2 icmp_seq=1 Redirect Host(New nexthop: 10.21.0.10) ```

答案1

您可以在 test-ns 命名空間中新增一條路由,以透過 tap 介面到達預設命名空間

ip netns exec test-ns ip route add 10.21.0.0/24 dev tap0

這應該允許虛擬機器對預設命名空間中的裝置執行 ping 操作。

請注意,您可能還需要在主機系統上啟用 IP 轉發,以允許封包在命名空間之間轉送。

sysctl -w net.ipv4.ip_forward=1

相關內容