IP 주소와 서브넷 — 어디까지가 우리 동네인가
한 줄 요약
IP 주소는 네트워크 부분과 호스트 부분으로 나뉘고, 그 경계를 정하는 것이 서브넷 마스크이며, 이 경계가 "직접 보낼 수 있는 상대"와 "게이트웨이에 맡겨야 하는 상대"를 가른다.
왜 이게 필요했나
전 세계의 모든 호스트를 한 표에 담을 수는 없다. 라우터가 40억 개의 항목을 뒤질 수는 없기 때문이다. 그래서 주소에 계층을 넣었다. 앞부분이 같은 주소들을 한 덩어리로 묶어 "이 덩어리는 저쪽으로"라고 한 줄에 적을 수 있게 만든 것이다.
192.168.10.37/24 인 호스트가 192.168.10.80 과 8.8.8.8 로 각각 보낸다고 하자. 판단은 마스크를 씌운 결과를 견주는 것뿐이다.
- 마스크를 씌운다목적지와 내 주소의 앞 24비트를 견준다. 192.168.10.80 은 네트워크 부분이 192.168.10.0 으로 같고, 8.8.8.8 은 다르다.
- 같으면 직접 보낸다ARP 로 상대의 MAC 주소를 알아내 그 MAC 으로 프레임을 보낸다. 라우터를 거치지 않는다.
- 다르면 게이트웨이에 맡긴다프레임의 목적지 MAC 은 기본 게이트웨이의 것이다. IP 헤더의 목적지는 끝까지 8.8.8.8 그대로다.
여기서 구분할 것 게이트웨이로 보낸다는 말은 IP 목적지를 게이트웨이로 바꾼다는 뜻이 아니다. 바뀌는 것은 링크 계층의 목적지뿐이다.
잠깐, 예측해 보세요 같은 스위치에 꽂힌 두 호스트가 서로 다른 서브넷으로 설정돼 있다. 둘은 서로 직접 프레임을 주고받을까?
설명 확인 · 채점 없는 자가 점검
아니다. 각자 마스크를 씌워 보면 상대가 다른 네트워크라 게이트웨이로 보낸다. 게이트웨이가 없으면 아예 나가지 못한다. 물리적으로 옆에 있어도 판단은 주소와 마스크로만 한다.
어떻게 동작하나
192.168.10.37/24 에서 /24 는 앞 24비트가 네트워크 부분이라는 뜻이다. 즉 네트워크는 192.168.10.0, 호스트 부분은 마지막 8비트다.
- 사용 가능한 주소는 2의 8승에서 네트워크 주소와 브로드캐스트 주소를 뺀 254개다.
/25로 쪼개면 절반씩 두 개, 각각 126개가 된다./30은 4개 중 2개만 쓸 수 있어 라우터끼리 잇는 링크에 쓰인다.
호스트가 패킷을 보낼 때의 판단은 단순하다. 목적지 주소와 자기 주소에 각각 마스크를 씌워 네트워크 부분이 같으면 같은 네트워크이므로 ARP 로 상대의 MAC 주소를 알아내 직접 보낸다. 다르면 기본 게이트웨이의 MAC 주소로 보낸다. 이때 IP 헤더의 목적지는 최종 목적지 그대로이고 링크 계층의 목적지만 게이트웨이라는 점이 핵심이다.
라우터의 판단은 최장 접두사 일치(longest prefix match) 다. 라우팅 테이블에 10.0.0.0/8 과 10.1.2.0/24 가 둘 다 있고 목적지가 10.1.2.5 라면 더 구체적인 /24 쪽을 고른다. 기본 경로 0.0.0.0/0 은 접두사 길이가 0 이므로 언제나 마지막 후보다.
사설 주소 대역(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)은 인터넷에서 라우팅되지 않는다. 그래서 밖으로 나갈 때 NAT 가 출발지 주소를 공인 주소로 바꾸고, 포트 번호로 어느 내부 호스트의 연결인지 기억한다. NAT 가 상태를 갖는다는 사실에서 여러 결과가 따라온다. 밖에서 안으로 먼저 연결을 걸 수 없고, 오래 조용한 연결은 NAT 표에서 지워져 끊긴다. 유휴 연결이 몇 분 뒤 조용히 죽는 현상의 흔한 원인이다.
현장에서 만나는 모습
쿠버네티스 클러스터를 만들 때 파드 CIDR, 서비스 CIDR, 노드 네트워크가 겹치면 라우팅이 조용히 망가진다. 겹친 구간의 트래픽이 엉뚱한 곳으로 가고, 증상은 "어떤 파드끼리만 통신이 안 된다"처럼 산발적으로 나타난다. 대역 설계는 클러스터를 만들기 전에 종이에 적어 두는 편이 낫다. 나중에 바꾸려면 클러스터를 다시 만들어야 하는 경우가 많다.
설명용 예시다. 노드 네트워크가 10.0.0.0/16 인데 파드 대역을 10.0.1.0/24 로 잡아 두 경로가 함께 표에 올라가 있다.
- 목적지 10.0.1.7, 원래는 노드/16 과 /24 가 모두 맞지만 최장 접두사 일치로 /24 가 이긴다. 노드로 가야 할 패킷이 파드 쪽 경로로 빠진다.
- 목적지 10.0.2.7, 겹치지 않는 구간/16 하나만 맞으므로 정상적으로 노드 네트워크로 간다. 그래서 장애가 일부 주소에서만 보인다.
여기서 구분할 것 라우터는 규칙대로 동작했다. 틀린 것은 대역 설계다. 오류 메시지 없이 어떤 대상끼리만 통신이 안 되는 산발적인 증상이 여기서 나온다.
잠깐, 예측해 보세요 새 클러스터에서 어떤 파드끼리만 통신이 안 된다. 방화벽 규칙부터 뒤져야 할까?
설명 확인 · 채점 없는 자가 점검
그 전에 노드·파드·서비스 대역을 종이에 나란히 적어 겹치는지 본다. 겹쳤다면 규칙을 고칠 일이 아니라 대역을 옮겨야 한다. 파드·서비스 대역은 바꾸려면 클러스터를 다시 만들어야 하는 경우가 많아, 처음에 적어 두는 편이 싸다.
이어지는 퀴즈에서 확인할 것
마스크로 네트워크를 계산하고, 최장 접두사 일치로 다음 홉을 고르는 과정을 따라갈 수 있는지 확인한다.