어댑터는 255.255.255.255를 표시하고, 사람들은 흔히 VPN이 정확히 한 주소에만 도달한다고 결론짓는다. 그 해석은 클라이언트 자신의 주소를 터널을 통해 라우팅되는 목적지 집합과 혼동한다. 지점 간 인터페이스나 라우팅되는 인터페이스에서 이 둘은 다른 객체이며, 도달 가능성을 제한하는 것은 둘 중 하나뿐이다. 이 신화가 살아남는 이유는 마스크가 사람들이 이더넷에서 배운 서브넷 마스크처럼 보이기 때문이다.

신화: 호스트 마스크는 도달 가능한 호스트 하나를 뜻한다

/32 할당은 인터페이스에 링크의 이쪽 끝이 어느 주소인지 알려 주며, 지점 간 링크에서는 그것이 전부다. 상대 주소는 별도의 필드이고, 상대 너머에 무엇이 있는지 말하는 경로는 다시 별개다. 마스크 안에는 원격 네트워크를 설명하는 것이 없는데, 원격 네트워크는 마스크에서 설명되는 것이 아니기 때문이다. 그것을 도달 한계로 읽는 것은 자기 집 번호를 방문할 수 있는 모든 주소의 목록으로 읽는 것과 같다.

혼동에는 실제 뿌리가 있다: 이더넷에서는 호스트 마스크가 정말로 그 세그먼트의 단일 주소를 뜻했을 것이다. 터널은 이더넷 세그먼트가 아니며, 그 안으로 무엇이 지나가는지는 마스크가 아니라 클라이언트의 라우팅 테이블이 결정한다. 그래서 같은 /32가 데이터 센터 전체 앞에 놓일 수 있다.

주소와 경로를 별개의 객체로 읽는다

인터페이스와 테이블을 함께 출력한 다음, 두 질문에 대한 두 답으로 읽는다. 주소는 이쪽 끝이 누구인지 답하고, 경로는 트래픽이 어디로 갈 수 있는지 답한다. 세 번째 질문인 게이트웨이가 어떤 목적지를 허용하는지는 클라이언트에서 전혀 보이지 않는다. iproute2 주소 참조가 로컬 주소, 상대, 프리픽스 경로 필드를 따로 설명하는 이유가 바로 여기에 있다.

ip addr show tun0
ip route show
ip route get 10.60.5.10

윈도우에서도 주소 목록과 라우팅 테이블 사이에 같은 분리가 있으며, 조회 명령이 특정 목적지에서 어느 쪽이 이기는지 가장 빨리 보여 준다. 조회가 터널 인터페이스를 반환하면 클라이언트는 패킷을 그쪽으로 보낸다. 물리 어댑터를 반환하면 클라이언트는 VPN에 묻지 않으며, 서버 쪽 권한으로는 그것을 바꿀 수 없다. 일반적인 공용 주소가 아니라 실제로 필요한 목적지를 확인해야 한다.

Get-NetIPAddress -InterfaceAlias "VPN"
Find-NetRoute -RemoteIPAddress 10.60.5.10

조회가 잘못된 인터페이스를 가리키면 멈춘다. 그것은 클라이언트의 라우팅 문제이며 클라이언트에서 고친다.

마스크를 넓히면 대개 더 나빠지는 이유

사무실 LAN처럼 보이게 하려고 할당을 /24로 바꾸면 링크에 프리픽스가 생길 수 있다: 커널은 이제 /24 전체가 터널 인터페이스에 직접 연결되어 있다고 믿는다. 게이트웨이를 통해 라우팅되어야 할 주소로 가는 트래픽은 그때 링크에 이웃이 있는 것처럼 전송된다. 결과는 서버 장애처럼 보이는 블랙홀이다.

그것은 진짜 문제인 빠진 경로나 게이트웨이의 빠진 권한도 가린다. 둘 다 더 넓은 마스크가 만들어 주지 않으며, 둘 다 변경 후에도 남는다. 설계가 인터페이스에 더 큰 프리픽스를 요구한다면, 그것은 사용 중인 인터페이스 모델에 대한 결정이며 문서를 손에 들고 내려야 한다. 다른 제품의 스크린샷에서 마스크를 복사하는 것은 그 결정이 아니다.

원격 프리픽스 경로가 빠져 있다면 그 프로비저닝을 고친다. 그것이 있는데도 연결이 계속 거부된다면, 마스크는 진단이 아니었다.

경로가 맞는데도 흐름이 실패할 때

올바른 경로는 클라이언트가 패킷을 보낼 것이라는 점만 증명한다. 게이트웨이는 여전히 목적지를 받아들여야 하고, 할당된 주소에 대한 반환 경로가 있어야 하며, 서비스가 흐름을 허용해야 한다. 이 세 가지를 따로 시험한다: 클라이언트의 조회, 게이트웨이의 허용 범위, 필요한 서버 하나로의 요청. 세 가지가 갖춰지기 전에 인증이 성공하는 것은 정상이며, 그래서 연결된 클라이언트도 아무 데도 닿지 못할 수 있다.

ping -c1 10.60.5.10
traceroute -n 10.60.5.10
curl -sv https://app.internal.example/ -o /dev/null

네트워크 객체와 그룹 권한은 장비가 관리하는 서비스에서 소유자와 함께 둔다. 클라이언트에게 도달하라고 말하는 대상과 그것이 사용하도록 허용된 대상은 다른 설정이며, 흔히 다른 화면에 있다. 하나를 바꾸고 다른 하나를 시험하는 것이 티켓이 두 팀 사이를 오가는 방식이다.

은퇴시켜야 할 신화는 마스크가 도달 한계라는 것이다. 주소, 경로, 게이트웨이 정책을 세 가지 별개의 사실로 읽으면 /32는 더 이상 제한처럼 보이지 않고 정상적인 터널 할당처럼 보이기 시작한다.

관련 글