본문 바로가기

Cloud Native/Research_OpenStack

OpenStack DVR – SNAT Traffic

OpenStack DVR SNAT Traffic Flow


이번 포스팅에서는 Neutron의 주요 서비스 중 SNAT 서비스에 대하여 알아보고자 한다.

SNAT 는 Source NAT의 약자로서 우리나라 말로 억지로 번역하자면 ‘송신측 주소 변환’ 정도가 되겠다.

어려운 말은 둘째로 치고 쉽게 설명하자면…

SNAT와 반대되는 개념이 DNAT라고 하는 것인데 OpenStack에서는 Floating IP를 생각하면 되겠다.

Floating IP는 이미 잘 알고 있는 것 처럼 VM에 Public Network을 사용할 수 있도록 IP를 부여하는 것인데…

OpenStack에서는 이런 방법 말고도 다른 방법으로 VM이 외부 네트워크를 사용할 수 있다.

어떤 방법이냐고 하면…

VM이 외부와 네트워킹을 할때에 공용 IP 하나를 사용하는 방법이다.

즉, 여러 VM이 공용 IP 하나를 공유하여 사용하는 것이 되겠다.

이와 같이 공용 IP를 만들어 VM들이 공유하는 방법으로 외부와 네트워킹을 하는 것을 SNAT라고 한다.

# SNAT를 사용하면 VM은 외부로 접근이 가능하지만 외부에서 VM으로의 접근은 할 수 없다.

# SNAT는 OpenStack의 Network Node를 사용한다.


OpenStack Topology – SNAT



OpenStack의 Horizon을 통하여 Public Network 및 Virtual Network을 생성하고 DVR을 만들어 통신한다.

OpenStack DVR - SNAT Topology

External Network(public) 및 Private Network(net01, net02)를 생성한 뒤 External Network와 Private Network 사이에 DVR을 생성하면 Interface가 2개씩 생성된다.
왜 2개의 인터페이스가 생성될까?
이유는 하나는 Router Namespace에 대한 인터페이스이고 하나는 SNAT를 위한 인터페이스이다.
즉, External Network와 연결된 Private Network 사이의 DVR은 SNAT 만을 위한 인터페이스를 생성하며 이를 통하여 Private Network에 위치하는 VM이 External Network를 사용할 수 있다.

L3_agent.ini

# SNAT에 대한 설정은 Network Node의 l3_agent.ini에서 agent_mode=dvr_snat 로 설정한다.

 

DVR 생성



DVR은 Private Network(net01, net02)에 생성된 VM(vm01, vm02)들이 외부 네트워크를 사용하는 경우에 Traffic 처리를 담당하게 된다.

VM 사이의 트래픽 처리는 앞서 East/West Traffic에서 설명하였다.

NETWORK NODE – SNAT/ROUTER NAMESPACE

위 그림에서 네트워크 노드에 생성된 인터페이스를 확인하면 SNAT 및 Router Namespace가 생성된 것을 확인할 수 있다.
  • SNAT Namespace: snat-cc857096-450e-4c57-9ed1-38a90fb6a85e
  • Router Namespace: qrouter-cc857096-450e-4c57-9ed1-38a90fb6a85e
생성된 SNAT Namespace의 인터페이스 목록을 살펴보면 각 VM들에서 발생한 SNAT Traffic에 대한 인터페이스(sg-xxx, sg-yyy) 및 External Network Device에 대한 인터페이스(qg-xxxx)를 확인할 수 있다.
  • SNAT Interface: 토폴로지에서 확인한 2개의 인터페이스 중 SNAT를 위한 인터페이스
    • sg-748e9c85-fb: net01 네트워크를 사용하는 VM에 대한 SNAT 인터페이스(10.0.0.2/24, fa:16:3e:bd:29:ef)
    • sg-a79f8f6f-15: net02 네트워크를 사용하는 VM에 대한 SNAT 인터페이스(20.0.0.2/24, fa:16:3e:d5:54:d4)
    • qg-80252773-66: sg-xxx 인터페이스와 연결된 External Device 인터페이스로서 sg-xxx 로 부터 수신한 트래픽을 해당 인터페이스로 전달
VM이 위치하는 컴퓨트 노드의 Router Namespace를 살펴보면 다음과 같다.

COMPUTE NODE – ROUTER NAMESPACE

위 그림에서 확인할 수 있는 것 처럼 Compute Node의 Router Namespace에는 SNAT 및 East/West Traffic에 대한 Rule이 이미 설정되어 있음을 알 수 있다.
  • Router Namespace: qrouter-cc857096-450e-4c57-9ed1-38a90fb6a85e
    • Network Node의 Router Namespace와 동일
  • Rule
    • default via 10.0.0.2 dev qr-36ca57b4-23
    • default via 20.0.0.2 dev qr-9d513ed6-af
# 이를 통하여 동일한 Rule이 Network 및 Compute의 Router Namespace에 생성됨을 알 수 있다.

NETWORK NODE – ROUTER NAMESPACE

 

SNAT Traffic Flow



상기 토폴로지에서 DVR은 External Network(public) 과 Private Network(net01: 10.0.0.0/24, net02: 20.0.0.0/24)를 연결하고 있다.

이러한 경우 각 Private Network에 생성된 VM(vm01: 10.0.0.3, vm02: 20.0.0.3)들은 SNAT을 통하여 External Network와 통신할 수 있다.
SNAT을 위한 SNAT Namespace는 Network Node에 생성되며 Network Node의 br-ex 브릿지에 부여한 External IP를 VM들이 공유할 수 있도록 Source NAT 서비스를 제공한다.
즉, Private Network에 연결된 VM이 External IP 없이 External Network와 통신하기 위해서는 반드시 네트워크 노드를 사용하여야 하며 네트워크 노드에 부여된 External IP를 공유하여야 한다. (SNAT Traffic)

SNAT Traffic

위 그림으로 설명하자면…
vm02(20.0.0.3)가 External IP 없이 외부 네트워크와 통신을 하고자 한다.
vm02에서 ping google.com 을 하였을 경우를 가정해보자.
최초 vm02에서 발생한 패킷은 Compute Node의 Router Namespace에 도달하여 매칭 정보를 확인하게 된다.
Router Namespace에는 상기 토폴로지에서 확인할 수 있는 2개의 포트에 대한 Rule 정의가 되어 있다.
  • East/West 에 대한 Rule
  • SNAT에 대한 Rule
목적지인 google.com에 대한 Rule은 East/West Rule에서 찾을 수 없기 때문에 SNAT Rule과 매칭된다.
즉, Network Node의 SNAT Namespace로 연결하는 Rule이 매칭된다.
이때 SNAT 인터페이스에 대한 기본 경로가 src MAC(qr-9d513ed6-af의 MAC), dest MAC(sg-a79f8f6f-15의 MAC)에 설정된다.
이후 Compute Node 와 Network Node 사이의 Overlay Network 구간에서 src MAC은 Compute Node의 MAC으로 변환이 되어 VxLAN 또는 GRE 형식으로 이동한다.
Network Node에서 해당 패킷을 받으면 Overlay 구간의 src MAC을 제거하고 dest MAC(sg-a79f8f6f-15의 MAC)을 확인한 뒤 SNAT Namespace와 매핑한다.
SNAT Namespace에서는 External Network Device인 qg-80252773-66 인터페이스가 존재하기 때문에 src MAC은 qg-80252773-66의 MAC으로 dest MAC은 defaule GW MAC으로 src IP는 qg-80252773-66의 IP로 Source NAT 를 시행하고 통신한다.
이때 SNAT(Source NAT) 서비스가 실행되어 External Network와 통신하게 된다.


'Cloud Native > Research_OpenStack' 카테고리의 다른 글

OpenStack with networking-sfc (devstack)  (6) 2016.03.23
OpenStack REST 확인  (0) 2015.10.19
OpenStack DVR - SlideShare  (0) 2015.06.29
OpenStack DVR – DNAT Traffic  (0) 2015.06.29
OpenStack DVR - East/West Traffic Flow  (0) 2015.06.19