libvirt / KVM에서 게스트에게 포트 전달 state RELATED,ESTABLISHED ACCEPT

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를 사용하고 있습니다.



답변

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을 릴리스 할 때까지 기다릴 수 없습니다.


답변

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

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

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

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

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


답변

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

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

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

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


답변

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

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


답변

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


답변