Devops Skill Up/AWS

[AWS] 서브넷 CIDR와 도커 대역IP 충돌

불여우의 길 2024. 4. 4. 12:23

ISSUE

private subnet의 EC2가 public subnet의 ELB와 통신 불가인 이슈 발생

  • 콘솔상에서는 배포가 성공되는 것 처럼 보임
  • instance 장비 접속하여 컨테이너 조회하면 배포는 정상적으로 완료
  • 배포된 컨테이너 nginx 와 ELB의 연결 실패로 결과적으로는 배포 실패

TEST

  1. 서브넷 변경
    • private-subnet-02의 문제일 가능성을 두고 해당 instance를 private-subnet-01 에 배포
  2. Public IP 자동할당 제거
    • 기존 public subnet에 배포되어있던 ECS-EC2 ASG Template 으로 생성한 Container Instance라 private subnet에 생성된 Instance임에도 불구하고 public IP 가 할당
    • 문제 가능성을 두고 public ip 자동할당을 해제하고 Instance 재생성
  3. 인스턴스 간 통신 테스트 (curl)
    1. public container instance → private instance 연결 가능
    2. private instance → private container instance 연결 가능
    3. private container instance → private container instance 연결 가능
    4. public instance → private container instance 연결 불가*

결론 : private subnet에 있는 Container Instance가 public subnet 장비와 네트워킹이 불가


CAUSE

ECS Contianer Instance의 기본 Network(docker0)의 CIDR 대역과 Public Subnet의 CIDR 대역이 일치함으로서 발생한 네트워크 충돌로 인한 것입니다.

반품마켓 VPC 네트워크 구조

CIDR

  • 172.16.0.0/16
  • 172.17.0.0/16

Subnet

  • ap-northeast-2a
    • public-subnet-01 (172.17.0.0/24)
    • private-subnet-01 (172.16.0.0/24)
  • ap-northeast-2c
    • public-subnet-02 (172.17.2.0/24)
    • private-subnet-02 (172.16.2.0/24)

Docker Default Network 대역

관련문서👈

Docker Container의 경우 default 로 사용 대역폭이 설정되어있음

172.17.0.0/17 대역이 제일 먼저 사용 됨 → VPC 대역과 일치

관련문서👈

Doker Default Network와 VPC Subnet 의 대역이 일치하면 IP 충돌이 발생

  • 인스턴스 간 통신 테스트 (curl) 분석
    • Private Subnet의 인스턴스가 Container Instance가 아니고 Bridge Network 대역이 존재하지 않기 떄문에 연결이 성공합니다.
    (2) private instance → private container instance 연결 가능
    • Container Instance 여부와 관계없이 Private Subnet 대역 (172.16.0.0/16)과 Bridge Network 대역 (172.17.0.0/16)이 출동하지 않기 때문에 연결이 성공합니다.
    (4) public instance → private container instance 연결 불가*
    • Private Subnet 내의 Container Instance로 접근하는 것은 문제가 없지만 Container Instance 입장에서 Public Subnet 대역과 Bridge Network 대역을 모두 알고있기 때문에 네트워크 충돌이 발생하고 Public Subnet으로부터의 요청을 Bridge 네트워크로 전달할 수 없습니다.
  • (3) private container instance → private container instance 연결 가능
  • (1) public container instance → private instance 연결 가능

SOLUTION

  1. Docker 대역을 변경하여 Container 배포
    1. 이부분은 따로 포스팅 해보겠숨다 ^^7
  2. VPC CIDR 블록을 추가하여 새로운 대역의 서브넷 생성
    1. 기존 사용하던 cidr 블록이 172 대면 172 대로 추가 가능
      • AWS Support Plan 답변따라서 신규 Container Instance를 생성하실 때는 172.x.x.x 대역이 아닌 다른 대역 (10.x.x.x 혹은 192.x.x.x)으로 Bridge Network를 설정하여 생성해주시면 됩니다.
      • VPC Network 에 CIDR을 추가할 때 기존에 172.x.x.x 대역을 쓰고있다면 172.x.x.x 대역으로만 추가가 가능합니다.
      docke container default bridge network ip 가 172 대역을 순차적으로 할당하기 때문에 172 번대 cidr 블록을 추가하는게 해답이 아니라는 판단.
  3. task 네트워크 모드를 bridge가 아닌 awsvpc 모드로 배포