← Posts

Network · NAT · IP

내 컴퓨터는 왜 직접 안 닿나 - NAT

집 안 기기 수십 개가 공인 IP 하나를 나눠 쓴다. 공유기가 나갈 때 주소를 바꿔치기하고 돌아올 때 되돌리는 NAT 덕이다. 이게 IPv4 부족을 버티게 하는 동시에, 왜 밖에서 내 기계를 직접 못 부르는지도 설명한다.

목차
  1. 사설 주소는 밖에서 안 통한다
  2. 공유기가 여럿을 하나로 묶는다
  3. NAT: 주소를 바꿔치기한다
  4. 돌아오는 답을 어떻게 맞게 보내나
  5. 그래서 IPv4 부족을 버틴다
  6. 밖에서 안으로는 먼저 못 건다
  7. 이게 방화벽 같은 효과도 낸다
  8. 실무에서: NAT 뒤의 진짜를 찾는다
  9. 정리

내 노트북의 주소는 192.168.0.5인데, 인터넷 저편에서 이 주소로는 나를 못 찾는다. 사설 주소는 집 안에서만 통하기 때문이다. 그런데도 인터넷은 잘 된다. 그 사이를 잇는 게 NAT다.

사설 주소는 밖에서 안 통한다

IP 글에서 사설 주소(192.168.x.x 같은)는 집·회사 안에서만 통한다고 했다. 같은 192.168.0.5를 전 세계 수많은 집이 동시에 쓴다. 그러니 인터넷 저편에서 “192.168.0.5로 보내라”는 건 뜻이 없다 - 어느 집의 것인지 알 수 없으니까.

그런데 내 노트북은 사설 주소만 가지고도 웹을 잘 쓴다. 어떻게? 나갈 때와 들어올 때 주소를 바꿔치기하는 장치가 중간에 있다.

공유기가 여럿을 하나로 묶는다

그 장치가 집의 공유기(라우터) 다. 공유기는 두 얼굴을 가진다 - 안쪽으론 집 안 기기들에게 사설 주소를 나눠주고, 바깥쪽으론 통신사가 준 공인 IP 하나를 가진다.

diagramdiagram

집 안 기기가 몇이든, 인터넷에서 보이는 건 공유기의 공인 IP 하나다. 여럿이 그 하나를 나눠 쓴다. 이 나눠 쓰기를 가능케 하는 게 NAT다.

NAT: 주소를 바꿔치기한다

NAT(Network Address Translation) 는 이름 그대로 주소 변환이다. 패킷이 집을 나갈 때, 공유기가 겉면의 출발지 주소를 사설 → 공인으로 바꿔친다.

plaintext
나갈 때:  [출발: 192.168.0.5]  →  공유기  →  [출발: 공인IP]  →  인터넷

그래서 인터넷 저편의 서버는 내 사설 주소를 아예 모른다. 공유기의 공인 IP에서 온 걸로 본다. 답장도 그 공인 IP로 온다. 가상 메모리가 가상 주소를 물리 주소로 바꿔치던 것과 닮은 발상이다 - 안에서 쓰는 주소와 밖에서 보이는 주소가 다르다.

돌아오는 답을 어떻게 맞게 보내나

여기서 문제가 하나 생긴다. 노트북·폰·TV가 다 같은 공인 IP로 나갔는데, 답장이 오면 그게 누구 것인지 어떻게 아나. 공인 IP만 봐선 셋을 구분 못 한다.

답은 포트다. 공유기는 패킷을 내보낼 때 “어느 사설 주소·포트어느 공인 포트로 나갔는지”를 표로 적어둔다.

plaintext
공유기의 변환표
  192.168.0.5:51000  ↔  공인IP:40001   (노트북)
  192.168.0.6:52000  ↔  공인IP:40002   (폰)

답장이 공인IP:40001로 오면, 표를 보고 “아, 이건 노트북(192.168.0.5:51000)의 것”이라며 사설 주소로 되돌려 전달한다. IP+포트 한 쌍이 대화를 유일하게 식별하던 그 성질을, NAT가 여기서 써먹는다.

그래서 IPv4 부족을 버틴다

이게 IPv4 주소 부족을 버티는 핵심 방법이다. 집마다 기기가 수십 개라도, 인터넷이 보는 공인 IP는 집당 하나면 된다. 수십억 기기가 각자 공인 IP를 가질 필요 없이, 사설 주소를 쓰며 공인 IP를 여럿이 나눠 쓰니 주소가 훨씬 덜 든다.

NAT가 없었다면 IPv4는 진작 완전히 동났을 것이다. 근본 해결은 IPv6지만, 전환이 느린 동안 NAT가 시간을 벌어주고 있다.

밖에서 안으로는 먼저 못 건다

NAT엔 중요한 성질이 하나 딸려온다. 변환표는 안에서 밖으로 나갈 때 만들어진다. 그래서 답장은 표가 있어 돌아올 수 있지만, 밖에서 먼저 거는 연결은 표가 없어 어디로 보낼지 모른다.

plaintext
안 → 밖:  나가며 표를 만듦 → 답장 돌아옴 ✓
밖 → 안:  표가 없음 → 어느 기기? 모름 → 못 감 ✗

그래서 인터넷에서 내 노트북을 직접 부를 수 없다. 내가 먼저 나가야만 통로가 열린다. 집에 서버를 띄워 밖에서 접속하게 하려면, 공유기에 “이 공인 포트로 오면 이 사설 기기로 보내라”를 수동으로 적어줘야 한다 - 이게 포트 포워딩이다.

이게 방화벽 같은 효과도 낸다

이 “밖에서 먼저 못 건다”는 성질은 뜻하지 않은 보호막이 된다. 집 안 기기들이 인터넷에 직접 노출되지 않으니, 밖에서 함부로 두드릴 수가 없다. 내가 먼저 연 통로로만 오갈 수 있다.

물론 이건 방화벽을 대신하진 않는다 - NAT의 부수 효과일 뿐, 보안을 위해 설계된 게 아니다. 하지만 결과적으로 사설망 안쪽을 한 겹 가려주는 역할을 한다.

실무에서: NAT 뒤의 진짜를 찾는다

  • 로그의 IP가 다 같다 - NAT 뒤 수많은 사용자가 같은 공인 IP로 보이기도 한다(회사·통신사 NAT). “이 IP를 차단”했다가 무관한 사용자까지 막을 수 있다.
  • 진짜 클라이언트 IP는 헤더로 - 프록시나 NAT를 여러 겹 지나면 원래 IP가 가려진다. 그래서 원래 IP를 별도 헤더로 전달해(IP 글의 그 이유) 로그·접근제어에 쓴다.
  • 집·사내 서버 공개는 포트 포워딩이나 터널 - NAT 안쪽 서버를 밖에 열려면 포트 포워딩을 걸거나, 안에서 밖으로 먼저 연결을 맺어 통로를 유지하는 방식(터널)을 쓴다.

정리

  • 사설 주소는 집 안에서만 통해, 밖에선 뜻이 없다 - 그런데도 통하는 건 NAT 덕이다.
  • 공유기가 나갈 때 출발지를 사설 → 공인으로 바꿔치고, 돌아올 때 포트로 누구 것인지 구분해 되돌린다.
  • 그래서 여럿이 공인 IP 하나를 나눠 써, IPv4 부족을 버틴다.
  • 변환표가 나갈 때만 생겨 밖에서 먼저는 못 걸고(포트 포워딩 필요), 그 성질이 부수적 보호막이 된다.

다음 글은 시리즈를 닫으며, 지금까지의 밑단을 통째로 이어 주소창 한 줄이 화면이 되기까지의 여정을 따라간다.

관련 글