Clash
Clash는 규칙을 기반으로 프록시를 설정하고 트래픽을 분배하는 체계입니다. 일반적으로 말하는 Clash Android 버전은 그래픽 클라이언트와 프록시 코어로 구성됩니다. 클라이언트는 설정 가져오기, 전환 및 표시를 담당하고, 코어는 연결 수립, 규칙 매칭, DNS 처리와 트래픽 전달을 담당합니다. 클라이언트마다 화면은 다를 수 있지만 핵심 설정 구조는 대체로 비슷합니다.
설정 개념 빠른 확인
mihomo 코어부터 TUN, Fake-IP, 프록시 그룹과 구독 오버라이드까지, 설정 흐름에 따라 자주 쓰이는 용어를 설명합니다. 각 항목에서 개념과 역할, 사용 시 주의할 범위를 확인할 수 있습니다.
기초 계층
먼저 클라이언트, 코어, 설정 및 노드를 구분하세요. 이 네 가지를 이해하면 이후 규칙, DNS 및 TUN 설정의 위치를 더 쉽게 파악할 수 있습니다.
Clash는 규칙을 기반으로 프록시를 설정하고 트래픽을 분배하는 체계입니다. 일반적으로 말하는 Clash Android 버전은 그래픽 클라이언트와 프록시 코어로 구성됩니다. 클라이언트는 설정 가져오기, 전환 및 표시를 담당하고, 코어는 연결 수립, 규칙 매칭, DNS 처리와 트래픽 전달을 담당합니다. 클라이언트마다 화면은 다를 수 있지만 핵심 설정 구조는 대체로 비슷합니다.
mihomo는 Clash Meta에서 발전한 오픈 소스 프록시 코어입니다. 규칙 기반 라우팅, TUN, Fake-IP, 룰셋 구독 및 다양한 프록시 프로토콜을 지원하며, 많은 최신 클라이언트에서 실제 네트워크 작업을 수행하는 코어로 사용됩니다. 클라이언트 버전과 코어 버전은 별개의 개념이므로, 화면 프로그램을 업데이트해도 코어가 함께 변경된다고 보기는 어렵습니다.
설정 파일은 프록시 동작을 정의하는 YAML 문서입니다. 노드, 프록시 그룹, 규칙, DNS, 수신 포트 및 TUN 매개변수가 주로 포함됩니다. 완성된 설정은 클라이언트로 직접 가져오거나 구독 주소에서 원격으로 가져올 수 있습니다. 설정을 정상적으로 불러올 수 있는지는 필드 이름, 들여쓰기, 데이터 형식 및 코어 호환성에 따라 결정됩니다.
노드는 설정 파일에 포함된 프록시 서버 연결 항목입니다. 일반적으로 서버 주소, 포트, 프로토콜, 인증 정보 및 전송 매개변수를 포함합니다. 노드는 연결 경로일 뿐 프록시 그룹과 같지 않습니다. 규칙은 보통 프록시 그룹을 참조하고, 프록시 그룹이 실제로 사용할 노드를 결정합니다. 노드의 사용 가능 여부는 서버 상태, 회선 혼잡도 및 로컬 네트워크 환경의 영향도 받습니다.
지연 시간은 테스트 요청이 왕복하는 데 걸리는 시간으로, 보통 밀리초 단위로 기록합니다. 지연 시간이 짧으면 대화형 응답이 빠른 경우가 많지만, 다운로드 대역폭, 패킷 손실률 및 장시간 안정성을 단독으로 보여주지는 않습니다. 클라이언트의 지연 시간 측정 결과는 테스트 주소, DNS 해석 및 현재 네트워크 상태의 영향도 받습니다.
연결 계층
프록시 프로토콜은 클라이언트가 서버와 통신하는 방식을 결정합니다. 로컬 프록시 인터페이스와 원격 노드 프로토콜은 용도가 다르므로, 설정할 때 먼저 해당 필드가 어느 계층에 속하는지 확인해야 합니다.
HTTP 프록시는 HTTP 및 HTTPS 요청을 처리하는 애플리케이션 계층 프록시 인터페이스입니다. 수동 프록시 설정을 지원하는 브라우저나 앱은 Clash의 로컬 HTTP 수신 포트에 연결한 뒤, 코어가 규칙에 따라 출구를 선택하게 할 수 있습니다. 앱이 직접 프록시 설정을 사용해야 하므로 모든 Android 앱의 트래픽을 자동으로 처리할 수는 없습니다.
SOCKS5는 여러 유형의 TCP 트래픽을 전달하고 클라이언트 구현에 따라 UDP도 지원하는 범용 프록시 인터페이스입니다. HTTP 프록시와 달리 구체적인 웹 요청 형식을 이해할 필요가 없어 적용 범위가 더 넓습니다. 앱이 SOCKS5 수신 주소에 명시적으로 연결해야 하며, 그렇지 않다면 Android VPN 인터페이스나 TUN 가로채기를 고려해야 합니다.
Shadowsocks는 암호화된 전송을 사용하는 프록시 프로토콜입니다. 노드 설정에는 일반적으로 서버 주소, 포트, 암호화 방식 및 비밀번호가 필요하며, 어느 한 항목이라도 일치하지 않으면 핸드셰이크가 실패할 수 있습니다. 이 프로토콜은 클라이언트와 원격 서버 사이의 연결 방식을 정의할 뿐, 어떤 도메인을 프록시로 보낼지는 결정하지 않습니다.
VLESS는 가벼운 프록시 프로토콜로, TLS, REALITY, WebSocket 또는 gRPC 같은 전송 및 보안 계층과 함께 사용하는 경우가 많습니다. 설정할 때 사용자 식별자뿐 아니라 서버 이름, 전송 유형, 경로 및 공개 키 등의 매개변수도 확인해야 합니다. 프로토콜 이름이 같다고 해서 모든 전송 조합을 서로 바꿔 쓸 수 있는 것은 아닙니다.
판단 계층
규칙은 연결의 대상을 판단하고, 프록시 그룹은 사용할 출구를 결정합니다. 두 요소가 함께 Clash 설정의 핵심 트래픽 분배 로직을 구성합니다.
규칙 기반 라우팅은 도메인, IP, 네트워크 유형 또는 프로세스 등의 조건에 따라 연결을 지정된 프록시 그룹으로 보내는 과정입니다. 규칙은 보통 위에서 아래 순서로 매칭되며, 일치하면 뒤의 항목은 더 이상 확인하지 않습니다. 따라서 구체적인 규칙을 포괄적인 규칙보다 앞에 배치해야 더 이른 일반 조건에 가로채이지 않습니다.
프록시 그룹은 노드와 다른 프록시 그룹을 묶는 논리적 컨테이너입니다. 대표적인 유형으로 수동 선택 방식의 select, 주기적으로 테스트하는 url-test, 장애 조치용 fallback, 연결을 분산하는 load-balance가 있습니다. 규칙은 프록시 그룹 이름을 참조하고, 프록시 그룹이 실제 출구를 결정합니다.
룰셋은 독립적으로 관리하고 기본 설정에서 참조할 수 있는 규칙 모음으로, rule provider라고도 합니다. 서비스 도메인, 지역 IP 및 광고 도메인 등의 분류를 기본 설정에서 분리할 때 유용합니다. 원격 룰셋에는 출처, 업데이트 주기 및 동작 유형을 설정해야 하며, 업데이트에 실패하면 기존 캐시를 계속 사용하는 경우가 많습니다.
GEOIP는 대상 IP가 지역 데이터베이스에서 어느 지역에 속하는지를 기준으로 매칭합니다. 일반적으로 도메인이 이미 해석된 뒤 판단에 사용되므로 DNS가 반환한 주소와 데이터베이스 버전의 영향을 받습니다. 전 세계에 분산된 주소를 사용하는 서비스는 GEOIP만으로 실제 서비스 지역을 정확히 표현하기 어려울 수 있습니다.
MATCH는 규칙 목록의 최종 기본값으로, 앞선 모든 조건과 일치하지 않은 연결을 처리합니다. 보통 규칙 목록의 마지막에 배치하고, 전체 제어용 프록시 그룹이나 직접 연결 또는 거부 동작을 가리킵니다. 적절한 기본값이 없으면 분류되지 않은 트래픽이 예상과 다르게 처리될 수 있습니다.
해석 및 가로채기
DNS는 도메인에서 주소를 얻는 방식을 결정하고, TUN은 어떤 연결이 코어로 들어갈지를 결정합니다. 두 부분을 함께 고려해야 하며, 한쪽만 조정하면 DNS 해석과 라우팅이 어긋날 수 있습니다.
DNS 유출은 서비스 트래픽은 프록시를 통과하지만 도메인 조회는 예상하지 못한 리졸버가 처리하는 현상입니다. 조회 경로가 노출되거나 프록시 출구 지역과 맞지 않는 주소가 반환될 수 있습니다. 문제를 확인할 때는 Android 비공개 DNS, Clash DNS 모듈, TUN의 DNS 하이재킹 및 브라우저 자체의 암호화 DNS 설정을 함께 점검해야 합니다.
Fake-IP 모드는 도메인에 예약된 주소 풀의 임시 매핑 주소를 반환합니다. 앱이 해당 주소로 연결하면 코어가 원래 도메인을 복원하고 도메인 규칙에 따라 출구를 결정할 수 있습니다. 이 방식은 도메인 정보를 유지하는 데 유리하지만, 일부 로컬 네트워크 서비스, 게임 또는 검증이 엄격한 앱은 필터 목록에 추가해야 할 수 있습니다.
nameserver는 Clash DNS 모듈이 일반 조회에 사용하는 업스트림 리졸버 목록입니다. 업스트림은 전통적인 UDP와 TCP를 사용할 수 있고, 코어가 지원하면 암호화된 DNS도 사용할 수 있습니다. 리졸버를 선택할 때는 단일 조회 속도만 비교하지 말고 네트워크 접근성, 반환 결과 및 규칙 요구 사항을 함께 고려해야 합니다.
TUN 모드는 가상 네트워크 인터페이스를 통해 시스템 트래픽을 가로채며, HTTP 또는 SOCKS5 설정을 지원하지 않는 앱을 처리하는 데 적합합니다. Android에서는 일반적으로 시스템 VPN 인터페이스를 통해 실행되며, 자동 라우팅, 엄격한 라우팅 및 DNS 하이재킹과 함께 사용할 수 있습니다. 한 기기에서는 보통 동시에 하나의 도구만 이러한 VPN 인터페이스를 사용할 수 있습니다.
기기 계층
Android는 백그라운드 실행, VPN 인터페이스 및 앱 범위를 별도로 관리합니다. 클라이언트 설정이 올바르더라도 시스템 권한이 실제 연결 상태에 영향을 줄 수 있습니다.
Android VPN 권한은 앱이 로컬 가상 네트워크 인터페이스를 생성하고 기기 연결을 프록시 코어로 처리하도록 허용합니다. 트래픽 가로채기를 처음 활성화하면 시스템에서 권한 승인 메시지를 표시합니다. 이 권한이 있다고 해서 연결이 반드시 원격 VPN 서비스를 거치는 것은 아니며, 기기 내부 TUN 전달에도 사용할 수 있습니다.
앱별 트래픽 분배는 Android 앱별로 프록시 가로채기 범위에 포함할지 선택하는 방식입니다. 허용 목록 방식은 선택한 앱만 처리하고, 차단 목록 방식은 대부분의 앱을 가로챈 뒤 지정한 항목을 제외합니다. 범위를 변경한 뒤에는 기존 연결이 이전 경로를 계속 사용하지 않도록 연결을 다시 설정해야 합니다.
배터리 최적화는 Android가 백그라운드 앱에 적용하는 절전 제한입니다. 화면이 꺼졌거나 앱이 장시간 백그라운드에서 실행된 뒤 시스템이 클라이언트를 일시 중지할 수 있으며, 알림은 남아 있지만 새 연결이 실패하거나 프록시 서비스가 다시 시작될 수 있습니다. 안정적으로 계속 실행해야 한다면 시스템 설정에서 클라이언트의 백그라운드 활동 및 배터리 관리 정책을 확인하세요.
실행 로그에는 설정 로드, 규칙 매칭, DNS 조회, 노드 연결 및 오류 정보가 기록됩니다. 문제를 해결할 때는 먼저 오류가 발생한 시간, 연결 대상, 매칭된 정책 및 오류 유형을 확인해야 합니다. 로그의 단일 실패가 전체 서비스를 사용할 수 없다는 뜻은 아니므로, 발생 빈도와 해당 앱을 함께 살펴봐야 합니다.
설정 출처
구독은 원격 콘텐츠 업데이트를 담당하고, YAML은 로컬 설정 구조를 정의하며, 오버라이드는 두 요소 사이에서 기기별 조정을 유지합니다.
구독은 원격 주소에서 노드 목록 또는 전체 설정을 가져와 업데이트하는 방식입니다. 가져오기에 성공했다는 것은 클라이언트가 당시 반환된 내용을 읽을 수 있다는 뜻일 뿐, 모든 노드를 사용할 수 있다는 의미는 아닙니다. 구독 주소의 내용이 변경되면 클라이언트에서 다시 가져와 설정을 불러와야 하며, 기존 연결은 보통 새 노드로 자동 이전되지 않습니다.
자동 업데이트 주기는 클라이언트가 구독 또는 룰셋을 다시 가져오는 시간 간격으로, 보통 분 또는 시간 단위로 표시합니다. 주기를 짧게 설정하면 원격 변경 사항을 빠르게 반영할 수 있지만 요청 빈도와 백그라운드 활동이 늘어납니다. 설정 후에는 Android가 클라이언트의 예약 백그라운드 실행을 허용하는지도 확인해야 합니다.
YAML은 Clash 설정에서 자주 사용하는 데이터 직렬화 형식으로, 들여쓰기로 객체와 목록의 계층을 표현합니다. 탭 문자, 잘못된 들여쓰기, 중복 키 및 닫히지 않은 따옴표로 인해 설정을 해석하지 못할 수 있습니다. 편집할 때는 같은 계층의 들여쓰기를 일관되게 유지하고 콜론 뒤에 공백을 넣어야 합니다.
오버라이드와 병합은 원격 구독을 바탕으로 로컬 매개변수를 적용하는 기능입니다. 예를 들어 DNS를 추가하거나 규칙 순서를 조정하고 프록시 그룹을 수정할 수 있습니다. 구독 업데이트 기능은 유지하면서 업데이트 후 반복적인 수동 편집을 줄일 수 있습니다. 클라이언트마다 오버라이드 문법과 병합 순서가 다를 수 있으므로 설정을 옮길 때 다시 확인해야 합니다.