[Cloud] NAT Gateway란? (NAVERCloud에서 NAT 생성과 적용)
지난 글에서 private subnet에 폐쇄적인 서버를 생성하면서 NAT GW의 필요성에 대해 언급했었다!
위 글에서 DB와 같이 폐쇄적인 서버를 위치시키기 위한 서브넷으로
공인IP를 부여하지 않는(=Internet Gateway를 지나지 않도록 한) Private Subnet을 생성했었다.
private subnet의 서버는 외부와는 Inbound도, Outbound도 불가한 것을 지난 글에서 확인했었다.
그러나 DB서버에도 JDK, Linux등을 외부로부터 설치해야 할 일이 분명 있을 수 있다.
이 때 NAT GateWay를 사용한다.
private subnet에서 NAT GW를 통해 외부와 통신할 때는 사설IP를 공인 IP로 변환하면서 그 IP정보를 NAT가 가지고있고, 리눅스 등을 설치하고자 그 파일을 가져올때도 기억해뒀던 IP로 들어오게 되는 것이다.
즉, 외부에서 직접적으로 들어오는 것은 여전히 안 되고, NAT를 통해 흘러들어오기만 가능하기 때문에 '단방향적'이라는 얘기를 하곤 한다. (요청은 Subnet쪽에서만 할 수 있고 외부에서는 할 수 없는, OutBound통신만 가능.)
1. NAT GW용 Subnet 생성
이렇게 NAT GW라는 새로운 문을 하나 더 거침으로써 외부와의 단방향적 통신이 가능하며,
NAVERCloud에서는 이 NAT GW 위치시킬 별도의 Subnet을 만들어줘야 한다.
(다른 Cloud서비스에서는 이렇게 하지 않고 그냥 Public Subnet에 집어넣는 경우도 있다.)
똑같이 Subnet을 만들되, 용도를 NAT GW로 설정한다.
IP 주소 범위는 10.0.3.0.24과 같이 private(10.0.2.0/24), public subnet (10.0.1.0/24) 에서 했던대로 순차적으로 해도 상관없고 자기 맘이다.
이 예제에서는 NAT GW용 별도의 Subnet이라는 강력한 표현을 위해 10.0.100.0/24로 표현했다.(골방으로 보내버림)
2. NAT GW 생성
만들어둔 서브넷을 적용해서 NAT를 만들었다.
NAT는 공인 IP를 새로 할당받았다.
3. Route table 설정
VPC의 Route table에 가보면
VPC 생성시 NCloud에서 기본제공해주는 private Route table에
나의 NAT GW 서브넷이 들어가 있는 것을 확인할 수 있다.
라고 작성했었으나, 댓글을 통해 뭔가 잘못되었음을 깨달았습니다......
아래 자료의 6. Private Subnet Route Table 설정부분을 뒤늦게 확인하여 정정합니다.
"Private Subnet의 Route Table은 local 항목만 자동으로 설정되기 때문에
NAT Gateway 네트워크 경로를 별도로 설정해야합니다"
첫번째 행의 NATGW네트워크 경로를 별도로 등록한 모습이다. 전체(0.0.0.0/0)트래픽이 NATGW로 가도록 한다.
기존에는 두번째 행인 사설IP들이 LOCAL에서 통신 가능하도록 설정 되어있는 것을 확인할 수 있을 것이다.
이들 중 라우팅 테이블 우선순위에 따라 네트워크 경로가 결정될 것이다.
+ Default가 싫으면 아래처럼 따로 Route table을 생성해도 좋다.
폐쇄적인 사설 Subnet들을 위한 Route table이므로 Subnet지원 유형은 사설로 선택한다.
(NAT 자체는 public subnet에 위치시키고 공인IP를 할당받아 외부와 통신이 되게 했던거고,
이 테이블은 말 그대로 private 서버들의 라우팅을 위한 것이다.)
그러므로 당연히 테이블 생성 후 연관Subnet에 private 서브넷을 연결시켜 줘야 한다.
(애초에 서브넷 지원 범위를 '사설'로 설정한 테이블이므로, 연관 Subnet설정에서도 private Subnet들만 뜰 것이다.)
private Subnet들의 모든 목적지(0.0.0.0/0)에 대해 NAT GW를 거치도록 Route Table설정까지 마쳤다.
4. NAT 테스트
이제 private subnet의 서버가 NAT를 통해 외부와 통신하게 되었는지 확인해보자.
NAT를 썼다고 해도 단방향적 통신만 가능하기 때문에 외부에서 직접 private subnet의 서버로 접근할 수는 없다.
그러므로 public subnet에 있는 서버의 공인IP로 먼저 접속하고, 그 서버에서 private subnet의 서버로 우선 접속하자.
접속 한 후 google에 ping을 날려보니
이제 NAT를 통해 로컬IP를 공인IP로 변환해 Outbound 통신하고
다시 NAT로 응답을 잘 받아오는 것을 확인할 수 있다!
NAT는 비싸다고 하니 이제 얼른 삭제해야겠다 ㅎ호호