NAT 와 사설 네트워크
사설 IP 주소를 공인 IP 로 바꿔 여러 기기가 하나의 주소를 공유하게 만드는 방식
왜 필요한가
IPv4 주소는 약 43억 개뿐이고 이미 고갈됐습니다. 그런데 집에 있는 기기만 열 대가 넘습니다.
| 구분 | 내용 |
|---|
| 공인 IP | 인터넷에서 유일하다. 통신사가 할당한다 |
| 사설 IP | 내부 네트워크에서만 유효하다. 누구나 쓸 수 있다 |
| NAT | 둘 사이를 바꿔주는 변환 |
사설 주소 범위는 정해져 있습니다.
| 범위 | 크기 | 쓰이는 곳 |
|---|
| 10.0.0.0/8 | 약 1,678만 | 기업, 클라우드 VPC |
| 172.16.0.0/12 | 약 105만 | 중간 규모 |
| 192.168.0.0/16 | 약 6.5만 | 가정용 공유기 |
동작
내부 기기가 외부로 나갈 때 공유기가 주소와 포트를 바꿔 기록합니다.
| 방향 | 출발지 | 도착지 |
|---|
| 나갈 때 (내부) | 192.168.1.10:5000 | 8.8.8.8:443 |
| 나갈 때 (변환 후) | 공인IP:41230 | 8.8.8.8:443 |
| 돌아올 때 | 8.8.8.8:443 | 공인IP:41230 |
| 돌아올 때 (변환 후) | 8.8.8.8:443 | 192.168.1.10:5000 |
공유기가 변환 표를 들고 있어서 돌아오는 응답을 원래 기기로 보냅니다. 포트 번호로 구분하기 때문에 여러 기기가 한 주소를 공유할 수 있습니다.
NAT 가 만드는 제약
| 제약 | 내용 |
|---|
| 외부에서 먼저 연결 불가 | 변환 표에 항목이 없어 어디로 보낼지 모른다 |
| 표 유지 시간 | 통신이 없으면 항목이 사라져 연결이 끊긴다 |
| P2P 어려움 | 양쪽 모두 NAT 뒤에 있으면 서로 먼저 연결할 수 없다 |
| 일부 프로토콜 문제 | 패킷 안에 IP 를 담는 프로토콜은 변환이 어렵다 |
첫 번째를 뚫는 방법이 포트 포워딩입니다. "공인IP:8080 으로 오는 것은 192.168.1.10:80 으로 보내라"를 미리 등록해 둡니다.
세 번째는 별도 서버가 필요합니다. 양쪽이 각자 밖으로 연결을 열어 자기 공인 주소와 포트를 알아내고(STUN), 그것으로 직접 연결을 시도합니다. 실패하면 중계 서버로 우회합니다(TURN).
클라우드에서
| 구성 | 내용 |
|---|
| 퍼블릭 서브넷 | 인터넷 게이트웨이로 직접 나간다. 로드밸런서를 둔다 |
| 프라이빗 서브넷 | NAT 게이트웨이를 거쳐 나간다. 애플리케이션과 DB 를 둔다 |
| 서브넷 나누기 | 가용영역마다 하나씩. 한 영역이 죽어도 남는다 |
프라이빗 서브넷에 애플리케이션을 두는 이유가 NAT 의 첫 번째 제약입니다. 외부에서 먼저 연결할 수 없으니 공격 표면이 줄어듭니다. 나가는 통신은 NAT 를 거쳐 가능합니다.
Q.NAT 의 목적은 무엇이고 무엇이 목적이 아닌가요?
| 목적인 것 | 내용 |
|---|
| 주소 절약 | 여러 기기가 공인 IP 하나를 공유한다 |
| 내부 구조 은닉 | 외부에서 내부 주소를 볼 수 없다 |
| 외부 접속 차단 | 등록되지 않은 연결은 들어올 수 없다 |
| 목적이 아닌 것 | 왜 |
|---|
| 암호화 | 주소만 바꾼다. 내용은 그대로 지나간다 |
| 속도 향상 | 변환 처리가 붙어 오히려 약간 느려진다 |
| 인증 | 누가 보냈는지 확인하지 않는다 |
| 방화벽 대체 | 부수적으로 막히는 것이고, 정책 기반 차단이 아니다 |
마지막이 자주 오해되는 지점입니다. NAT 뒤에 있으면 외부에서 먼저 연결할 수 없어 안전해 보이지만, 그것은 의도한 보안이 아니라 구조의 부산물입니다. 포트 포워딩을 하나 열면 그대로 노출되고, 내부에서 나가는 통신은 전혀 검사되지 않습니다.
흔한 실수: NAT 를 방화벽으로 여겨 별도 정책을 두지 않는 것. 내부 기기가 감염돼 밖으로 데이터를 보내는 것은 NAT 가 막지 않습니다.
Q.NAT 뒤의 두 사용자가 P2P 로 직접 연결하려면 무엇이 필요한가요?
양쪽 모두 외부에서 먼저 연결할 수 없으므로, 각자 자기 공인 주소를 알아내고 동시에 연결을 시도합니다.
| 단계 | 역할 |
|---|
| 1 | 각자 STUN 서버에 접속해 자기 공인 IP 와 포트를 알아낸다 |
| 2 | 그 정보를 시그널링 서버를 통해 상대에게 전달한다 |
| 3 | 양쪽이 동시에 상대 주소로 연결을 시도한다 |
| 4 | 한쪽의 시도가 NAT 표에 항목을 만들어 상대의 패킷이 들어올 수 있게 된다 |
| 5 | 실패하면 TURN 중계 서버를 거친다 |
4번이 이 방식의 핵심입니다. 내가 밖으로 보낸 패킷이 NAT 에 "이 주소와 통신 중"이라는 항목을 만들고, 그 덕분에 상대의 응답처럼 보이는 패킷이 통과합니다.
| 구성 요소 | 역할 |
|---|
| STUN | 내 공인 주소가 무엇인지 알려준다 |
| TURN | 직접 연결이 안 되면 트래픽을 중계한다 |
| 시그널링 | 주소 정보를 서로 교환하는 통로 |
NAT 종류에 따라 성공률이 다릅니다. 도착지마다 다른 포트를 쓰는 방식이면 미리 알아낸 포트가 무효라 직접 연결이 실패하고 중계로 넘어갑니다.
흔한 실수: STUN 만 두고 TURN 을 생략하는 것. 기업 방화벽이나 엄격한 NAT 환경에서는 직접 연결이 실패하고, 중계 서버가 없으면 통화가 아예 안 됩니다.
Q.VPC 서브넷을 어떻게 나누나요?
인터넷에서 직접 닿아야 하는지와 가용영역을 기준으로 나눕니다.
| 서브넷 | 두는 것 | 외부 통신 |
|---|
| 퍼블릭 | 로드밸런서, NAT 게이트웨이, 배스천 | 인터넷 게이트웨이로 직접 |
| 프라이빗 | 애플리케이션 서버 | NAT 게이트웨이를 거쳐 나가기만 |
| 데이터 | DB, 캐시 | 외부 통신 없음 |
가용영역마다 같은 구성을 반복합니다. 영역 하나가 죽어도 나머지로 서비스가 유지됩니다.
주소 범위를 정할 때 볼 것들입니다.
| 항목 | 판단 |
|---|
| 나중에 늘릴 여유 | 서브넷을 처음부터 크게 잡아 둔다. 나중에 쪼개기 어렵다 |
| 다른 네트워크와 겹치지 않게 | 회사망이나 다른 VPC 와 연결할 때 대역이 겹치면 못 붙인다 |
| 예약 주소 | 클라우드가 서브넷마다 몇 개를 가져간다 |
두 번째가 나중에 큰 문제가 됩니다. 모든 팀이 10.0.0.0/16 을 쓰면 VPC 를 서로 연결할 수 없습니다.
흔한 실수: 서브넷을 필요한 크기에 딱 맞게 잡는 것. IP 는 사설 대역이라 넉넉하고, 부족해서 다시 설계하는 비용이 훨씬 큽니다.
Q.프라이빗 서브넷의 서버가 외부 API 를 호출하려면 무엇이 필요한가요?
NAT 게이트웨이나 그에 준하는 출구가 필요합니다. 프라이빗 서브넷은 인터넷 게이트웨이로 직접 나갈 수 없습니다.
| 방법 | 내용 | 비용 |
|---|
| NAT 게이트웨이 | 관리형. 퍼블릭 서브넷에 두고 라우팅을 건다 | 시간당 요금 + 데이터 처리 요금 |
| NAT 인스턴스 | EC2 로 직접 운영 | 인스턴스 비용. 관리 부담 |
| VPC 엔드포인트 | 같은 클라우드 서비스는 내부망으로 직접 | 인터넷을 거치지 않아 값싸고 빠르다 |
| 프록시 | 나가는 트래픽을 한곳으로 모아 검사한다 | 프록시 운영 비용 |
세 번째를 자주 놓칩니다. S3 나 DynamoDB 같은 같은 클라우드 서비스를 부르는데 NAT 게이트웨이를 거치면 데이터 처리 요금이 그대로 붙습니다. 엔드포인트를 만들면 그 트래픽이 내부망으로 빠져 비용이 크게 줄어듭니다.
라우팅 설정도 함께 봐야 합니다. 프라이빗 서브넷의 라우팅 표에서 기본 경로가 NAT 게이트웨이를 가리켜야 하고, NAT 게이트웨이 자체는 퍼블릭 서브넷에 있어야 합니다.
흔한 실수: NAT 게이트웨이를 프라이빗 서브넷에 두는 것. 자기도 나갈 길이 없어 아무것도 통과하지 못합니다.
먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.
읽었으면 문제로 확인해보세요
네트워크 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.