티스토리 뷰

os/Linux

KVM with NAT network

jacobbaek Jacob_baek 2021. 1. 27. 12:47

외부에서 특정 Host 상에 동작되는 VM에 접근하고자할때 다음과 같은 iptables 설정을 통해 접근을 할수 있다.
실제로 host에 VM에 동작되는 port가 listen되는것은 아니며 host는 지정된 목적지/Port 를 확인하여 packet을 forwarding 시켜주는 방식이다.

iptables에는 다음과 같은 rule이 추가되어야 한다.

## nat
-A PREROUTING -i eth0 -p tcp -m tcp --dport 6443 -j DNAT --to-destination 192.168.122.10:6443
## filter
-A FORWARD -o virbr0 -d 192.168.122.10 -p tcp --dport 6443 -j ACCEPT

간단히 설명하자면
VM(192.168.122.10:6443)에 접속하기 위해 DNAT로 host가 아닌 VM IP를 바라볼수 있도록 하고 FORWARD chain을 통해 실제 6443 port 로 forwarding 까지 수행해준다.

또한 여기서 virbr0라 표현한 bridge를 잘확인하여 추가하자.
KVM 가상화 환경에서 libvirt를 통한 연결을 하고 있다면 virsh net-info(혹은 net-dumpxml) 명령을 통해 bridge 명을 확인하여 추가하면 된다.

[root@localhost ~]# virsh net-info testnet
Name:           testnet
UUID:           8xxxxxx0-1xx0-4xxf-9xxf-8xxxxxxxxxx4
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

만약 source 즉, 외부에 특정한 IP만 접근하게 하고자 한다면 다음과 같이 nat 에 -s 옵션을 추가하면 된다.

## nat
-A PREROUTING -s x.x.x.x/xx -i eth0 -p tcp -m tcp --dport 6443 -j DNAT --to-destination 192.168.122.10:6443

만약 VM까지 패킷 수신이 잘되고 VM에서 송신도 이루어졌는데 실제 client에서는 응답을 받지 못하는경우는
아래와 같은 rule이 존재하는지 확인해보면 좋다.

-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT

rule을 모두 넣었음에도 응답이 안되는 상황이 발생된다면
rule의 우선순위에 따라 다른 rule에 적용되었을 가능성이 있다.
이를 잘 확인해보는것이 중요하다.

참고사이트

댓글
댓글쓰기 폼