iPhone 앱이 시스템 VPN을 켜거나 끌 수 없는 이유
공개 앱은 시스템 VPN을 전환할 수 없고, 상태를 읽을 수 없으며, 연결을 강제할 수 없습니다. On Demand 규칙, 감독되는 기기의 Always On 프로파일, MDM이 선택지입니다.
한 제품 관리자가 회사 VPN을 켜는 버튼을 요청하고, 그 요청은 사소하게 들립니다. iOS에서 이것은 작은 기능이 아닙니다. 공개 계약 밖에 있고, 어떤 우회도 심사에서 떨어지거나 다음 릴리스에서 깨집니다. 요청을 플랫폼이 실제로 허용하는 것에 비추어 따라가면 설계는 대부분 스스로 써집니다. 앱은 VPN 구성을 소유하고 시작할 수 있습니다. 앱은 시스템 스위치에 닿을 수 없고, 자기가 만들지 않은 프로파일의 상태를 읽을 수 없으며, 사용자를 의사에 반해 연결 상태로 붙잡아 둘 수 없습니다.
사용자가 의미하는 세 가지에서 시작하십시오
API를 나누기 전에 의미를 나누십시오. 때로 사용자는 앱의 터널이 연결되기를 원하고, 때로 다른 사람이 설치한 프로파일에 대해 설정 스위치가 켜지기를 원하며, 때로 터널 없이는 전화로 탐색할 수 없기를 원합니다. 이는 세 가지 다른 메커니즘에 대응하고, 보통 앱에 열려 있는 것은 첫 번째뿐입니다.
두 번째 의미가 바로 Stack Overflow 질문을 만들어내는 것이고, 여기에는 지원되는 답이 없습니다. 설정 스위치는 사용자의 것이고, 관리되는 기기에서는 프로파일의 것입니다. 어떤 공개 API도 VPN 구성을 열거하지 않고, 시스템 터널이 올라와 있는지 보고하지 않으며, 그것을 전환하지도 않습니다.
앱이 실제로 만들 수 있는 것
NetworkExtension은 NEVPNManager을 통해 앱에 자체 구성을 줍니다. Personal VPN 권한과 사용자의 동의가 있으면 앱은 설정에 자기 이름으로 나타나는 구성을 저장하고, 그 하나의 연결을 시작하거나 중지할 수 있습니다. 이것은 실제이자 심사 가능한 능력이며, 동시에 전체 범위입니다. 관리자는 자기가 만든 것만 읽고 씁니다.
권한은 자동이 아닙니다. Apple에 요청하고 앱에 터널이 왜 필요한지 정당화합니다. 다른 사람의 프로파일을 켜는 것이 유일한 목적인 클라이언트에는 좋은 답이 없습니다. 패킷 터널 공급자는 다른 클래스로 같은 규칙을 따릅니다. NETunnelProviderManager은 앱이 직접 설치한 공급자 기반 구성을 소유합니다. 어느 경로도 MDM이 전달한 프로파일에 닿지 않습니다.
동의는 저장 시점에도 적용됩니다. 구성을 쓰면 사용자에게 묻고, 그 질문은 앱이 편의를 위해 억제할 수 있는 것이 아닙니다.
상태를 읽는 것도 같은 벽에 부딪힙니다
상태는 제어보다 친절해 보이지만 똑같이 닫혀 있습니다. NEVPNStatus는 앱 자체 구성에 대해 유효하지 않음, 끊김, 연결 중, 연결됨, 재확인 중 또는 끊는 중을 보고하고, 변경마다 알림이 발생합니다. 관리 프로파일이 설치한 터널에 대해서는 아무 말도 하지 않으며, 헬프데스크가 실제로 보고 싶어 하는 상태가 바로 그것입니다.
네트워크 경로 모니터링과 인터페이스 변화는 설계 검토에서 대안으로 제시됩니다. 그것들은 앱 트래픽이 지나는 경로를 설명하고, 그 경로는 VPN 상태와 무관한 이유로 바뀌며, VPN 판독값으로 쓰면 양방향으로 거짓말하는 UI가 됩니다.
On Demand와 Always On이 진짜 지렛대입니다
지원되는 지렛대는 앱이 아니라 프로파일에 있습니다. On Demand 규칙은 시스템에 언제 연결할지 알려줍니다. 동작이 붙은 조건의 정렬된 목록이며, 당신의 코드가 아니라 운영체제가 평가합니다. 어떤 인터페이스에서든 연결하는 규칙은 앱에 어떤 제어도 주지 않고 항상 연결된 느낌을 만듭니다.
Always On VPN은 강제 메커니즘이고 감독과 묶여 있습니다. 감독되는 기기에서는 MDM이 터널을 유지하는 프로파일을 설치합니다. 감독되지 않는 개인 전화에서는 같은 키가 같은 동작을 내지 않습니다. 그 비대칭은 의도된 것이고, 페이로드 키의 어떤 조합도 그것을 없애지 못합니다. 요구가 정말 VPN이 켜져 있어야 한다는 것이라면, 요구는 사실 기기가 관리되어야 한다는 것입니다.
둘 사이에는 더 약한 사촌이 앉아 있습니다. 사용자가 끊은 뒤 다시 연결하는 규칙입니다. 규칙이 다음에 평가될 때 다시 연결하며, 이는 즉시와 같지 않고, 일부러 끊은 사용자는 차이를 알아챕니다. 자물쇠를 약속하는 대신 그 틈을 중심으로 인터페이스를 설계하십시오.
지원되는 경로를 출시하십시오
코드가 존재하기 전에 네 가지 질문이 메커니즘을 정합니다. 기기의 소유자가 누구인지, 감독되는지, 어느 클라이언트가 터널을 끝내는지, 프로파일이 어디서 오는지입니다. 이 중 하나라도 모르면 기능 요청은 추정할 준비가 되지 않았습니다.
시스템 VPN을 건드리는 비공개 API는 데모를 통과하고 심사에서 떨어집니다. 다른 방식으로 출시되면 다음 iOS 릴리스에서 깨집니다. 스위치 하나를 위해 그 거래를 할 가치가 있는 버전은 없습니다.
관리 텔레메트리는 별도 채널입니다. 프로파일이 설치되었는지, 기기가 준수하는지를 보고하며, 이는 보고이지 앱별 제어 표면이 아닙니다. 업데이트마다 실제 기기에서 흐름을 시험하십시오. 지원되는 동작은 OS에 살고 OS는 움직입니다.