관리 메뉴

밤 늦게까지 여는 카페

AWS 고정 IP 할당 방법 - egress 네트워크 트래픽편(EIP, NAT Gateway) 본문

aws

AWS 고정 IP 할당 방법 - egress 네트워크 트래픽편(EIP, NAT Gateway)

Jㅐ둥이 2023. 8. 24. 09:00

안녕하세요. 오늘은 AWS에서 egress 네트워크 트래픽에 대해서 고정 IP를 할당하는 방법에 대해서 정리해보도록 하겠습니다.

  • egress 네트워크 트래픽이란 서버에서 외부로 향하는 트래픽을 뜻합니다.
  • AWS 고정 IP 할당 방법 - ingress 네트워크 트래픽편(EIP, NLB, ALB[Global Accelerator]) 포스팅을 작성하고, 금방 egress 트래픽편을 작성하려고 했는데 어쩌다보니 3개월 가까이 지나버렸네요 ㄷㄷㄷ

 
그런데 egress 네트워크 트래픽에 대해서 왜 고정 IP를 할당해야 하냐구요?
 
보안이 중요한 서비스들은 특정 IP 대역으로 오는 요청만 허용하는 경우가 있습니다. 그래서 API 사용 신청하면서 사용할 CIDR을 같이 전달해야 하죠.
 
아마 프로젝트를 진행하시면서 이런 경우를 생각보다 자주 접할 수 있어서 알아두면 잘 써먹을 수 있을 것 같습니다.
 
 
본론으로 돌아와서 이번에 정리할 방법들로는 1) Elastic IP(EIP)를 사용하는 방법, 2) NAT Gateway를 사용하는 방법 2가지가 있습니다.
 
하나씩 알아볼까요?


0. 클라이언트 IP 확인 방법

ingress 트래픽에 대해서 고정 IP가 할당되었는지 확인하는 것은 간단합니다.
고정 IP를 할당받은 인스턴스로 요청을 보내보면 됩니다.
 
그렇다면 egress 트래픽에 대해서 고정 IP를 할당되었는지는 어떻게 확인할 수 있을까요?

저는 간단한 http 서버를 준비해서 요청을 보낸 클라이언트의 IP를 확인했습니다.
 
http 서버를 만드는 방법은 다양하겠지만 저는 python http.server 패키지를 이용했습니다.
다음 코드를 이용하여 서버로 요청을 보낸 클라이언트의 IP를 확인할 수 있도록 준비했습니다.

import http.server
from http import HTTPStatus

class ClientInfoPrintHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.client_address)
        self.send_response(HTTPStatus.OK)
        self.end_headers()

if __name__ == "__main__":
    with http.server.HTTPServer(("", 8080), ClientInfoPrintHTTPRequestHandler) as httpd:
        print("serving at port", 8080)
        httpd.serve_forever()

 
로컬 환경에서도 테스트 해보고, 클라우드 환경에서도 테스트 해봤는데 정상적으로 클라이언트의 IP를 확인할 수 있더라고요!

  • AWS만 사용하다가 최근에 Oracle Cloud를 사용해봤는데 프리 티어가 상당히 좋더라고요! 이 부분도 나중에 공유드리겠습니다 ㅎㅎ
로컬 환경 실행 예시
클라우드 환경 실행 예시

 
이번에는 Oracle Cloud 환경에서 위의 테스트 서버를 실행시킨 다음에 AWS EC2 인스턴스들의 egress 트래픽 요청이 고정 IP로 오는지 확인해보겠습니다!
 

1. EIP를 사용하여 EC2 인스턴스에 고정 IP를 할당하는 방법

EC2 인스턴스에 EIP를 사용하여 고정 IP를 할당하는 방법입니다.
이 경우에는 ingress, egress 모든 트래픽에 대해서 고정 IP가 할당되겠죠?
 
고정 IP를 할당하는 방법은 AWS 고정 IP 할당 방법 - ingress 네트워크 트래픽편의 1. EIP를 사용하는 방법에 정리되어 있으니 참고 부탁드립니다!
 
그러면 EC2 인스턴스에 고정 IP가 할당되어 있다고 가정하고, 실제로 요청을 보내볼까요?
 
저는 이렇게 EC2에 EIP를 할당해서 준비를 마쳤습니다! 할당 받은 IP는 3.34.158.127입니다.

EIP가 할당된 EC2

 
이제 생성된 EC2 인스턴스에서 클라우드 서버로 요청을 보내보겠습니다!

EC2 Instance Connect를 이용해서 서버로 요청 보내기

과연 IP가 3.34.158.127로 출력이 될까요?
짜잔! 당연하지만 할당 받은 고정 IP로 출력이 되네요 ㅋㅋㅋ

할당 받은 고정 IP로 출력되는 것을 확인할 수 있습니다.

2. NAT Gateway를 사용하는 방법

1의 방법으로는 하나의 인스턴스의 egress 트래픽에 대해서만 고정 IP만 할당할 수 있습니다.
 
만약 여러 인스턴스를 사용하는 경우라면 어떻게 해야 할까요?

  • Auto Scaling Group, ECS, EKS 등 하나의 서비스에 대해서 여러 인스턴스를 생성하는 일은 매우 흔합니다!

바로 NAT Gateway로 문제를 해결할 수 있습니다.
인스턴스들이 외부 서버로 요청을 보낼 때, NAT Gateway를 경유하게 되면 외부 서버가 받은 요청의 헤더에는 NAT Gateway의 IP가 찍히게 됩니다.
 
위에서 사용한 EIP인 3.34.158.127를 예시로 들면 아래와 같이 IP 정보가 헤더에 담기게 됩니다.

NAT Gateway를 통해서 요청이 전달되는 예시

 
대신에 인스턴스들이 외부 서버로 보내는 요청들이 꼭 NAT Gateway를 경유하게 만들어야 합니다.
 
가장 간단한 방법은 1) 인스턴스들을 private subnet에서 구성하고, 2) private subnet에서 외부 서버로 나가는 모든 요청들을 public NAT Gateway으로 라우팅 되도록 설정하는 것입니다.
 
private subnet을 구성하는 것은 정말 간단합니다!
 
외부 서버들과 통신할 수 있는 Internet Gateway로 라우팅 되지 않도록 만들면 되는 것이죠.
그러기 위해서는 routing table을 수정해야겠죠?
 
저는 기본 routing table을 public routing table이라고 이름 짓고 기본 서브넷 4개 중에서 3개만 연결시켰습니다.

Internet GW로 라우팅하는 public routing table

그리고 private subnet으로 구성할 subnet을 private routing 테이블에 연결했습니다.

  • private routing table은 Internet GW로 라우팅하지 않고, NAT GW로 라우팅합니다.
NAT GW로 라우팅하는 private routing table

 
그리고 EC2 인스턴스를 생성할 때 subnet을 private subnet으로 지정하면 됩니다.
저는 테스트를 진행하기 위해서 EC2 인스턴스 3개를 private subnet에 생성했습니다.

테스트용 EC2 인스턴스들

혹시1 위의 이미지 하단에 bastion-ec2가 보이시나요?
 
private subnet에 생성된 인스턴스는 바로 접근하는 것이 불가능합니다 ㅜ
public subnet을 통해서 접근해야만 합니다.

저는 public subnet에서 생성된 bastion-ec2를 통해서 해당 인스턴스들로 접속해서 테스트를 진행했습니다.
이번에도 IP가 3.34.158.127로 출력될까요?
 
짜잔! 이번에도 3.34.158.127로 출력이 되네요!

test-egress-static-ip 에서 요청을 보냈을 때
test-egress-static-ip2 에서 요청을 보냈을 때
test-egress-static-ip3 에서 요청을 보냈을 때

이렇게 egress 트래픽에 대해서 고정 IP를 할당하는 방법을 알아봤습니다.
 
테스트 하는 것은 간단했지만 실제로 운영되고 있는 서비스에서 이를 진행해야 한다면 곱절은 어려울 것이라고 생각합니다 ㅜ
기존 서비스들을 유지하면서 새롭게 생성되는 인스턴스들로 클라이언트 트래픽을 라우팅해야 하는데 벌써부터 막막하네요 ㅋㅋ쿠ㅠ
 
혹시 egress 트래픽에 대해서 고정 IP를 더 편리하거나 좋은 방법이 있다면 많이 알려주세요 :)
 
 

반응형