9.7. 사설 네트워크와 NAT¶
IPv4는 약 40억 개의 주소를 갖도록 설계되었고, 당시에는 충분해 보였습니다. 하지만 그렇지 않았습니다. 인터넷에 연결된 모든 가정, 사무실, 공장은 내부 기기를 위한 자체 주소 블록이 필요하며, 전 세계의 카메라, 휴대폰, 가전제품을 더하면 40억 개로는 어림도 없습니다.
인터넷이 정착시킨 해결책은 사설 네트워크(private networks) 입니다. 로컬 네트워크의 대부분의 기기는 전역적으로 고유하지 않고 해당 네트워크 내부에서만 통하는 주소를 사용하며, 경계에 있는 단일 기기가 두 세계 사이를 변환합니다. 카메라는 거의 항상 이러한 사설 네트워크 중 하나에 위치합니다.
9.7.1. 사설 주소 범위¶
세 개의 IPv4 범위가 공용 인터넷에서 라우팅되지 않도록 예약되어 있습니다. 로컬 네트워크 외부의 어떤 라우터도 이 주소로 전달을 시도하지 않기 때문에, 어떤 로컬 네트워크든 누구와도 조율하지 않고 이 범위 내의 주소를 자유롭게 사용할 수 있습니다:
10.0.0.0–10.255.255.255(1600만 개 주소; 대규모 기업 네트워크에서 흔함).172.16.0.0–172.31.255.255(약 100만 개 주소; 실제로는 덜 흔함).192.168.0.0–192.168.255.255(6만 5천 개 주소; 거의 모든 가정용 라우터의 기본값).
일반적인 가정용 네트워크에서는 카메라와 그것과 통신하는 노트북이 모두 192.168.x.x 주소를 사용하는데, 이는 가정용 라우터가 자신이 호스팅하는 네트워크에 대해 선택하는 범위이기 때문입니다.
9.7.1.1. 넷마스크가 사용되는 방식¶
IP 주소 페이지에서 /24 표기법을 소개했습니다. 그것이 여기서 중요한 이유는 넷마스크가 각 기기가 패킷을 다음으로 어디로 보내야 할지 결정하는 데 사용하는 것이기 때문입니다. 카메라는 패킷을 보낼 때마다 자신의 넷마스크를 목적지 주소에 적용하고 그 결과를 봅니다:
목적지가 카메라 자신의 주소와 네트워크 비트를 공유한다면, 목적지는 동일한 로컬 네트워크 에 있습니다. 카메라는 패킷을 직접 그곳으로 보냅니다.
목적지가 네트워크 비트를 공유하지 않는다면, 그것은 다른 어떤 네트워크에 있는 것이 분명합니다. 카메라는 패킷을 기본 게이트웨이(default gateway) (링크 업 시 자동으로 구성되는 라우터)로 보내고 나머지는 게이트웨이가 처리하도록 합니다.
그 단 하나의 판정 – “우리가 네트워크 비트를 공유하는가?” – 이 바로 넷마스크의 용도입니다. 또한 가정용 네트워크가 기본적으로 /24 를 사용하는 이유이기도 합니다. 254개 기기 한도는 한 가정에 충분히 들어맞고 네트워크를 단순하게 유지합니다.
9.7.2. 네트워크 주소 변환(Network Address Translation)¶
192.168.1.50 에 있는 카메라는 공용 인터넷의 서버로 그냥 패킷을 보낼 수 없습니다 – 공용 인터넷은 192.168.x.x 로 라우팅하지 않습니다. 가정용 라우터는 네트워크 주소 변환(Network Address Translation), 즉 NAT로 이 문제를 해결하며, 그것을 투명하게 수행합니다.
NAT는 나가는 패킷의 출발지 주소를 라우터의 공용 주소로 다시 쓰고, 들어오는 응답에 대해서는 그 변환을 되돌리므로, 사설 기기들이 하나의 공용 주소를 공유하는 것처럼 보입니다.¶
라우터는 두 개의 주소를 가집니다. 로컬 네트워크상의 사설 주소(흔히 192.168.1.1)와 인터넷 서비스 제공자가 할당한 공용 주소입니다. 카메라가 공용 주소로 패킷을 보내면 라우터는
카메라의 사설 주소 + 포트를 기록하고 그것을 자신의 임시 송신 포트와 짝지웁니다;
패킷의 출발지 주소를 자신의 공용 주소로 다시 씁니다(그리고 출발지 포트는 선택된 송신 포트로);
다시 쓴 패킷을 공용 쪽으로 내보냅니다.
응답이 라우터의 공용 주소 + 포트로 돌아오면, 라우터는 그 짝을 조회하여 목적지를 다시 카메라의 사설 주소 + 포트로 다시 쓰고 로컬 쪽으로 전달합니다. 카메라는 그 변환이 일어났다는 것을 결코 알지 못하며, 서버는 원래의 출발지를 결코 알지 못합니다.
NAT는 가정용 네트워크를 실용적으로 만드는 요소입니다. 또한 알아둘 만한 두 가지 결과가 있습니다.
9.7.3. NAT가 바꾸는 것¶
나가는 통신은 쉽습니다. 사설 네트워크상의 카메라는 자유롭게 바깥으로 통신할 수 있습니다. 원격 서버로 TCP 연결을 열거나 UDP 패킷을 보낼 때마다 NAT가 자동으로 짝을 설정합니다. 대부분의 카메라 응용은 이 방향으로 동작합니다. 이미지를 캡처하여 어딘가의 서버로 푸시하고 응답을 받는 식입니다.
들어오는 통신은 어렵습니다. 공용 인터넷상의 기기는 사설 네트워크상의 카메라에 직접 연결할 수 없습니다. 요청하지 않은 패킷이 라우터의 공용 주소에 도착하면 라우터가 조회할 짝이 없으므로 그 패킷은 갈 곳이 없습니다. 라우터는 그것을 폐기하거나 라우터 자체에서 실행 중인 서비스에 넘깁니다.
들어오는 경우에 대한 세 가지 해결책이 흔히 쓰이며, 대략 실용성이 높아지는 순서대로 나열하면 다음과 같습니다:
포트 포워딩(Port forwarding). 선택한 공용 포트로 들어오는 모든 패킷을 특정 사설 기기로 보내도록 라우터를 구성합니다. 라우터에 대한 관리자 접근이 필요하며, 라우터의 공용 주소가 바뀌면 취약합니다.
VPN. 카메라를 그것에 도달해야 하는 누군가와 동일한 논리적 네트워크에 두는 가상 사설 네트워크를 운영합니다. 무겁고, 대부분의 카메라 배포에서는 범위를 벗어납니다.
나가는 통신으로 시작된 연결(Outbound-initiated connection). 카메라가 공용 인터넷 어딘가의 알려진 서버로 바깥으로 연결하고 그 연결을 열어 둡니다. 서버는 기존 연결을 사용하여 메시지를 다시 푸시합니다. 이것이 푸시 알림과 대부분의 클라우드 연결 기기 프로토콜이 동작하는 방식이며, 대부분의 카메라 응용이 결국 사용하게 되는 패턴입니다.
NAT는 카메라의 Python 코드에는 보이지 않습니다. 스크립트는 그저 필요한 목적지와 통신하면 되고, 라우터가 보이지 않는 곳에서 변환을 처리합니다. 하지만 연결의 방향 은 중요하며, NAT가 바로 “카메라가 클라우드 서버로 손을 뻗는 것”이 “클라우드 서버가 카메라 안으로 손을 뻗는 것”보다 훨씬 쉬운 형태인 이유입니다.