libvirt / KVM에서 게스트에게 포트 전달


33

NAT를 사용할 때 libvirt / KVM을 실행하는 서버의 포트를 VM의 지정된 포트로 어떻게 전달할 수 있습니까?

예를 들어 호스트의 공용 IP는 1.2.3.4입니다. 포트 80을 10.0.0.1로, 포트 22를 10.0.0.2로 전달하고 싶습니다.

iptables 규칙을 추가해야한다고 가정하지만 적절한 위치와 정확히 무엇을 지정 해야하는지 잘 모르겠습니다.

iptables의 출력 -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere            udp dpt:domain 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:domain 
ACCEPT     udp  --  anywhere             anywhere            udp dpt:bootps 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:bootps 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.0.0.0/24         state RELATED,ESTABLISHED 
ACCEPT     all  --  10.0.0.0/24          anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

ifconfig의 출력

eth0      Link encap:Ethernet  HWaddr 00:1b:fc:46:73:b9  
          inet addr:192.168.1.14  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:fcff:fe46:73b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:201 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:31161 (31.1 KB)  TX bytes:12090 (12.0 KB)
          Interrupt:17 

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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

virbr1    Link encap:Ethernet  HWaddr ca:70:d1:77:b2:48  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::c870:d1ff:fe77:b248/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:468 (468.0 B)

우분투 10.04를 사용하고 있습니다.


1
왜 ifconfig를 사용합니까? ip는 ifconfig의 후속 버전입니다. ;)
Manuel Faux

5
질문 233760은 libvirt 버전에서는이 문제를 해결합니다. serverfault.com/questions/233760
akaihola

답변:


36

libbunt for Ubuntu의 최신 안정 릴리스는 0.7.5 버전으로, 자동 네트워크 구성을보다 쉽게하는 몇 가지 새로운 기능 (예 : 스크립트 후크 및 네트워크 필터)이 없습니다. Ubuntu 10.04 Lucid Lynx에서 libvirt 0.7.5에 포트 포워딩을 활성화하는 방법은 다음과 같습니다.

이 iptables 규칙은 트릭을 수행해야합니다.

iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

기본 KVM NAT 설정은 위에서 설명한 3 번째와 유사한 규칙을 제공하지만 들어오는 연결을 수락하는 데 필수적인 NEW 상태는 생략합니다.

이러한 규칙을 추가하기 위해 시작 스크립트를 작성하고주의하지 않으면 libvirt 0.7.5는 자체 규칙을 삽입하여 규칙을 무시합니다. 따라서 이러한 규칙이 시작시 올바르게 적용되도록하려면 규칙을 삽입 하기 전에 libvirt가 초기화되었는지 확인해야합니다 .

행 앞에 /etc/rc.local에 다음 행을 추가하십시오 exit 0.

(
# Make sure the libvirt has started and has initialized its network.
while [ `ps -e | grep -c libvirtd` -lt 1 ]; do
        sleep 1
done
sleep 10
# Set up custom iptables rules.
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 22 -j DNAT --to-destination 10.0.0.2:22
iptables -I FORWARD -m state -d 10.0.0.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
) &

sleep 10위 의 내용은 libvirt 데몬이 우리 자신의 iptables 규칙을 초기화하기 전에 자신의 iptables 규칙을 초기화 할 수있는 기회를 제공합니다. 그들이 Ubuntu를 위해 libvirt 버전 0.8.3을 릴리스 할 때까지 기다릴 수 없습니다.


3
현재 libvirt로 어떻게이 작업을 수행 할 수 있는지 설명 할 수 있습니까?
Manuel Faux

1
libvirt가 네트워킹을 초기화 한 후 후크 스크립트 중 하나가 실행되면 해킹 된 while 루프 및 절전 명령이 필요하지 않습니다. 네트워크 초기화 이전 또는 이후에 / etc / libvirt / hooks / daemon 스크립트가 실행되는지 확실하지 않지만 / etc / libvirt / hooks / qemu를 사용하면 적절한 가상 머신이 시작될 때 규칙을 작성하고 파기 할 수 있습니다. 중지. 네트워크 필터를 어떻게 사용할 것인지 잘 모르겠지만 libvirt.org/firewall.html의 일부 예제 는 iptables 규칙 작성을 자동화하도록 수정할 수있는 냄새가납니다.
Isaac Sutherland

우수함, 그러나 나는 내가 ... 내가 서버를 다시 시작하면 무슨 일 시도하지 않은, 작동 확인할 수 있습니다
아론 로린

18

게스트가 사용자 모드 네트워킹을 사용할 때 즉시 포트 리디렉션을 설정하는 방법 이 있습니다.

http://blog.adamspiers.org/2012/01/23/port-redirection-from-kvm-host-to-guest/

자세한 내용을 볼 수 있지만 편의상 여기에 내가 찾은 해결책이 있습니다.

virsh qemu-monitor-command --hmp sles11 'hostfwd_add ::2222-:22'

이 하나의 라이너는 다른 답변보다 훨씬 쉽지만 일부 시나리오 (사용자 모드 네트워크 스택)에서만 작동합니다.


3
귀하의 솔루션은 매우 흥미 롭습니다. 귀하의 블로그에 유지 보수를 위해 중단 된 경우에도 여전히 유용한 정보를 귀하의 답변에 포함시킬 수 있습니까? :)
voretaq7

완료, 내 SF 평판이 1 이상
Adam

이 방법을 사용하려면 사용자 모드에서 네트워크를 사용해야합니다. linux-kvm.org/page/Networking#User_Networking을 참조하십시오 . 다른 참고 문헌 : topic.alibabacloud.com/a/… , snippets.webaware.com.au/howto/… ]
Eduardo Lucio

5

이를위한보다 "공식적인"[1] 방법은 libvirt 웹 사이트에 설명 된대로 후크 스크립트를 작성하는 것입니다.

http://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

... 기본적으로이 스크립트는 KVM 게스트가 부팅 될 때 호출됩니다. 스크립트 자체는 'NEW'연결 상태가 올바르게 추가 된 적절한 iptable 규칙 (위의 Isaac Sutherland의 답변과 유사)을 추가합니다. 호스트 및 포트에 올바른 값으로 스크립트를 수정해야합니다.

[1] libvirt 문서 자체는 이것이 일종의 해킹이라고 말하지만 그림으로 이동하십시오.


0

"기본 네트워크"(virbr0)와 함께 KVM (libvirt)을 사용하여 포트 포워드를 수행 할 수있는 유일한 방법은 @Antony Nguyen이 알려주는 핵 / 해결책을 사용하는 것입니다. 또는 더 간단하게 libvirt-hook-qemu를 사용할 수 있습니다 .

이 스레드에는 libvirt-hook-qemu : https://superuser.com/a/1475915/195840을 사용하여 CentOS 7 (및 다른 배포판)에서이 문제를 해결하는 방법에 대한 완전한 설명이 있습니다 .


-1
iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
 iptables -t nat -I PREROUTING -d 1.2.3.4 -p tcp --dport 22 -j DNAT --to-destination 10.0.0.1

1
감사합니다. 그러나 KVM을 사용하면 특히 새로운 상태 플래그도 필요했습니다
steveh7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.