EC2 가 인터넷에 못 나갈 때 (라우팅, NAT, 보안 그룹, NACL, DNS 점검)
프라이빗 또는 퍼블릭 서브넷의 EC2 에서 패키지 설치, 외부 API 호출이 시간 초과로 실패할 때 라우팅 테이블, 인터넷 게이트웨이, 퍼블릭 IP, NAT Gateway, 보안 그룹, NACL 의 임시 포트, DNS 설정을 차례로 확인하는 절차를 증상, 원인, 해결 순서로 정리합니다. Reachability Analyzer 사용법도 담았습니다.
증상
$ sudo dnf install -y jq
Error: Failed to download metadata for repo 'amazonlinux': Cannot download repomd.xml:
Curl error (28): Timeout was reached
$ curl -sS -m 5 https://checkip.amazonaws.com
curl: (28) Connection timed out after 5001 milliseconds- 시간 초과(timeout) 는 패킷이 어딘가에서 버려지는 것입니다. 라우팅, NAT, 보안 그룹, NACL 을 봅니다.
Could not resolve host는 DNS 문제입니다. 네트워크 경로보다 VPC 의 DNS 설정을 먼저 봅니다.- 연결 거부(refused) 는 상대까지 도달은 했다는 뜻입니다. 대상 서비스, 방화벽 쪽 문제입니다.
원인
인터넷으로 나가는 길은 서브넷 종류에 따라 다릅니다. 구조는 VPC 설계 의 그림에 있습니다.
| 서브넷 | 나가는 길 | 필요한 것 |
|---|---|---|
| 퍼블릭 | 인스턴스에서 인터넷 게이트웨이로 바로 | 0.0.0.0/0 이 IGW 로 가는 라우팅, 퍼블릭 IPv4 또는 EIP |
| 프라이빗 | 인스턴스, NAT Gateway(퍼블릭 서브넷), 인터넷 게이트웨이 순서 | 0.0.0.0/0 이 NAT 로 가는 라우팅, NAT 가 있는 서브넷의 IGW 라우팅 |
| 프라이빗 IPv6 | 인스턴스에서 송신 전용 인터넷 게이트웨이로 | ::/0 이 EIGW 로 가는 라우팅 |
흔한 원인을 빈도순으로 적으면 다음과 같습니다.
- 프라이빗 서브넷의 라우팅 테이블에
0.0.0.0/0경로가 없거나, 다른 AZ 의 지워진 NAT 를 가리킴(blackhole) - 퍼블릭 서브넷인데 인스턴스에 퍼블릭 IP 가 없음
- NAT Gateway 를 프라이빗 서브넷에 만듦(NAT 자체가 나갈 길이 없음)
- 보안 그룹의 아웃바운드 규칙을 지움
- NACL 이 돌아오는 응답의 임시 포트(1024-65535) 를 막음
- VPC 의
enableDnsSupport가 꺼져 있거나 DHCP 옵션 세트의 DNS 서버가 잘못됨 - 중앙 방화벽(Network Firewall, 프록시)의 허용 목록에 도메인이 없음
해결
1. 인스턴스가 속한 서브넷과 라우팅 확인
IID=i-0abc1234def567890
SUBNET=$(aws ec2 describe-instances --instance-ids $IID --query 'Reservations[0].Instances[0].SubnetId' --output text)
aws ec2 describe-route-tables --filters Name=association.subnet-id,Values=$SUBNET \
--query 'RouteTables[0].Routes[].[DestinationCidrBlock,GatewayId,NatGatewayId,TransitGatewayId,State]' --output table결과가 비어 있으면 서브넷이 명시적으로 연결된 라우팅 테이블이 없어 기본(main) 라우팅 테이블을 쓰는 것입니다. 그 테이블도 확인합니다. State 가 blackhole 이면 대상이 사라진 경로입니다.
2. NAT Gateway 상태와 위치 확인
aws ec2 describe-nat-gateways --filter Name=vpc-id,Values=vpc-0123 \
--query 'NatGateways[].[NatGatewayId,SubnetId,State,ConnectivityType,NatGatewayAddresses[0].PublicIp]' --output tableState는available이어야 합니다.ConnectivityType이private인 NAT 는 인터넷으로 나갈 수 없습니다(다른 VPC, 온프레미스용).- NAT 가 있는 서브넷의 라우팅 테이블에 IGW 경로가 있는지 다시 봅니다.
2025-11 에 나온 리전 NAT Gateway 는 AZ 마다 따로 만들지 않고 VPC 수준에서 여러 AZ 를 자동으로 덮습니다. 새로 만드는 VPC 라면 AZ 별 NAT 를 관리하는 대신 검토할 만합니다. 서울 단가는 기존 NAT 와 같은 시간당 0.059 USD, GB 당 0.059 USD(2026-10 Price List 기준)입니다.
3. 보안 그룹과 NACL 확인
- 보안 그룹은 상태 저장이라 아웃바운드만 열려 있으면 응답은 자동으로 들어옵니다. 기본 아웃바운드 규칙(
0.0.0.0/0전체 허용)을 지웠다면 최소한 443, 80, DNS 를 엽니다. - NACL 은 상태 비저장입니다. 아웃바운드 443 허용과 함께 인바운드 1024-65535(임시 포트) 를 허용해야 응답이 들어옵니다. NACL 은 서브넷 경계마다 적용되므로 인스턴스 서브넷과 NAT 서브넷 둘 다 봅니다.
4. DNS 확인
cat /etc/resolv.conf # nameserver 169.254.169.253 또는 VPC CIDR+2
dig +short checkip.amazonaws.com
aws ec2 describe-vpc-attribute --vpc-id vpc-0123 --attribute enableDnsSupportDNS 가 안 되면 VPC 속성, DHCP 옵션 세트, Route 53 Resolver DNS Firewall 규칙을 봅니다.
5. Reachability Analyzer 로 경로 분석
여러 설정을 눈으로 보기 어려우면 VPC Reachability Analyzer 에 출발지(인스턴스)와 목적지(인터넷 게이트웨이)를 넣습니다. 패킷을 실제로 보내지 않고 설정만으로 경로를 분석해서, 막히는 지점(라우팅 테이블, 보안 그룹, NACL)과 규칙을 알려 줍니다.
aws ec2 create-network-insights-path --source $IID --destination igw-0abc --protocol tcp --destination-port 443
aws ec2 start-network-insights-analysis --network-insights-path-id nip-01236. 인터넷이 꼭 필요한가 다시 보기
AWS 서비스 호출(S3, DynamoDB, ECR, Secrets Manager, SSM)이 목적이라면 인터넷 대신 VPC 엔드포인트를 쓰는 편이 안전하고 쌉니다. S3, DynamoDB 는 무료 게이트웨이 엔드포인트가 있습니다. VPC 보안과 엔드포인트 참고. 패키지 저장소는 S3 기반 미러나 CodeArtifact 를 쓰면 NAT 없이도 설치할 수 있습니다.
점검표
| 확인 | 정상 |
|---|---|
서브넷 라우팅 0.0.0.0/0 | 퍼블릭은 igw-, 프라이빗은 nat-, 상태 active |
| 퍼블릭 IP | 퍼블릭 서브넷 인스턴스에 있음 |
| NAT 위치 | 퍼블릭 서브넷, available, public 연결 유형 |
| 보안 그룹 아웃바운드 | 443 이상 허용 |
| NACL | 아웃바운드 443, 인바운드 임시 포트 허용 |
| DNS | enableDnsSupport 켜짐, dig 성공 |