VpnService 권한: Android 프록시의 기본 원리
Android용 Clash 클라이언트(그리고 Clash Meta / mihomo 코어 기반 포팅 버전)는 root 권한 없이 시스템이 제공하는 VpnService 인터페이스를 이용해 트래픽을 가로챕니다. 원리는 다음과 같습니다: 클라이언트가 시스템에 가상 네트워크 인터페이스(TUN 장치) 생성을 요청하면, 시스템이 일회성 권한 확인 대화상자를 띄우고, 사용자가 "확인"을 누르면 해당 클라이언트가 전체 또는 일부 앱의 네트워크 트래픽을 가로채고 전달할 권한을 얻습니다. 이 권한 승인은 실제 VPN 연결 여부와는 무관하며, Android 시스템이 "어떤 앱이 가상 네트워크 카드를 만들 수 있는가"를 제한하는 보안 장치일 뿐입니다. 투명 프록시 기능이 필요한 도구라면(실제로 원격 VPN 서버에 연결하는지 여부와 관계없이) 모두 이 절차를 거쳐야 합니다.
클라이언트를 처음 실행하고 "프록시 시작" 또는 "연결" 버튼을 누르면 시스템이 "Clash가 모든 네트워크 트래픽에 대한 VPN 연결을 설정하도록 허용하시겠습니까"와 비슷한 확인 창을 띄웁니다. 이 승인은 한 번만 하면 되며, 사용자가 직접 취소하거나 앱 데이터를 삭제하거나 클라이언트를 교체하지 않는 한 시스템이 승인 상태를 계속 유지합니다. 오랫동안 이 대화상자가 뜨지 않았는데도 프록시가 작동하지 않는다면 보통 두 가지 원인이 있습니다. 하나는 클라이언트의 권한이 백그라운드에서 시스템에 의해 조용히 해제된 경우이고, 다른 하나는 기기에 VPN 인터페이스를 점유하는 다른 앱이 함께 설치된 경우입니다(시스템은 한 번에 하나의 VpnService만 활성화할 수 있음). 후자의 경우 먼저 다른 앱을 종료해야 합니다.
권한 문제 점검 방법
- 설정에서 "항상 VPN 사용"이 다른 앱에 고정되어 있지 않은지 확인하세요. 이 설정이 켜져 있으면 새 클라이언트가 인터페이스를 점유할 수 없습니다.
- 시스템의 "VPN" 설정 페이지(보통 네트워크 및 인터넷 항목 아래)에서 현재 활성화된 것이 목표 클라이언트인지 확인하세요.
- 일부 커스텀 시스템은 앱 정보 페이지에 별도의 "VPN 권한" 스위치를 제공하는데, 이는 최초 팝업 승인과는 별개의 기록이므로 시스템 업그레이드 후 다시 확인이 필요할 수 있습니다.
앱별 프록시: 어떤 앱의 트래픽을 노드로 보낼지 세밀하게 제어
대부분의 Android 클라이언트는 TUN 모드를 기반으로 "앱 화이트리스트/블랙리스트" 설정을 제공하는데, 이는 각 앱 내부의 네트워크 로직을 수정하는 것이 아니라 가상 네트워크 카드 계층에서 패키지 이름으로 트래픽을 필터링하는 방식입니다. 앱별 프록시를 켜면 보통 다음 두 가지 모드 중 하나를 선택할 수 있습니다.
- 블랙리스트 모드: 기본적으로 모든 앱이 프록시를 거치고, 선택한 앱만 직접 연결됩니다. "특정 로컬 앱만 영향을 받지 않게 하고 싶다"는 상황에 적합하며, 예를 들어 은행 앱이나 공공기관 앱은 보통 직접 연결이 있어야 정상적으로 인증이 이루어집니다.
- 화이트리스트 모드: 기본적으로 모든 앱이 직접 연결되고, 선택한 앱만 프록시를 거칩니다. "특정 앱만 노드를 거치게 하고 싶다"는 상황에 적합하고, 트래픽과 배터리 소모도 더 적어 필요에 따라 사용하는 대부분의 사용자에게 권장됩니다.
주의할 점은, 앱별 프록시의 적용 범위는 사용자 공간의 네트워크 요청에만 해당되며, 시스템 수준 구성요소(예: 일부 시스템 DNS 해석, 일부 제조사 자체 푸시 서비스)는 패키지 이름 필터링의 제약을 받지 않을 수 있다는 점입니다. 이는 시스템 구현 방식의 차이이며 클라이언트의 결함이 아닙니다. 또한 앱별 목록을 수정한 뒤에는 프록시 서비스를 한 번 수동으로 재시작(연결 해제 후 재연결)하는 것이 좋습니다. 이미 맺어진 연결에 설정이 실시간으로 적용될 것으로 기대하지 마세요.
제조사 절전 정책이 연결 끊김을 일으키는 이유
Android에서 Clash 클라이언트는 포그라운드 서비스 형태로 오랫동안 메모리에 상주하며 TUN 가상 네트워크 카드의 활성 연결을 지속적으로 유지합니다. 이런 "오랫동안 백그라운드에서 리소스를 점유"하는 동작 방식은 국내(중국 본토)뿐 아니라 한국을 포함한 여러 지역의 주요 커스텀 시스템 배터리 관리 정책이 집중적으로 단속하는 대상입니다. 제조사 절전 정책은 보통 세 가지 방식으로 개입합니다.
- 프로세스 동결/강제 종료: 화면이 꺼지거나 잠금 상태가 일정 시간 지속되면 시스템이 해당 앱을 "비활성 백그라운드 프로세스"로 판단해 즉시 동결하거나 종료합니다. 이때 TUN 인터페이스도 함께 무효화되어 모든 프록시 트래픽이 끊깁니다.
- 자동 실행 제한: 종료된 프로세스는 스스로 포그라운드 서비스를 재시작할 수 없습니다. 클라이언트에 재연결 로직이 있어도 프로세스 자체가 존재하지 않으면 재연결 자체가 불가능합니다.
- 백그라운드 네트워크 제한: 프로세스가 살아있더라도 시스템이 화면 꺼짐 상태에서 해당 앱의 백그라운드 네트워크 접근 권한만 별도로 제한할 수 있습니다. 이 경우 프록시가 "작동 중인 것처럼 보이지만 실제로는 트래픽이 맞지 않는" 상태가 됩니다.
같은 설정 파일, 같은 클라이언트 버전인데도 순정 Android(Pixel 등)에서는 몇 시간 동안 끊기지 않고 안정적으로 작동하지만 일부 커스텀 시스템에서는 자주 끊기는 이유가 바로 여기에 있습니다. 차이는 클라이언트 자체가 아니라 시스템이 백그라운드 상주 서비스를 얼마나 허용하는가에 있습니다.
연결이 끊긴 뒤 클라이언트 화면에는 "연결됨"으로 표시되지만 인터넷 접속이 되지 않는다면, 대부분 TUN 인터페이스가 시스템에 의해 이미 회수되었지만 화면 상태가 아직 갱신되지 않은 경우입니다. 노드나 구독 문제가 아닐 가능성이 큽니다. 먼저 프록시 서비스를 한 번 재시작한 뒤 다른 부분을 점검하세요.
클라이언트를 배터리 최적화 예외에 추가하는 구체적인 방법
위에서 설명한 연결 끊김 문제를 해결하는 핵심은 "이 앱은 자동 최적화 대상에서 제외해 달라"고 시스템에 알려, 절전 정책의 관리 범위에서 빼내는 것입니다. 제조사마다 메뉴 명칭은 다르지만 조작 논리는 대체로 비슷합니다. 아래는 자주 쓰이는 시스템별 경로입니다(설정 메뉴에서 흔히 쓰이는 명칭을 기준으로 하며, 시스템 버전에 따라 표현이 조금씩 다를 수 있습니다).
순정 Android / 순정에 가까운 시스템
- 「설정」→「앱」→ 대상 클라이언트 찾기
- 「배터리」 또는 「배터리 사용량」 탭
- 「배터리 최적화」를 "최적화됨"에서 「최적화 안 함/제한 없음」으로 변경
MIUI(小米/红米, Xiaomi/Redmi)
- 「설정」→「앱 설정」→「앱 관리」→ 클라이언트 찾기
- 「절전 전략」을 「제한 없음」으로 선택
- 「자동 실행 관리」에서 해당 앱의 자동 실행이 허용되어 있는지, 「백그라운드 잠금」(일부 버전에서는 "잠금화면 앱"으로 표기)에서 최근 작업 목록에 해당 앱 아이콘이 잠겨 있는지 추가로 확인
ColorOS / realme UI(OPPO/OnePlus/realme)
- 「설정」→「배터리」→「앱 배터리 소모 관리」→ 클라이언트 찾기
- 「대기 시 활동 정지」를 끄고, 배터리 관리 정책을 「백그라운드 실행 허용」으로 설정
- 최근 작업 목록에서 클라이언트 카드를 길게 눌러 잠금 아이콘을 선택해 백그라운드 일괄 정리 시 함께 종료되지 않도록 방지
EMUI / HarmonyOS(Huawei/Honor)
- 「설정」→「배터리」→「앱 시작 관리」→ 클라이언트의 자동 관리를 끄고 「자동 시작」「연계 시작」「백그라운드 활동」 세 항목을 수동으로 켬
- 「설정」→「배터리」→「배터리 설정 더보기」→ 배터리 소모 앱 관리에서 해당 클라이언트가 제한되어 있지 않은지 확인
One UI(Samsung)
- 「설정」→「애플리케이션」→ 클라이언트 찾기 →「배터리」
- 「절전 앱」「深이 절전 앱」 목록(사용하지 않는 앱 최적화 목록)에서 해당 앱 제외
- 「장기간 사용하지 않을 경우 절전 모드로 전환」 스위치 끄기
설정을 마친 뒤에는 프록시를 다시 연결하고 화면을 20~30분 정도 꺼 둔 상태로 검증해, 백그라운드 연결 끊김 문제가 사라졌는지 확인하는 것이 좋습니다. 일부 시스템 버전이 업데이트되면서 설정이 초기화되는 경우가 있으므로, 큰 버전 업그레이드가 있을 때마다 위 항목들을 다시 확인하는 것을 권장합니다.
평소 사용 시 안정성을 높이는 팁
배터리 최적화 예외 설정 외에도 Android용 Clash 클라이언트의 장기 안정성을 눈에 띄게 높여주는 몇 가지 세부 사항이 있습니다.
- 가능하면 클라이언트 내에서 "알림 상시 표시" 또는 포그라운드 서비스 알림을 켜두세요. 이런 포그라운드 서비스 알림은 시스템이 능동적으로 프로세스를 종료할 확률을 눈에 띄게 낮춰주는, 생존 권한을 얻기 위한 정상적인 설계상의 대가입니다.
- 서드파티 원터치 정리 도구 사용을 피하세요. 이런 도구는 종종 시스템의 예외 목록 메커니즘을 무시하고 강제로 프로세스를 종료합니다.
- 라우터나 시스템 계층에서 이미 DNS 분리를 처리한 사용자는 앱별 프록시에서 화이트리스트 모드를 우선 사용하는 것을 권장합니다. 가상 네트워크 카드가 처리하는 연결 수를 줄여 배터리 소모도 간접적으로 낮출 수 있습니다.
- 구독 업데이트는 예약된 자동 업데이트에 의존하기보다 수동으로 실행하는 것을 권장합니다. 백그라운드에서 제한이 걸리면 예약 작업이 조용히 실패하기 쉬워, 규칙과 실제 노드가 어긋나는 원인이 됩니다.
권한 승인 절차를 정확히 이해하고, 필요에 맞게 앱별 프록시를 설정하고, 사용 중인 기기에 맞춰 배터리 최적화 예외를 설정하면 Android에서 가장 흔한 "쓰다 보면 끊기는" 문제는 대부분 해결할 수 있습니다. 위 단계를 모두 처리했는데도 반복적으로 연결이 끊긴다면, 시스템 설정을 계속 뒤지기보다는 노드나 구독 자체의 문제인지 확인해 보는 것이 좋습니다.