핫스팟을 켜고 VPN을 연결하고 앱에서 포트를 열었는데도 다른 기기는 접속하지 못한다. 빠진 조각은 거의 항상 포트 자체가 아니라, 어느 기계가 대기 소켓을 가지고 있는지와 다른 기기가 어느 주소로 도달해야 하는지에 대한 답이다. 화면이 세 진입점 중 무엇을 시험 중인지 알려 주므로, 나는 휴대폰에서 바깥으로 나아간다.

서비스가 실제로 도는 지점에서 시작한다

연결을 받아야 하는 앱을 열고 그 상태 페이지를 읽는다. 대기 중이라고 적혀 있으면 어느 주소에 묶였는지 기록한다. 이 한 가지 세부가 아래 사례 대부분을 결정하기 때문이다. 127.0.0.1에 묶인 앱은 휴대폰에서만 닿을 수 있고, 핫스팟 클라이언트나 통신사 매핑, VPN 출구가 이를 바꾸지 않는다.

다음으로 어느 기기가 서비스를 실행하는지 확인한다. 휴대폰이면 그 소켓은 해당 앱의 것이고, 핫스팟 뒤의 노트북이면 대기자와 방화벽은 노트북의 것이며 휴대폰은 패킷을 전달할 뿐이다. 서로 다른 설계이고, 이것을 섞는 것이 한쪽에서 연 포트가 다른 쪽에서 아무 일도 하지 않는 이유다.

디버그 가능한 빌드에서는 adb shell이 /proc/net/tcp를 통해 소켓을 나열하지만, 대부분에게는 앱 자체의 상태가 정직한 출처다.

첫 번째 진입점: 핫스팟의 다른 기기

이것은 로컬 사례이며 가장 쉽다. 다른 기기는 자기가 게이트웨이로 보는 주소에서, 앱이 대기하는 포트로 휴대폰에 닿고, 핫스팟 밖의 무엇도 개입하지 않는다. 트래픽이 로컬 구간을 떠나지 않으므로 통신사 매핑은 필요 없다.

두 가지가 이를 깨뜨린다. 앱이 루프백에 묶여 있거나, 휴대폰의 클라이언트 정책이 로컬 연결을 허용하지 않는 경우다. 앱이 인증을 한다면 맨 TCP가 아니라 앱 자체 프로토콜로 시험한다. 받아들이고 나서 거부하는 대기자는 멀리서 보면 닫힌 포트와 같다.

서비스가 연결된 노트북에서 돌면 휴대폰의 핫스팟 주소는 목적지가 아니다. 노트북의 핫스팟 인터페이스 주소와 그곳의 대기자가 필요하다.

두 번째 진입점: 통신사 경로

이동통신망에서 휴대폰에 닿는 것은 다른 문제이고 IPv4에서는 대개 그냥 되지 않는다. 통신사는 기기를 공유 변환 뒤에 두며, RFC 6598이 바로 그런 배치를 위해 공유 주소 범위를 따로 둔 이유다. 요청하지 않은 인바운드 연결에는 도달할 매핑이 없고, 지역 설정으로 만들어 낼 수도 없다. 변환기가 내 기기가 아니기 때문이다.

루트 권한도 바꾸지 못한다. 그것은 휴대폰의 스택을 제어할 뿐 통신사의 변환기를 제어하지 않는다. 통신사가 공인 IPv6 프리픽스를 준다면 인바운드 경로가 있을 수 있지만, 대기자와 방화벽에는 여전히 명시적 허가가 필요하다.

세 번째 진입점: VPN 출구

터널이 올라와 있는 동안 사이트가 보고하는 주소는 커버된 아웃바운드 트래픽의 출구 주소다. 내 대신 인바운드 연결을 받는 주소가 아니다. 안쪽으로 쓰려면 사업자가 실제로 제공하는 기능, 예컨대 전달된 포트와 계정에 묶인 인바운드 매핑이 필요하고, 출구에서 클라이언트까지 쓸 만한 경로도 있어야 한다.

로컬 허용 규칙은 그 매핑을 만들 수 없다. 그것이 하는 일은 앱의 응답이 어느 경로로 가는지를 바꾸는 것이고, 앱이 터널에서 제외될 때 문제가 된다. 요청과 응답이 서로 다른 네트워크 문맥에 놓여 연결이 방화벽 문제처럼 실패한다.

한 경로를 끝에서 끝까지 시험하고 나서 소유자를 지목한다

시험 전에 네 가지를 적는다. 의도한 출발지, 목적지 주소, 전송 방식, 포트, 그리고 대기 소켓을 가진 기계다. 어느 요소든 추측이면 시험은 유용한 것을 알려 주지 않는다.

그다음 허용한 그 한 경로를 앱의 인증이 온전한 채로 시험한다. 모호한 주소 점검이 답하게 하려고 넓은 대기자를 공개하거나 무관한 제어를 끄지 않는다. 두 변경 모두 시험 뒤에도 남는다.

Android의 테더링 하위 시스템은 하향 트래픽을 자체 경로로 보내며 일반 VPN 캡처와 분리된다. 그래서 연결된 노트북에서 도는 브라우저는 휴대폰의 서비스로 들어오는 접근에 대해 아무것도 말해 주지 않는다. 작동한다고 말하기 전에 확인할 것:

  • 대기자는 상대가 닿을 수 있는 주소에 있고 루프백이 아니다.
  • 상대는 그 진입점의 주소를 쓰고 있으며 상태 페이지의 출구 주소가 아니다.
  • 통신사나 사업자 쪽의 매핑은 지원되는 기능이고 지역에서 추가한 규칙이 아니다.
  • 요청과 응답이 같은 네트워크 문맥을 지나고 인증도 여전히 통과한다.

관련 글