QEMU-브리지

QEMU-브리지

QEMU(및 KVM)를 사용하여 Debian 9에 가상 머신을 설정하고 있습니다. 현재 etc 를 사용하여 설정한 브리지 네트워크를 통해 작동시키려고 합니다. ip link결과 ip tuntap는 다음과 같습니다 brctl show.

bridge name     bridge id               STP enabled     interfaces
br0             8000.107b444f55d6       no              enp4s0
                                                        tap0
docker0         8000.0242d4c18983       no

출력은 다음과 같습니다 ip a.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:d4:c1:89:83 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether f6:54:bb:db:d7:c6 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::f454:bbff:fedb:d7c6/64 scope link
       valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.26/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::127b:44ff:fe4f:55d6/64 scope link
       valid_lft forever preferred_lft forever

인터페이스는 docker0그것과 아무 관련이 없습니다.

내가 아는 한 이것이 작동해야합니다. 그러나 QEMU의 Windows 8.1 클라이언트는 인터넷에 액세스할 수 없으며 DHCP를 통해 IP를 얻을 수 없습니다(자동 생성된 169.xx.xx.xx IP만 얻습니다).

왜 그런지 잘 모르겠습니다. 내 QEMU 매개변수는 다음과 같습니다.

-net nic -net tap,ifname=tap0

나는 또한 다음을 시도했습니다.

-device e1000,netdev=net0,mac=52:55:00:d1:55:01 -netdev tap,id=net0

둘 다 네트워크에 액세스할 수 없다는 동일한 결과를 생성합니다. 나는 이것을 알아낼 수 없다.

내가 멍청한 짓을 하고 있는 걸까?

답변1

QEMU Linux 게스트에서 매우 유사한 문제가 발생했는데 iptables가 트래픽을 차단하고 있는 것으로 나타났습니다. 게스트에 대해 고정 IP 주소를 설정하면 호스트와 게스트가 서로 핑할 수 있지만 그게 전부입니다. 게스트 컴퓨터에서는 인터넷과 나머지 네트워크에 액세스할 수 없습니다.

문제를 조사하려면 Wireshark 또는 tcpdump와 같은 도구를 사용하는 것이 좋습니다.

Wireshark를 사용하여 호스트 컴퓨터에서 브리지 인터페이스를 캡처했는데 요청이 가상 컴퓨터에서 오는 것처럼 보이지만 응답이 수신되지 않습니다.

여기에 이미지 설명을 입력하세요.

핵심요약: 이 단서는 다음 답변의 Magic iptable 명령으로 이어졌습니다(저는 iptables에 대한 경험이 많지 않기 때문에 저에게는 마법입니다 :)):

https://serverfault.com/a/165786

작동하고, 지금은 완전히 이해하지 못하더라도 여기에 2센트를 남겨두겠다고 생각했습니다.

행운을 빌어요!

답변2

저도 현재 이 문제로 고민 중입니다. 나는 당신보다 해결책에 더 가깝습니다.

저는 Debian 10을 사용하고 있으며 커널의 일부이고 모든 Linux에서 사용할 수 있는 패키지 iproute2( ip link, ip addr, ...) 를 사용하기로 결정했습니다 . bridge link그리고 패키지 qemu-kvm. 그게 당신이 필요한 전부입니다.




1 단계

열려 있는터미널 1그리고 진행 상황을 확인할 수 있도록 기록해 보세요.

while true; do ip addr; sleep 1; clear; done



2 단계

열려 있는터미널 2진행 상황을 보면서 다음 명령을 실행하십시오.터미널 1:

sudo ip link add virtual_bridge type bridge
sudo ip link set virtual_bridge up

당신은 다리를 가지고 있습니다 up.




계속하기 전에 실험해 보세요.

귀하 virtual_bridge는 현재 이지만 up이더넷 카드는 up또는 일 수 있습니다 down. 이제 제가 시행착오를 통해 알아낸 두 가지 시나리오를 읽어보세요. 이건 매우 중요합니다(!)이를 통해 이더넷 카드가 어떻게 반응하는지 알 수 있습니다. 시도해 볼 수도 있고 안 해 볼 수도 있지만, 시청하면서 아래 설명을 정확히 따르는 것이 좋습니다.터미널 1변화시키다.

장면 1:

이더넷 카드가 있는 경우 down다음 명령을 사용하여 해당 카드를 마스터 장치에 할당해 보십시오. 작동합니다:

sudo ip link set enx24f5a2f17b27 master virtual_bridge

이제 열어보세요.

sudo ip link set enx24f5a2f17b27 up

카드로 인터넷에 연결할 수 없다는 사실을 알면 놀랄 것입니다. 다시 시작해도 성공하지 못합니다.

sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up

브리지를 다시 시작하더라도 브리지를 제어해야 하는 카드 소유자는 다음을 수행하지 않습니다.

sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

인터넷에 연결하는 유일한 방법은 카드를 재부팅하고, 메인 카드를 제거하고, 새로 고쳐서 모든 IP를 제거하는 것이었습니다.(어쩌면 필요하지 않을 수도 있습니다), 알려진 작동 IP를 수동으로 할당한 다음 마스터를 할당합니다.

sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up
sudo ip addr flush enx24f5a2f17b27
sudo ip addr add 192.168.64.100/24 dev enx24f5a2f17b27
sudo ip link set enx24f5a2f17b27 master virtual_bridge

이 시점에서 인터넷이 작동하기 시작해야 합니다.

시나리오 B:

이더넷 카드에 upIP가 있고 인터넷이 제대로 작동하는 경우입니다. 이제 아래 명령을 사용하여 호스트를 할당해 보십시오. 작동합니다!

sudo ip link set enx24f5a2f17b27 master virtual_bridge

이제 브리지를 여러 번 재설정하고 카드에 어떤 일이 일어나는지 확인하세요.

sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

브리지 이더넷 카드를 활성화할 때마다 카드도 활성화되어 IP를 얻고 인터넷에 연결되는 것을 볼 수 있습니다. 하지만 카드를 닫으면 다음과 같은 상황이 발생합니다.

sudo ip link set enx24f5a2f17b27 down

브리지를 몇 번이나 재설정해도 인터넷에 다시 연결할 수 없습니다.

그래서 가장 중요한 건 바로 너야첫 번째이더넷 카드를 켜고두번째다른 방법이 아닌 기본으로 지정하십시오! 즉, 마스터를 할당할 때 카드가 활성화되어야 합니다.




3단계

위의 예에서 알 수 있듯이 먼저(!)이더넷 카드를 켜면 IP를 얻게 됩니다:

sudo ip link set enx24f5a2f17b27 up

그런 다음 여기에 마스터를 할당합니다.

sudo ip link set enx24f5a2f17b27 master virtual_bridge

가상 머신용 가상 이더넷 카드처럼 작동하는 TAP 장치를 만듭니다. 그것은 중요하다(!)그렇지 않으면 적절한 권한이 없을 수 있으므로 a user및 a 를 할당합니다 .group

sudo ip tuntap add virtual_tap mode tap user ziga group ziga

이제 이를 만들었으므로 활성화하려고 시도할 수 있지만 가상 머신만이 이 작업을 수행할 수 있으므로 성공하지 못할 것입니다.

sudo ip link set virtual_tap up

down그래서 그 상태 로 유지됩니다 . 여기에도 master를 적용하면 됩니다.

sudo ip link set virtual_tap master virtual_bridge

이것으로 네트워크 설정이 완료됩니다. 현재 귀하의 TAP 장치에는 IP가 없습니다. 가상 머신을 시작하고 가상 머신이 자체적으로 설정될 때까지 기다릴 때 할당됩니다.




4단계

이제 가상 머신을 올바르게 시작할 차례입니다. 나는 최신 명령으로 수행합니다 -nic. 명령이 더 짧고 강력합니다.(!)이전 명령보다 (읽다). 어쨌든...저는 다음 명령을 사용합니다:

qemu-system-x86_64 -enable-kvm -cpu host -smp cores=3,threads=1 -m 4096 -nic tap,ifname=virtual_tap,script=no,downscript=no -boot order=c -cdrom ~/Dropbox/workspace/racunalnistvo/programi/kvm/iso/centos-8.1.1911-x86_64-dvd1.iso -drive file=~/Dropbox/workspace/racunalnistvo/programi/kvm/vm/windows.qcow2,format=qcow2

script=no 옵션을 생략 하면 downscript=no위 명령은 무해한 경고를 반환합니다.

RTNETLINK answers: Operation not permitted
W: /etc/qemu-ifup: no bridge for guest interface found

이는 에뮬레이션 전에 Qemu가 스크립트를 사용하여 자체 브리지와 TAP를 자동으로 설정하려고 시도하기 때문에 발생합니다 /etc/qemu-ifup. 스크립트가 완료된 후 브리지 및 TAP 제거도 시도합니다 /etc/qemu-ifdown. 이 스크립트를 보면 내가 설치하지 않은 패키지의 일부인 명령을 사용하고 스크립트가 실패한다는 brctl것을 알 수 있습니다!bridge-utils

어쨌든 우리는 브리지와 TAP 장치를 수동으로 생성했기 때문에 이러한 스크립트가 필요하지 않으며 Qemu가 script=no이를 사용하고 호출하는 것을 방지합니다 downscript=no.

iproute2 대신 사용하기 위해 이러한 스크립트를 다시 작성하는 것은 재미있지만 이를 실행하려면 권한이 bridge-utils필요하며 root전문가들은 가상 머신을 root.

가상 머신이 시작되고 인터넷에 연결되지만 호스트를 핑할 수 없습니다! 또한 호스트는 인터넷에 연결하고 동일한 게이트웨이를 ping할 수 있습니다. 하지만 가상 머신을 핑할 수는 없습니다!

또한 참고터미널 1여기에서 이제 TAP 장치가 활성화되고 IP가 부여된 것을 볼 수 있습니다. 그러나 이 IP는 가상 머신 내부에 표시되는 IP와 다릅니다! 누구든지 이것을 설명할 수 있나요?




이것이 제가 알아낸 것입니다. 누군가에게 도움이 되기를 바랍니다. TAP 장치에는 TCP, UDP 및 ICMP가 활성화되어 있어야 하는데 왜 호스트와 VM이 서로 핑할 수 없는지 아직도 모르겠습니다... 어떻게든 브리지에 IP를 할당해야 하기 때문인 것 같습니다(읽다,읽다) 하지만 올바른 것을 선택하는 방법을 모르겠습니다. 누구든지 의견을 제시할 수 있나요?

관련 정보