IPv4와 IP 주소 고갈
인터넷에 연결돼 있는 기기에게 IP 주소를 할당할 때는 각 기기마다 고유한 주소를 할당하는 것이 기본입니다. 그래야 기기를 식별할 수 있기 때문이죠. 하지만, 현재 사용 중인 IPv4는 2^32개, 약 43억 개의 주소만 할당할 수 있습니다. 인터넷에 연결되는 기기 대수가 폭발적으로 증가하면서 IPv4 주소는 2011년에 마지막 블록을 할당한 뒤 고갈되었습니다.
이런 상황에서 퍼블릭 하게 공개된 기기들이 고유한 IP 주소를 할당받지 못하는 것을 최대한 늦추기 위해 독립된 사내 네트워크 내에선 private IP를 사용하고 있습니다. priavte IP는 RFC 1918에 정의되어 있는, 기타 네트워크와 연결되지 않은 사설망에서 사용할 수 있는 IP 주소입니다. 다른 네트워크와 연결돼 있지 않기 때문에 다른 네트워크에 존재하는 IP 주소와의 중복 여부를 신경 쓰지 않고도 사용할 수 있습니다. RFC1918에 따르면 private IP 주소는 다음과 같이 사용 범위가 제한됩니다.
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
private IP가 IP 주소 고갈을 어느 정도 막았지만 인터넷에 연결해 다른 네트워크로 패킷을 보낼 수 없다는 문제가 있습니다. 이를 해결하기 위해 NAT(Network Address Translation)이 도입되었습니다.
NAT(Network Address Translation)
NAT는 단어 그대로 주소를 바꿔주는 기능입니다. 이 기능은 통상적으로 라우터가 수행하며 subnet을 빠져나올 때 처음으로 마주치는 라우터가 private IP를 라우터에 할당된 public IP로 바꾸는 방식으로 동작합니다. 여기서 단순히 IP 주소만 바꿔준다면 문제가 발생합니다. 송신이야 문제가 안되지만, 라우터가 패킷을 수신했을 때, 뒷단에 있는 호스트들 중 어떤 호스트로 패킷을 전달해야 할지 판단하지 못합니다. 그래서 라우터는 송신해야 할 패킷이 도착하면 private IP 주소를 자신의 public IP 주소로 바꿈과 동시에 port 역시 바꿉니다. 그 뒤, 바꾸기 전의 private IP와 port를 바꾼 뒤의 public IP와 port 쌍과 매핑 시켜 하나의 테이블에 저장합니다. 패킷이 외부로부터 라우터에 도착한다면 테이블에 존재하는 기록을 이용해 public IP와 port를 다시 private IP와 원래 포트로 바꿔줍니다.
NAT와 서버
위 NAT 설명에서 NAT 라우터에 존재하는 테이블은 NAT 뒷단에 있는 호스트의 패킷이 도착했을 때 작성된다고 했습니다. 그러면 만약 서버들이 NAT 뒷단에 존재한다면, 클라이언트가 우선적으로 외부에서 패킷을 보내야 할 텐데, 어떻게 NAT가 서버까지 패킷을 전달할 수 있을까요? 이 문제를 해결하는 방법은 간단합니다. 그냥 미리 기록해 놓습니다. 그러면 클라이언트에서 패킷이 도착했을 때 priavet IP를 사용하는 서버에게 원활히 패킷을 전달할 수 있습니다.