ゲストおよびホストネットワーク用のqemu-kvm natの設定

ゲストおよびホストネットワーク用のqemu-kvm natの設定

Ubuntu 18.04ホストで複製されたHDでUbuntu 10.04ゲストVMを設定しました。仮想マシンが正常に起動し、ホストからSSHに接続できますが、ホスト外では通信できません。

私の質問は、次の設定にどのような問題があるかです。

ゲストVM:

次から始まったqemu-system-x86_64 G.qcow2 -m 4096 -smp 4 -no-acpi -enable-kvm -name system76 -vga std -device virtio-net,netdev=net0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no,br=br0vm

GUI/Network Manager を使用した手動ネットワーク構成。固定IP 192.168.118.18、マスク255.255.255.0、gw 192.168.118.1、dns 192.168.118.1

何らかのifconfig構成されていないインターフェイスが報告されます。私はqemu上記で定義した行だと思いましたが、net0下で私たちはeth1それを見ることができますvirbr0

# ifconfig
eth1      Link encap:Ethernet  HWaddr 52:54:00:12:34:56  
          inet addr:192.168.118.18  Bcast:192.168.118.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1203 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1606 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:114773 (114.7 KB)  TX bytes:290952 (290.9 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:313 errors:0 dropped:0 overruns:0 frame:0
          TX packets:313 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:45604 (45.6 KB)  TX bytes:45604 (45.6 KB)

virbr0    Link encap:Ethernet  HWaddr 1e:8f:5c:98:b1:25  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          inet6 addr: fe80::1c8f:5cff:fe98:b125/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:84 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:13004 (13.0 KB)

ホスト構成:

apt install uml-utilities
apt install bridge-utils
vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1
sysctl -p
ip link add name br0vm type bridge
ip addr add 192.168.118.1/24 dev br0vm
ip link set br0vm up

tunctl -t tap0 -u asoundmove
ip link set tap0 up

brctl addif br0vm tap0

mkdir /etc/qemu
vi /etc/qemu/bridge.conf
    allow br0vm

# test access to the guest - it works
ssh [email protected]

iptables -t nat -A POSTROUTING -o br0vm -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o eno1 -i br0vm -j ACCEPT

試してみてください:

ゲストからホストにpingを送信できます。

ping 192.168.118.1
PING 192.168.118.1 (192.168.118.1) 56(84) bytes of data.
64 bytes from 192.168.118.1: icmp_seq=1 ttl=64 time=0.152 ms
64 bytes from 192.168.118.1: icmp_seq=2 ttl=64 time=0.145 ms

ゲストはホストが接続されているスイッチ/ルーターをpingできません。次のpingは何も返しません。

ping 192.168.117.1

2つのping要求(117.1と118.1)は、tcpdumpゲストeth1とホストへの要求の下に表示されますbr0vmtcpdumpping 192.168.117.1

tcpdump -i br0vm not port ssh
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br0vm, link-type EN10MB (Ethernet), capture size 262144 bytes
11:57:34.211291 IP 192.168.118.18 > routerlogin.net: ICMP echo request, id 55320, seq 1, length 64
11:57:35.216163 IP 192.168.118.18 > routerlogin.net: ICMP echo request, id 55320, seq 2, length 64
11:57:36.215940 IP 192.168.118.18 > routerlogin.net: ICMP echo request, id 55320, seq 3, length 64
11:57:37.215919 IP 192.168.118.18 > routerlogin.net: ICMP echo request, id 55320, seq 4, length 64
11:57:39.205837 ARP, Request who-has host.hostname tell 192.168.118.18, length 28
11:57:39.205859 ARP, Reply host.hostname is-at 4e:31:b7:14:1b:a9 (oui Unknown), length 28

watch -d -n 1 iptables -nvL
Chain INPUT (policy ACCEPT 2604K packets, 21G bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
   50  4200 ACCEPT     all  --  br0vm eno1    0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 1974K packets, 43G bytes)
 pkts bytes target     prot opt in     out     source               destination

カウンタは50 4200ping要求があるたびに増加します。

watch -d -n 1 iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 4283 packets, 510K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 4175 packets, 503K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 9155 packets, 663K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 9227 packets, 666K bytes)
 pkts bytes target     prot opt in     out     source               destination
   25  3789 MASQUERADE  all  --  *      br0vm  0.0.0.0/0            0.0.0.0/0

ただし、25 3789pingを要求するたびにカウンタは増加しません。

ホストでは、次のように動作します。

ping 192.168.117.1
PING 192.168.117.1 (192.168.117.1) 56(84) bytes of data.
64 bytes from 192.168.117.1: icmp_seq=1 ttl=64 time=0.609 ms
64 bytes from 192.168.117.1: icmp_seq=2 ttl=64 time=0.585 ms

118サブネットのIPトラフィックが117サブネットに転送されないように何が間違っていますか?

編集する:

追加情報:

ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
eno1             UP             30:9c:23:9b:eb:df <BROADCAST,MULTICAST,UP,LOWER_UP> 
br0vm            UP             4e:31:b7:14:1b:a9 <BROADCAST,MULTICAST,UP,LOWER_UP> 
tap0             UP             4e:31:b7:14:1b:a9 <BROADCAST,MULTICAST,UP,LOWER_UP> 

ip -br address
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eno1             UP             192.168.117.110/24 fe80::8fae:b4f2:8b90:7601/64 
br0vm            UP             192.168.118.1/24 fe80::a46d:86ff:fe2a:ddbf/64 
tap0             UP             fe80::4c31:b7ff:fe14:1ba9/64 

ip route
default via 192.168.117.1 dev eno1 proto static metric 100 
169.254.0.0/16 dev eno1 scope link metric 1000 
192.168.117.0/24 dev eno1 proto kernel scope link src 192.168.117.110 metric 100 
192.168.118.0/24 dev br0vm proto kernel scope link src 192.168.118.1

答え1

MASQUERADE ルールは POSTROUTING で発生します。ルーティング決定が行われ、宛先インターフェイスが選択された後です。外部世界と通信するために、ホストは192.168.117.1を使用します。1番。したがって、MASQUERADEルール標準は出力インターフェースを使用するときでなければなりません。1番代わりにbr0vm

したがって、以下を使用する必要があります。

iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE

しかし、これは望ましくない影響(他のホストのIPをプライマリIPに偽装するなど)をもたらす可能性があり、ブリッジには完全に関連しない理由で後で発生する可能性がある副作用があるため(すでに説明されています)ここそしてそこ)IMHOこれは、特定の変更を適用するときに使用できる最も簡単なルールです。

iptables -t nat -A POSTROUTING -s 192.168.118.0/24 ! -d 192.168.118.0/24 -j MASQUERADE

関連情報