경로를 추가하고 터널이 올라오지만, 반대편으로의 ping은 «network unreachable»이 아니라 완전한 손실로 죽는다. 이 차이는 중요하다. 시선을 라우팅 테이블에서 주소 자체로 옮기기 때문이다. 169.254 목적지는 링크 로컬이며 그 범위는 설계상 첫 홉에서 끝난다. 설정 오류가 아니다.

이어지는 결정은 좁지만 분명히 내릴 가치가 있다. 서버 쪽 서브넷을 고치거나, 2계층 세그먼트를 넓혀 주소가 다시 로컬한 의미를 갖게 하는 것이다. 더 넓은 경로를 추가하는 것을 포함해 나머지는 같은 실패를 더 많은 목적지에 적용할 뿐이다.

이 주소는 경로가 없는 것이 아니라 라우팅될 수 없다

IPv4 링크 로컬 주소는 더 나은 응답이 없을 때 스스로를 할당한다. Windows의 자동 개인 주소 지정이 여기서 나온다. 이 범위는 모든 링크에서 동시에 쓰이며, 그래서 동작한다. 같은 세그먼트의 두 호스트는 아무런 조정 없이 대화할 수 있다.

같은 성질 때문에 라우터는 이 패킷을 네트워크 사이로 전달해서는 안 된다. 링크 로컬 목적지로 향한 패킷을 받아 다른 인터페이스로 내보내면 모호함이 생긴다. 송신자의 «로컬»과 수신자의 «로컬»이 다른 장소이기 때문이다. 어느 쪽을 뜻했는지 판정할 조회는 없다. 여기서 전달은 관리자가 켤 수 있는 정책 선택이 아니며, 주소 클래스가 그것을 배제한다.

따라서 169.254.1.10을 터널을 통해 도달 가능하다고 설치하는 게이트웨이는 주소 형식이 금지한 일을 커널에 요구한다. 패킷은 원격 호스트에 도달하기 훨씬 전에 버려지고, 경로의 정밀함은 그 결과를 바꾸지 않는다.

터널이 범위 문제를 드러내는 이유

TUN 인터페이스는 두 피어 사이로 IP 패킷을 나르며 뒤에 공유 세그먼트가 없다. 브로드캐스트도, 반대편을 위한 ARP도, 링크 로컬 목적지를 링크 계층 주소로 풀어 줄 이웃 탐색도 없다.

무엇을 찾아야 하는지 알면 증상은 정확히 맞아떨어진다. 경로는 테이블에 있고, ping은 도달 불가가 아니라 완전한 손실을 보고하며, 이웃 테이블은 불완전하거나 실패한 항목을 보여 준다. 터널에서의 캡처는 패킷이 나가는 모습을 보여 주고, 사람들은 주소 클래스가 아니라 먼 쪽 끝을 보게 된다.

Windows에는 같은 뿌리를 가진, 겉보기에 무관한 두 번째 증상이 있다. 링크 로컬 주소만 남은 어댑터에는 쓸 만한 게이트웨이가 없어 네트워크 식별이 연결을 분류하지 못하고 방화벽 프로필이 공용으로 떨어진다. 원인은 터널이 아니라 주소다.

세 가지 질문으로 결정하라

서브넷을 고칠지 링크를 브리지할지의 선택은 세 조건에 달려 있고, 그중 어느 하나만으로도 설정 파일을 열기 전에 결정될 수 있다.

QuestionIf yesIf no
Can the far-side host be given a routable address?Change the host or fix DHCP and route normallyContinue to the next question
Does the device accept a static address at all?Assign one from the site's real prefixBridging is the only remaining option
Can you accept broadcast crossing the tunnel?A bridge is viable for a small segmentReplace the device or accept no remote access

대부분의 사례는 첫 질문에서 멈춘다. 링크 로컬 주소를 보이는 호스트는 보통 DHCP가 응답하지 않았거나, 케이블이나 VLAN이 잘못됐거나, 누군가 주소를 직접 입력했다는 뜻이다. 그것을 고치는 편이 어떤 터널 작업보다 싸고, 이 클라이언트만이 아니라 앞으로의 모든 클라이언트에서 문제를 없앤다.

무언가를 가정하기 전에 서버 쪽을 확인하라. 호스트에서 ip addr show와 ip route를, 클라이언트에서 arp -n 또는 route print -4를 실행해 프리픽스가 실제로 있는지 오래된 항목만 그렇게 주장하는지 본다.

브리지가 옳은 답일 때의 비용

물리 어댑터를 TAP 어댑터와 브리지하면 원격 클라이언트가 로컬 브로드캐스트 도메인의 일부가 된다. 그러면 브로드캐스트와 이웃 탐색이 동작하고, 클라이언트가 실제로 그 링크에 로컬이므로 링크 로컬 주소가 다시 의미를 갖는다.

비용은 실제이며 누군가 동의하기 전에 말해야 한다. 브로드캐스트 트래픽이 터널을 지나고, 클라이언트는 필요한 서비스만이 아니라 모든 목적으로 로컬 세그먼트에 노출되며, 서버는 이제 패킷을 라우팅하는 대신 프레임을 전달해야 한다. 실험실 벤치나 라우팅 가능한 설정 경로가 없는 장치에는 합당한 교환이고, 원격 접속에는 나쁜 기본값이다.

브리지할 때는 두 절반이 모두 필요하다. 서버의 브리지와, 어떤 목적지가 반대편에 있는지 알려 주는 클라이언트 프로필의 경로다. 브리지만으로는 클라이언트가 추측하게 되고, 경로만으로는 주소 클래스를 고칠 수 없다.

관련 글