두 사무실이 모두 192.168.77.0/24를 사용하고, 누군가 하나의 네트워크가 되도록 터널을 제안한다. 이 표현은 단순하게 들리지만 서로 충돌하는 두 개의 독립 LAN, WAN 너머로 의도적으로 확장한 이더넷 세그먼트, 그리고 원격 주소를 대신해 응답하는 proxy ARP 구성이라는 세 가지 다른 설계를 숨기고 있다. 어느 것인지에 따라 호스트가 패킷을 어떻게 다루는지가 결정되고, 그 답은 VPN 게이트웨이가 관여하기 전에 보인다.

라우터보다 먼저 호스트가 결정한다

192.168.77.10/24 주소를 가진 호스트는 목적지를 자신의 프리픽스와 비교한다. 그 프리픽스 안에 있는 것은 모두 직접 링크에 있으므로 호스트는 목적지의 링크 계층 주소를 직접 해석한다. 그 밖에 있는 것은 모두 기본 게이트웨이로 간다.

이 결정은 터널이 아니라 호스트의 스택에서 일어난다. 게이트웨이에 추가한 경로로는 호스트가 애초에 보내지 않는 패킷을 구할 수 없다.

따라서 192.168.77.20이 다른 사이트에만 존재하면, 로컬 호스트는 ARP로 그것을 묻고 아무 응답도 받지 못한다. VPN 핸드셰이크는 완전히 건강한데 이 부분만 실패할 수 있다. 이 실패는 라우팅 문제가 아니라 죽은 호스트처럼 보인다. 이 징후를 알아보면 터널 디버깅 한 시간을 아낄 수 있다.

ARP는 로컬 링크의 질문이다

ARP는 이 링크에서 주소를 누가 소유하는지 묻고, 그 답은 브로드캐스트를 들을 수 있는 무언가에서 와야 한다. IPsec 터널 반대편의 라우터는 설계가 두 사이트를 하나의 브로드캐스트 도메인으로 만들지 않는 한 그것을 듣지 못한다.

같은 주소를 가진 두 장치는 상황을 더 나쁘게 만들며, 해석이 성공해도 어느 쪽이 응답했는지 알 수 없다.

중복 주소 지정은 라우팅 버그가 아니며 어떤 경로도 그것을 고치지 않는다. 사이트를 서로 다른 프리픽스로 재번호하거나, 의도적으로 하나의 링크 계층 도메인으로 만들어야 한다.

확장 세그먼트는 경로가 아니라 프레임을 나른다

브리지에 연결된 이더넷 전송 터널은 두 사이트를 하나의 링크 계층 도메인의 일부로 만든다. ARP 브로드캐스트가 반대편에 도달하고, 각 브리지는 어떤 MAC 주소가 어디에 있는지 학습한다. Linux 브리지 문서 는 그 MAC 기반 전달 경계를 설명한다.

여기서 원격 게이트웨이는 두 개의 동일한 서브넷 사이를 전혀 라우팅하지 않는다. 프레임은 스스로 IP를 라우팅하는 하부 계층을 지나고, 브리지는 이더넷 대화를 연장한다.

대가는 더 큰 영향 범위다. 알 수 없는 목적지로의 플러딩, 루프, DHCP 할당, 고유 주소 지정 모두 두 사이트를 아우르는 하나의 계획이 필요하다. WAN이 끊기면 호스트는 자신이 로컬이라고 여기는 트래픽을 잃는다. 브리지의 필터링과 VLAN 규칙으로 통과하는 것을 제한할 수 있지만, 전송은 여전히 모든 링크 로컬 제어 프레임이 도착한다고 약속하지 않는다.

proxy ARP는 세 번째 설계다

라우터는 원격 주소에 대한 ARP에 응답한 뒤 그쪽으로 라우팅할 수 있다. 이렇게 하면 브로드캐스트 도메인을 늘리지 않고도 원격 호스트가 송신자에게 직접 링크에 있는 것처럼 보인다.

브리징보다 좁은 도구로, 전달과 반환 경로, 그리고 각 주소의 명확한 소유자에 의존한다.

임의의 비IP 프로토콜을 라우팅 가능하게 만들지도 않고, 이더넷 브로드캐스트 도메인을 재현하지도 않는다. 요구 사항이 정확히 그 대체일 때 사용하고, 미뤄 둔 재번호의 지름길로 쓰지 않는다.

요구 사항에서 고르고, 그다음 검증한다

사무실 간의 일반적인 애플리케이션 접근에는 서로 다른 프리픽스와 명시적 경로가 더 분명한 경계를 준다. 요구 사항이 정말 링크 계층 인접성일 때 브리징한다. 공유 프리픽스의 유일한 이유가 아직 아무도 하지 않았다는 것이라면 재번호한다.

실제로 어떤 설계인지 확인하려면 호스트에게 목적지를 어떻게 다루는지 물어보라:

ip route get 192.168.77.20
ip neigh show 192.168.77.20

이웃 항목이 실패한 상태의 직접 링크 결과는 링크 계층 경로가 없음을 가리킨다. via 결과는 게이트웨이를 지목하고 질문을 라우팅으로 옮긴다. 브리지에서는 MAC이 터널을 넘어 학습되었는지 전달 데이터베이스를 확인한다. 각 출력은 설계 질문을 다시 시작하지 않고 좁힌다.

관련 글