포터블은 설치 프로그램을 설명하는 말이지 커널을 설명하는 말이 아니다. 클라이언트는 USB 스틱 위의 단일 실행 파일로 와도 첫 패킷이 움직이기 전에 터널 장치, 라우팅 테이블 항목, 리졸버 쓰기를 여전히 필요로 할 수 있다. 대상 머신이 이 셋 중 무엇을 건드리게 허용하느냐가 그 빌드가 거기서 아예 동작하는지를 결정한다. 아래 점검들은 클라이언트가 마주치는 순서대로 질문에 답한다.

포터블은 서로 다른 세 가지 약속을 덮으며, 무료인 것은 하나뿐이다

설치 프로그램이 없다는 것은 공급업체가 서비스를 등록하지 않고, 제거 프로그램을 보내지 않고, 메뉴 항목을 추가하지 않았다는 뜻이다. 관리자가 없다는 것은 일반 계정이 클라이언트를 시작하고 연결을 끝낼 수 있다는 뜻이다. 호스트 변경이 없다는 것은 종료한 뒤 머신이 똑같아 보인다는 뜻이다. 포터블이라고 말하는 다운로드 페이지는 보통 그중 첫 번째만 약속하며, 나머지 둘이 배포가 실패하는 지점이다. 빌드는 읽기 전용 매체에서 점 파일 쓰기 없이 실행된다는 좁은 의미에서도 포터블일 수 있지만, 네트워크 스택에 대해 여전히 아무것도 말해 주지 않는다.

비싼 약속은 두 번째와 세 번째다. 어댑터, 경로, 리졸버 쓰기를 필요로 하는 단일 실행 파일은 포터블이라는 꼬리표가 한 번도 덮지 않았던 권한을 운영 체제에 요구한다.

클라이언트가 호출할 특권 도우미를 찾아라

거의 어떤 VPN 클라이언트도 스스로 패킷을 옮기지 않는다. Windows에서는 데이터 경로가 WFP 필터와 Base Filtering Engine을 지나고, macOS에서는 사용자가 시스템 설정에서 승인하는 NetworkExtension 공급자를 지나며, Linux에서는 tun 장치와 라우팅 스택을 지난다. 복사한 바이너리는 그 구성 요소들을 위한 제어 표면이며, 그들의 대체물이 아니다. 클라이언트가 어떤 구성 요소를 기대하는지 묻고, 그것이 설치되어 있고 실행 중이며 계정에서 쓸 수 있는지 확인하라.

Linux는 점검이 시스템 호출 하나이기 때문에 이 점을 증명하기 가장 쉬운 곳이다. /dev/net/tun을 열고 커널에 장치를 요청하려면 CAP_NET_ADMIN이 필요하며, 커널 TUN/TAP 문서 는 소유 규칙과 기능을 모두 밝힌다. 점검은 클라이언트를 실행할 계정으로 수행하고 root로 하지 않는다.

ls -l /dev/net/tun
ip tuntap add dev vpntest mode tun
ip link delete vpntest

가운데 줄의 권한 오류가 바로 찾던 답이다: 이 계정은 터널 인터페이스를 만들 수 없으므로 그것이 필요한 모든 사용자 공간 클라이언트는 다운로드가 아니라 연결에서 실패한다. 마지막 줄은 테스트 장치를 제거하고 잘 되면 아무것도 출력하지 않는다. 두 줄이 모두 성공하면 호스트는 영구적으로 아무것도 바꾸지 않았다.

첫 연결 전에 경로와 리졸버 변경을 시험하라

분할 터널은 연결을 라우팅 결정으로 만들고, 전체 터널은 그것을 기본 경로 교체로 만든다. 둘 다 호스트 네트워크 스택에 대한 쓰기이며, 클라이언트 자체가 깨끗하게 시작해도 특권 없는 계정에서는 둘 다 실패한다. 리졸버는 세 번째 쓰기이며, systemd 호스트에서는 보통 마지막에 깨지는 것이 그것이다. 승격된 설치를 어디에 쓸지 결정할 때 이 순서가 중요하다.

경로 점검에는 정말로 신경 쓰는 목적지가 필요하므로, 아래 자리 표시자 대신 자기 프로필의 서브넷을 넣어라. 경로가 무언가에 붙으려면 장치 이름이 존재해야 한다.

ip route add 10.20.0.0/16 dev vpntest
ip route del 10.20.0.0/16
resolvectl query intranet.example.internal

첫 줄이 RTNETLINK answers: Operation not permitted를 반환하면 계정이 프로필이 요구하는 사설 경로를 설치할 수 없다는 뜻이다. 둘째 줄은 같은 권리를 반대로 증명하며, 경로를 추가할 수 있지만 제거할 수 없는 클라이언트는 뒤에 깨진 테이블을 남기기 때문에 중요하다. 그다음 리졸버 질의는 사설 이름이 터널을 통해 해석되는지, 호스트가 이미 신뢰하는 리졸버로 새는지를 보여 준다.

테스트 장치가 아직 있는 동안 셋을 모두 실행하고, 그다음 삭제하라. 사라진 장치를 가리키는 경로는 연결 실패 후 노트북이 연결성을 잃는 가장 흔한 이유다.

세션을 살아남아야 할 것을 정하라

폴더를 지우는 것은 정리 계획이 아니다. 어댑터, 경로, 리졸버 설정, 신뢰된 인증서, 저장된 자격 증명은 각각 프로세스보다 오래 살 수 있고, 부팅 시 서비스가 묻지도 않고 일부를 복원할 수 있다. 처음 실패한 연결 해제 뒤가 아니라 실행 전에 클라이언트가 무엇을 남겨도 되는지 적어 두라.

실용적 규칙은 바꾸려는 세 표면의 스냅숏을 찍고 나중에 비교하는 것이다. 첫 연결 전에 인터페이스, 기본 라우팅 테이블, 리졸버 상태를 기록하고, 클라이언트가 종료된 뒤 같은 세 가지 읽기를 반복하라.

ip -brief addr show
ip route show table main
resolvectl status

두 번째 캡처에 있고 첫 번째에 없는 모든 것은 주인이 필요하다. 클라이언트가 종료할 때 제거하거나, 그것을 만든 같은 명령으로 당신이 제거하며, 그 제거는 무슨 일이 있었는지에 대한 누군가의 기억이 아니라 배포 노트에 속한다. Windows에서는 같은 읽기가 Get-NetAdapter, Get-NetRoute, Get-DnsClientServerAddress이며, 승격은 필요 없지만 같은 잔여물을 보여 준다.

관련 글