Ubuntu에서 KVM을 사용하여 libvirt 0.8.3을 사용하여 호스트에서 게스트로 포트 전달


14

호스트에는 사용 가능한 단일 외부 IP가 있으므로 KVM 게스트를 NAT로 설정했습니다.

외부에서 손님에게 일부 요청을 전달하기 위해 포트 전달을 어떻게 설정합니까?

이것에 대한 문서를 찾을 수 없습니다. 가장 가까운 대답은 아마도이 대답 일 수도 있지만 libvirt 0.8.3 에서이 작업을 수행하는 더 쉬운 방법이 있다고 언급되었습니다. 누구든지 이것을하는 최신 방법을 알고 있습니까?


외부-인터넷 IP를 의미합니까? 아니면 LAN (VM 외부)입니까? 브리지 된 네트워킹을 설정하기 위해 이러한 외부 주소를 VM에 할당 할 수 있습니까?
Art Shayderov

인터넷 IP 주소는 하나만 얻을 수 있으므로 브리지 된 네트워킹 모드를 사용하지 않은 것입니다.
wei

답변:


12

다음은 후크 스크립트 ( source )를 사용하여 포트 전달을 설정하는 더 좋은 방법 입니다.

에서 /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

libvirt 설정에 맞게 상단에 4 개의 변수를 설정해야합니다.

우분투에서 libvirt-bin을 다시 시작해야합니다.

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

그런 다음 게스트를 다시 시작해야합니다. 우분투에서는 /etc/apparmor.d/usr.sbin.libvirtd후크 스크립트가 실행될 수 있도록 조정해야합니다 .

옆에

/usr/sbin/* PUx,

덧붙이다

/etc/libvirt/hooks/* PUx,

그런 다음 의류를 다시로드하십시오.

sudo service apparmor reload

$GUEST_IPADDRvirsh / dumpxml / iface-dumpxml을 사용하여 자동 구성하는 방법이 있지만 찾지 못했습니다. 또는 네트워크 xml : documentation 에서 IP를 정적으로 설정할 수 있습니다 .

내가 알 수있는 한, 네트워크 필터는 가상 네트워크에서 발생하는 것을 제한하는 데만 사용할 수 있으며 포트 전달에는 유용하지 않습니다.


1
Trusty는 /etc/libvirt/hooks/** rmix,기본적으로 apparmor config 파일에 줄 이 있으며 동일한 효과가있는 것 같습니다. 의류 구성을 수정하지 않고 스크립트를 실행할 수 있습니다.
Amir Ali Akbari

2

나는 비슷한 상황에 처해있다. virbr0 인터페이스를 통해 호스트에 연결된 개인 NAT 네트워크의 KVM에서 Windows Server를 실행하고 있습니다. 원격 데스크톱을 통해 VM에 액세스하고 싶습니다. 따라서 트래픽을 포트 3389 (RDP)로 VM 포트 3389로 전달해야합니다. 일부 iptable 규칙으로이를 달성했습니다.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT-대상 VM-IP : 3389

/ sbin / iptables -I FORWARD -m state -d VM-NET / 24 --state NEW, RELATED, ESTABLISHED -j ACCEPT

물론 HOST-IP, VM-IP 및 VM-NET을 채택해야합니다. 그러나 iptables와 libvirt를 엉망으로 만드는 것은 까다 롭습니다. 현재 iptable 규칙을 엉망으로 인해 손실 된 VM에서 인터넷에 액세스 할 수있는 솔루션을 찾고 있습니다.


나는 그것이 몇 살이라는 것을 알고 있지만이 대답은 저에게 효과적이었습니다. 감사!
mttdbrd

1

나는 당신이 언급 한 답변에 여전히 적절한 iptables 규칙이 있다고 생각합니다. 그러나 이제 가상 머신이 시작 및 중지 될 때 스크립트 후크 를 사용하여 규칙을 작성하고 삭제할 수 있습니다 . Isaac이 이전 답변에서 말했듯이 현재 libvirt 에는 네트워크 필터 가 있지만 NAT 게스트를 위해 포트를 여는 데 어떻게 사용할 수 있는지 확실하지 않습니다.


0

게스트 네트워킹은 어떻게 설정됩니까? 브리지 된 경우 포트를 게스트의 IP로 전달하기 만하면됩니다. 게스트가 아직 다른 NAT 뒤에 있으면 하나의 libvirt가 설정되고 복잡해집니다.

어쨌든 여기서는 물리적 머신처럼 VM을 간단하게 취급합니다.


나는 그것을 명확하게 말하지 않았다고 생각합니다. 호스트가 NAT에 없으며 외부 IP 주소가 있습니다. 불행하게도, 게스트 네트워킹은 libvirt에 의해 설정된 NAT 뒤에 있습니다.
웨이

아, 그러면 또 다른 문제입니다. 기본적으로 libvirt는 자체 NAT 솔루션을 관리하며이를 편집 할 수 있습니다.
dyasny

그래, 내가 들었던 것은 편집 할 수있다. 그러나 나는 그것에 대해 어떤 참조도 찾을 수 없으며 nwfilter xml 구성 파일은 기괴한 것처럼 보입니다 .libvirt 웹 사이트의 문서도 도움이되지 않습니다.
wei

브리지 네트워킹을 사용하는 경우 기본 libvirt NAT를 포기하고 원하는 것을 설정할 수 있습니다. dyasny가 말했듯이 VM을 실제 머신처럼 취급하십시오. KVM 호스트가 있고 외부 IP와의 인터페이스가 게이트웨이로 구성된 VM에 할당되어 있습니다. 그게 맞다면 구성을 게시 할 수 있습니다 (우분투 스타일).
Art Shayderov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.