게스트와 호스트는 linux-kvm과 macvtap을 사용하여 서로를 볼 수 없습니다


9

kvm 가상 머신을 이전 호스트 (하드웨어 및 OS 모두)에서 새 호스트로 마이그레이션하고 있습니다.

네트워킹을 위해 virt-manager는 새로운 옵션 인 macvtap을 제안했습니다 . 이것은 eth0에 브릿지를 설정하는 좋은 대안으로 보였습니다.

이제 게스트가 정상적으로 부팅되고 로컬 네트워크 DHCP 서버에서 IP를 가져와 인터넷에 연결할 수 있습니다. 손님은 또한 로컬 네트워크의 다른 컴퓨터를 보았습니다. 나는 그들을 ssh 할 수 있습니다.

문제는 호스트와 게스트가 서로를 볼 수 없다는 것입니다. 게스트 IP를 사용하여 호스트에서 게스트에 연결할 수 없으며 호스트 IP를 사용하여 게스트에서 호스트에 연결할 수 없습니다. 핑, SSH, http, 아무것도 없습니다.

route -n호스트 의 명령은 다음과 같습니다 .

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(게스트에서 동일한 출력).

아마도 호스트와 게스트 간의 통신 전용의 새로운 tun / tap 인터페이스를 설정할 수는 있지만 약간 과도하게 보입니다. 호스트와 게스트가 통신 할 수있는 방법이 있습니까?


Macvtap은 유효한 브리징 대체품이 아닙니다. 브리징 대신 전환하려면 openvswitch를 살펴보십시오.
user186658

답변:


7

나는 IRC에 대해이 질문을했는데 그것은 macvtap으로 보입니다.

게스트 트래픽을 네트워크 스택에 너무 낮게 주입합니다.

솔루션은 게스트와 호스트가 통신 할 수있는 네트워크 인터페이스를 추가하거나 기존의 브리지 솔루션을 유지하는 것입니다.


1
다음은 네트워크 관리자를 비활성화하지 않고 호스트 / 게스트 인터페이스를 만드는 방법에 대한 단계별 지침입니다. wiki.libvirt.org/page/…
HDave

1
나는 그 지시를 작동시킬 수 없었다 ...
HDave

4

virt-manager는 macvtap을 설정할 때 호스트와 게스트의 네트워크 통신에 작동하지 않는다고 명시 적으로 말합니다. 나는 단순히 두 번째 nat 기반 인터페이스를 추가하고 게스트에서 설정 한 다음이를 사용하여 호스트와 통신합니다.


1

해결책은 하이퍼 바이저에서 실제 하드웨어 인터페이스와 동일한 IP 주소 (매우 중요)로 macvlan 인터페이스를 구성하고이를 사용하도록 호스트에서 라우팅을 구성하는 것입니다. Qemu / KVM에서 평소와 같이 하드웨어 인터페이스에서 macvtap 인터페이스를 사용하십시오.

내 구성 (192.168.1.0/24 네트워크, p10p1 하드웨어 인터페이스 및 192.168.1.1 게이트웨이)의 경우 (하이퍼 바이저에서) 다음을 제공합니다.

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static

1

이전 답변에서 언급했듯이이 문제에 대한 해결책은 호스트에 macvlan 네트워크 어댑터를 추가하는 것입니다. 그러나 특히 IPv6 지원을 원했고 접두사가 변경되면 경로를 수동으로 설정하면 문제가 될 수 있기 때문에 macvlan 어댑터에 경로를 수동으로 다시 연결하는 것이 다소 해킹이라고 생각했습니다. 다음은 커널이 라우팅 테이블을 제어하도록하는 구성입니다.

(여기서 특정 구성은 데비안 및 Upstart에만 해당되지만 기본 단계는 모든 GNU / Linux에서 작동해야합니다.)

부팅시 macvlan 어댑터 작성

먼저 어댑터의 MAC 주소를 선택해야합니다. 임의의 어댑터를 사용할 수도 있지만 수동으로 macvlan 어댑터를 생성하고 MAC을 사용하는 것이 좋습니다. 이런 식으로 MAC은있을 수있는 모든 규칙을 준수합니다.

고정 MAC을 설정하는 것이 좋습니다. 그렇지 않으면 재부팅 후 DHCP 서버가 시스템을 인식하여 이전과 동일한 IP 주소를 할당 할 수있는 방법이 없기 때문입니다.

따라서 어댑터를 작성하고 MAC을 찾으십시오.

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

강조 표시된 16 진수는 MAC 주소입니다.

이제 시작 시마다 macvlan 어댑터를 작성 하기 위해 init 스크립트를 작성 하십시오 (네트워킹을 초기화 하기 전에 실행해야 함) . 이를 수행하는 명령은 다음과 같습니다.

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

이 목적을위한 Upstart init 스크립트의 예는 다음과 같습니다.

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

이것을 예를 들어에 넣으십시오 /etc/init/macvlan.conf.

네트워크 구성 설정

에서 /etc/network/interfaces실제 네트워크 어댑터를 수동으로 설정하고 (자동으로 유지) 이전 구성 (일반적으로 DHCP 또는 고정 IP 주소)을 macvlan 어댑터로 이동하십시오. 예 :

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

물리적 어댑터에 대한 IPv6 비활성화

마지막으로, 실제 어댑터가 IP 주소를 얻지 못하게 합니다. IPv4의 경우 어댑터를 수동으로 설정하면 주소를 얻지 못하게됩니다. 그러나 커널이 어댑터의 IPv6 주소를 얻거나 할당하는 것을 막는 구성을 찾지 못했습니다. 그렇게하면 경로도 추가되어 문제가 발생할 수 있습니다. 따라서 가장 좋은 방법은 물리적 어댑터에 대해 IPv6을 비활성화하는 것 같습니다. 당신은 라인을 추가 하여이 작업을 수행 할 수 있습니다

net.ipv6.conf.eth0.disable_ipv6=1

/etc/sysctl.conf,에서 파일을 생성하여 /etc/sysctl.d/이 줄, 또는 추가하여

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

init 스크립트에.

이제 컴퓨터를 재부팅하면 호스트에서 게스트로 통신하는 것이 IPv4 및 IPv6에서 모두 작동합니다.


설정하는 동안 실수를하면 재부팅 후에도 네트워크를 통해 호스트에 연결하지 못할 수 있습니다. 기계에 물리적으로 액세스 할 수 있거나 다른 안전 장치가 마련되어 잠재적 인 문제를 해결할 수있는 경우에만이 작업을 수행하십시오.


1

다음과 같이 끝내고 싶습니다.

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

마지막 열에는 "eth0"대신 "macvlan0"이 포함되어 있습니다.

이를 달성하기 위해 192.168.0.42를 IP 주소로 가정하여 다음 명령을 사용할 수 있습니다.

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

대부분 npen 솔루션과 유사합니다. 보다 정교한 스크립트를 원하면 이 주제에 대한 내 웹 페이지 를 참조하십시오 .


macvlan모듈 을로드하는 것을 잊지 마십시오 :modprobe macvlan
mdd

0

Lazzaro가 데비안에 기록한 것을 사용했지만 몇 가지 메모를 추가하고 싶습니다.

우선, 게스트 인터페이스는 "소스 장치"-> "호스트 장치 eth0 : macvtap"; "소스 모드"-> " 브리지 ".

둘째, 당신이 나를 위해 작동하지 않은 init 스크립트 ( 시작하는 동안 macvlan0 인터페이스가 너무 늦게 생성 된 것 같습니다 ), 그래서 나는 이것을 사용했습니다 :

nano /etc/init.d/macvlan

인터페이스를 처음 만들 때 할당 된 Mac으로 변경하십시오.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

실행 비트를 저장하고 설정하십시오.

chmod +x /etc/init.d/macvlan

init에 대한 모든 링크를 추가하십시오.

update-rc.d macvlan defaults
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.