LabHub

네트워크 기초 — 리눅스 VM 에서 손으로 · 주소·서브넷·ARP · 이론

이웃인가 아닌가 — 주소·마스크·ARP

LabHub 에서 이어서 보기

한 줄 요약

패킷을 보내기 전에 커널이 하는 첫 판단은 "상대가 같은 서브넷인가" 다. 같으면 ARP 로 상대의 MAC 을 직접 묻고, 아니면 게이트웨이의 MAC 으로 보낸다. 마스크 한 비트가 그 갈림길이다.

왜 이게 필요했나

IP 주소는 어디에 있는지를 말하는 논리 주소이고, 프레임을 실제로 배달하는 것은 NIC 에 박힌 MAC 주소다. 둘은 아무 관계가 없다. 그래서 같은 케이블(같은 L2)에 붙은 상대에게 보내려면 "이 IP 를 가진 사람, MAC 이 뭐야?" 를 물어야 하고, 그것이 ARP 다. 답은 이웃 테이블(ARP 캐시)에 잠시 남는다.

문제는 같은 케이블에 없는 상대다. 브로드캐스트는 링크를 넘지 못하므로 ARP 로 찾을 수 없다. 그래서 커널은 마스크로 "같은 서브넷인가" 를 먼저 판정하고, 아니면 라우팅 테이블에서 게이트웨이를 찾아 게이트웨이의 MAC 으로 프레임을 만든다. 게이트웨이가 반드시 같은 서브넷에 있어야 하는 이유가 이것이다 — 그 MAC 을 물어볼 수 있어야 하니까.

어떻게 동작하나

192.168.1.77/25 에서 192.168.1.130 으로 보낸다고 하자. /25 는 앞 25비트가 네트워크라 128 에서 갈린다. 77 은 0~127 블록, 130 은 128~255 블록이다. 다른 서브넷이므로 커널은 게이트웨이를 찾는다. 같은 두 주소를 /24 로 두면 같은 블록이 되어 ARP 로 직접 묻는다. 주소는 하나도 안 바뀌었는데 마스크 한 비트로 경로가 완전히 달라진다.

ARP 요청은 목적지 MAC 이 ff:ff:ff:ff:ff:ff 인 브로드캐스트다. 자기 IP 를 본 호스트만 유니캐스트로 답한다. 커널은 답을 이웃 테이블에 넣고(REACHABLE), 잠시 안 쓰면 STALE 로 바꾸고, 다음에 쓸 때 다시 확인한다. nud permanent 로 정적 항목을 박으면 커널은 그것을 갱신하지 않는다 — 그래서 틀린 MAC 을 박으면 IP 도 라우팅도 멀쩡한데 통신만 조용히 죽는다. 상대 NIC 이 "내 것이 아니다" 로 버릴 뿐 아무 오류도 되돌아오지 않기 때문이다.

현장에서 만나는 모습

마스크 오타. 새 서버에 /24 를 /16 으로 적었다. 같은 /24 안의 통신은 잘 된다. 그런데 옆 대역(같은 /16 안의 다른 /24)으로 가는 패킷을 커널이 "같은 서브넷" 으로 보고 ARP 를 보내는데 답이 없다. 게이트웨이를 거치면 될 것을 직접 찾다가 실패하는 것이다. 증상은 "일부 대역만 안 됨" 이고, ip neigh 에 FAILED 항목이 쌓여 있는 것이 단서다.

IP 중복. 두 장비가 같은 IP 를 가지면 ARP 답이 둘이 오고 나중 것이 이긴다. 통신이 됐다 안 됐다 한다. 이웃 테이블의 MAC 이 바뀌는 것을 잡으면 원인이 보인다.

다음 실습에서 할 것

ip -br·ip -j 로 인터페이스와 주소를 읽고, ipcalc 와 파이썬으로 서브넷을 계산하고, 더미 인터페이스에 주소를 붙여 본다. 그다음 네임스페이스 둘을 veth 로 이어 ARP 요청과 응답을 tcpdump 로 잡고, 정적 항목에 틀린 MAC 을 넣어 통신이 죽는 것을 눈으로 본다.