본문 바로가기

Cloud/Oracle Cloud Infrastructure

OCI NAT 게이트웨이 사용 방법

작성자: 정영균

일반적으로 내부 네트웍 통신을 하는 서버와 인터넷 통신을 하는 서버를 분리하기 위해 방화벽 역할을 하는 Bation 서버를 보통 구성합니다. 그런데 프라이빗 서브넷에 위치한 인스턴스가 패치나 소프트웨어 설치를 위해 SSH 등의 인터넷을 통한 원격 접속이 필요할 있습니다. 이 경우 Bastion 서버에서 NAT 설정을 해서 프라이빗 인스턴스 > Bation 인스턴스 > 인터넷 게이트웨이로 트래픽이 흐르도록 있습니다. 이는 이전 테스트에서 내용입니다. 아래 링크를 참조하세요.

8. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버

9. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (시큐리티 리스트)

10. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (인스턴스)

11. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (웹서버 연결)

12. OCI이용해서데이터베이스어플리케이션아키텍쳐구성하기 – Bastion 서버 (NAT 설정)


OCI NAT 게이트웨이는 퍼블릭 IP 가지지 않는 프라이빗 인스턴스가 인터넷 게이트웨이가 아닌 별도 전용 게이트웨이를 통해 인터넷에 접속할 있게 합니다. 아래 오른쪽 그림과 같은 방식으로 작동합니다.

NAT 게이트웨이의 장점은 인터넷에 연결해서 응답을 받을 있지만, 그 외의 인터넷으로부터의 인바운드 트래픽은 막을 있다는데 있습니다. 이를 이용해서 이번 테스트에서는 인스턴스 관리를 위해 SSH 연결은 퍼블릭 인스턴스(Bastion)를 통해서만 이루어 지도록 하게 하고, 프라이빗 인스턴스에서 외부로의 연결은 NAT 게이트웨이를 통해서 하도록 구성해 보겠습니다.

 

다음과 같은 과정으로 NAT 게이트웨이를 테스트해 보았습니다. 퍼블릭 서브넷, 퍼블릭 인스턴스는 프라이빗 인스턴스로 SSH 접속을 위한 Bation 서버 용도입니다. 프라이빗 인스턴스에서 NAT 게이트웨이를 통해 인터넷 통신이 가능함을 보여주기 위해 생성하는 테스트용입니다. 

VCN 네트웍 구성

VCN 생성

인터넷 게이트웨이 생성퍼블릭 인스턴스 인터넷 통신용

라우트 테이블 생성

시큐리티 리스트 생성

서브넷 생성퍼블릭, 프라이빗 서브넷 생성

인스턴스(가상머신) 생성

시큐리티 리스트 설정 (퍼블릭 인스턴스 > 프라이빗 인스턴스로 22 포트 개방)

NAT 게이트웨이 생성/설정


먼저 VCN 생성합니다. 서브넷 등은 별도로 구성할 것이므로 “Create Virtual Cloud Network Only” 옵션으로 생성했습니다.


만든 VCN “demovcn” “internetGW”라는 이름으로 인터넷 게이트웨이 생성했습니다.


만든 VCN “demovcn” 라우트 테이블 이름 “routeTabPriv” 지정한 비어있는 라우트 테이블 생성했습니다. 라우트 규칙은 이후 따로 추가할 것입니다. 디폴트 라우트 규칙은 “X” 버튼을 클릭하여 삭제했습니다.


시큐리티 리스트도 생성합니다. 만든 VCN “demovcn” 비어있는 시큐리티 리스트 생성했습니다. 디폴트 시큐리티 규칙은 “X” 버튼을 클릭하여 삭제했습니다.


서브넷을 만듭니다. 아래와 같이 퍼블릭 인스턴스용, 프라이빗 인스턴스용 서브넷을 만들고, 각각 서로 다른 시큐리티 리스트와 라우트 테이블을 적용 받도록 생성합니다. Availability Domain AD-3에서 만들었습니다.

용도

타입

서브넷 이름

IP 범위 (CIDR)

라우트 테이블

시큐리티 리스트

퍼블릭 인스턴스용

퍼블릭

subnetPub

10.0.0.0/24

디폴트 라우트 테이블

디폴트 시큐리티 리스트

프라이빗 인스턴스용

프라이빗

subnetPriv

10.0.1.0/24

routeTabPriv

secListPriv

 

구성대로 서브넷을 만들고 나면 아래와 같은 화면을 있습니다.


퍼블릭 서브넷이 인터넷 통신이 가능하도록 퍼블릭 서브넷에 적용되는 디폴트 라우트 테이블의 라우트 규칙을 추가합니다. “Target Internet Gateway”에서 앞서 생성한 인터넷 게이트웨이을 선택했습니다.


SSH 연결 테스트를 위해 퍼블릭 서브넷에서 프라이빗 서브넷으로 SSH 연결을 허용해야 합니다. 앞에서 만든 프라이빗 서브넷의 시큐리티 리스트 secListPriv” 규칙을 추가합니다. 퍼블릭 서브넷(10.0.0.0/24)에서 들어오는 TCP 22 포트에 대해 Stateful Ingress 규칙을 추가했습니다. 또한 프라이블 서브넷에서 나가는 모든 트래픽을 마찬가지로 Stateful 추가했습니다.


이제 지금까지 구성한 네트웍의 적용을 받는 인스턴스를 생성할 차례입니다. 아래 구성과 같이 만들었습니다.

 

퍼블릭 인스턴스

프라이빗 인스턴스

Name

instPub

instPriv

Availability Domain

AD-3

AD-3

Operating System or Image Sourde

Oracle Linux 7.6

Oracle Linux 7.6

Instance Type

Virtual Machine

Virtual Machine

Instance Shape

VM.Standard2.1

VM.Standard2.1

Boot Volume

기본값(46.6 GB)

기본값(46.6 GB)

SSH Keys

id_rsa.pub

id_rsa.pub

Virtual Cloud Network Compartment

ykcomp1

ykcomp1

Virtual Cloud Network

demovcn

demovcn

Subnet Compartment

ykcomp1

ykcomp1

Subnet

subnetPub

subnetPriv

Fault Domain

Fault-Domain-2

Fault-Domain-3

 

구성대로 가상머신 인스턴스를 만들고 나면 아래와 같은 화면을 있습니다.


이제 퍼블릭 인스턴스와 프라이빗 인스턴스에 SSH 연결을 보겠습니다. 퍼블릭 인스턴스로는 퍼블릭 IP 통해 연결하면 됩니다. 프라이빗 인스턴스로의 SSH 접속은 “ProxyCommand” 옵션으로 퍼블릭 인스턴스를 경유해서 접속을 했습니다. 퍼블릭 서브넷에서 프라이빗 서브넷으로 들어오는 22 포트 트래픽을 개방했기 때문에 접속이 현재 가능합니다.

youjung@YOUJUNG-KR MINGW64 ~

$ ssh -i C:\\Users\\youjung\\.ssh\\id_rsa opc@129.213.95.241

The authenticity of host '129.213.95.241 (129.213.95.241)' can't be established.

ECDSA key fingerprint is SHA256:jFPsRzrcZCq2ExLKmhGuKux7PSeYk9zJzRmdLU/8plI.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '129.213.95.241' (ECDSA) to the list of known hosts.

[opc@instpub ~]$ hostname

instpub

[opc@instpub ~]$ exit

logout

Connection to 129.213.95.241 closed.

 

youjung@YOUJUNG-KR MINGW64 ~

$ ssh -t -o ProxyCommand='ssh -i C:\\Users\\youjung\\.ssh\\id_rsa opc@129.213.95.241 -W %h:%p %r' -i C:\\Users\\youjung\\.ssh\\id_rsa opc@10.0.1.2

The authenticity of host '10.0.1.2 (<no hostip for proxy command>)' can't be established.

ECDSA key fingerprint is SHA256:midRHjM3VwKizhY6wVmK6LWMwu/nrcsALKKRA98LzSU.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '10.0.1.2' (ECDSA) to the list of known hosts.

[opc@instpriv ~]$ hostname

instpriv

[opc@instpriv ~]$

 

지금까지 NAT 게이트웨이 테스트를 위한 VCN 생성/설정, 인스턴스 생성까지 했습니다. 이제 NAT 게이트웨이를 만들고 설정을 차례입니다.

VCN 상세 화면 왼쪽 메뉴의 [NAT Gateway] 클릭하면 NAT 게이트웨이 생성 화면이 나타납니다. “Create NAT Gateway” 클릭합니다.


NAT 게이트웨이 이름을 입력하고 “Create” 클릭합니다. 여기서는 “natGW” 명명했습니다.


NAT 게이트웨이 생성 확인 팝업이 나타납니다. 확인후 “Close” 클릭합니다.


NAT 게이트웨이를 만들었고, 프라이빗 인스턴스의 인터넷으로의 트래픽이 NAT 게이트웨이를 향하도록 설정할 차례입니다. 프라이빗 인스턴스가 속한 서브넷의 라우트 테이블 “routeTabPriv”에서 규칙을 추가하고 “Save” 클릭하여 저장합니다.

              Target Type: “NAT Gateway” 선택합니다.

        Destination CIDR Block: “0.0.0.0/0” 입력합니다.

        Compartment: NAT 게이트웨이가 만들어진 Compartment 선택합니다.

        Target NAT Gateway: 앞서 만든 “natGW” 선택합니다.

 

NAT 게이트웨이 설정이 끝났습니다. 프라이빗 인스턴스에서 인터넷으로 연결이 가능한지 ping 명령으로 테스트해 보았습니다.

염두해 점은 앞서 퍼블릭 인스턴스에서 프라이빗 인스턴스로 부터 오는 트래픽을 포워딩 시키는 등의 별도 서버 레벨의 NAT 설정을 하지 않았다는 점입니다. 지금까지 일은 NAT 게이트웨이를 만들고, 프라이빗 인스턴스가 사용하는 라우트 테이블에서 NAT 게이트웨이를 사용하도록 지정한 뿐입니다.

현재 curl” 명령으로 자신의 IP 출력해 보면, 오라클이 별도 퍼블릭 IP 할당했음을 있습니다.

youjung@YOUJUNG-KR MINGW64 ~

$ ssh -t -o ProxyCommand='ssh -i C:\\Users\\youjung\\.ssh\\id_rsa opc@129.213.95.241 -W %h:%p %r' -i C:\\Users\\youjung\\.ssh\\id_rsa opc@10.0.1.2

Last login: Thu Feb 14 07:09:21 2019 from instpub.subnetpub.demovcn.oraclevcn.com

[opc@instpriv ~]$ hostname

instpriv

[opc@instpriv ~]$ ping -c 3 google.com

PING google.com (172.217.19.206) 56(84) bytes of data.

64 bytes from ams16s31-in-f14.1e100.net (172.217.19.206): icmp_seq=1 ttl=55 time=110 ms

64 bytes from ams16s31-in-f14.1e100.net (172.217.19.206): icmp_seq=2 ttl=55 time=81.4 ms

64 bytes from ams16s31-in-f14.1e100.net (172.217.19.206): icmp_seq=3 ttl=55 time=81.4 ms

 

--- google.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2003ms

rtt min/avg/max/mdev = 81.432/91.025/110.181/13.549 ms

[opc@instpriv ~]$ curl ifconfig.co

129.213.176.40

[opc@instpriv ~]$