Config / Rule · 공식 매뉴얼

Shadowrocket 규칙 및 설정 참고서

설정 섹션에서 문법을 확인하고 매칭 순서에 따라 결과를 살펴보세요. 본인 구독 또는 서버 정보를 보유하고 트래픽 분기 동작을 확인하려는 iPhone / iPad 사용자에게 적합합니다.

처음 가져오기와 연결 방법은 빠른 시작 가이드를 먼저 확인하세요. 이 페이지는 연결 후 참고용으로, 최초 설치 과정을 다시 다루지 않습니다. 클라이언트는 1회 구매 방식이며 회선 요금제와는 별개입니다. 이 사이트는 노드나 구독을 제공·판매·추천하지 않습니다.

  • 설정 섹션 및 매개변수
  • 규칙 유형 및 정책
  • 순서 및 검증

01 / CONFIG STRUCTURE

설정 파일 구조: 서버 정보와 동작 규칙 구분하기

Shadowrocket에서 서버 정보는 '어떤 서버로 연결할지'를 정하고, 설정 파일은 '요청을 어떻게 처리할지'를 정합니다. 서로 관련은 있지만 같은 정보는 아닙니다. 보유한 구독은 일반적으로 서버 항목을 가져오고 업데이트하는 데 사용하며, 트래픽 분기 규칙이 포함된 설정 파일은 Config에서 확인하고 활성화해야 합니다. Home에 서버가 표시된다고 해서 사용자 지정 규칙까지 적용되었다고 볼 수는 없습니다. 설정을 확인하기 전에 현재 선택한 서버, 활성화된 설정 파일, Global Routing 상태를 기록해 두세요. 그래야 이후 문제를 같은 조건에서 살펴볼 수 있습니다.

네 가지 설정 섹션의 역할

일반 텍스트 설정에서는 대괄호로 섹션 이름을 표시합니다. [General]에는 DNS 및 시스템 트래픽 관련 설정과 같은 일반 매개변수를 둡니다. [Rule]에는 요청 매칭 조건과 해당 정책을 둡니다. [Host]에는 지정한 도메인의 주소 매핑을 작성합니다. [URL Rewrite]는 표현식에 맞는 URL을 처리합니다. 섹션 이름은 단순한 제목이 아닙니다. 각 행이 속한 섹션에 따라 해석 방식이 달라집니다. 도메인 규칙을 General에 붙여 넣으면 행의 문법이 올바르더라도 Rule 규칙으로 사용할 수 없습니다.

[General]
bypass-system = true
dns-server = system

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT
FINAL,PROXY

[Host]
localhost = 127.0.0.1

[URL Rewrite]
^http://example\.com/ https://example.com/ 302

이 조각은 구조를 파악하기 위한 예시이며, 전체 설정에 그대로 적용하라는 의미는 아닙니다. General의 두 행은 각각 불리언 매개변수와 DNS 값을 보여 줍니다. Rule의 세 행은 도메인, 주소 범위, 최종 정책을 나타냅니다. Host의 localhost는 로컬 루프백 이름 예시이고, 마지막 행은 HTTP에서 HTTPS로 리디렉션하는 방식을 보여 줍니다. 예시 도메인은 실제 서비스와 관계가 없으므로 복사하기 전에 목적을 먼저 확인하세요. 특히 FINAL 값은 매칭되지 않은 모든 요청에 영향을 주므로, 예시에서 PROXY를 사용했다고 그대로 따라 해서는 안 됩니다.

구두점, 줄 구성 및 가독성

규칙 필드는 반각 쉼표로 구분하고, 매개변수 값은 반각 등호로 지정하며, 섹션 이름에는 반각 대괄호를 사용합니다. 입력기의 전각 쉼표, 따옴표, 공백은 내용이 예상대로 해석되지 않는 원인이 될 수 있습니다. 규칙은 한 줄에 하나씩 작성하고, 웹페이지 줄바꿈을 새 규칙으로 오해하지 마세요. 읽을 때는 '키워드, 매칭 값, 정책, 선택적 매개변수' 순으로 나눠 볼 수 있지만 모든 키워드의 필드 수가 같은 것은 아닙니다. FINAL에는 매칭 값이 없으므로 기계적으로 세 열을 채워서는 안 됩니다.

설정 섹션의 배열 순서를 고정된 처리 절차로 이해해서는 안 됩니다. 파일에서 General이 Rule보다 위에 있다고 해서 모든 요청에 일반 매개변수를 먼저 적용한 뒤 다른 섹션을 차례대로 처리한다는 뜻은 아닙니다. Host와 URL Rewrite도 Rule의 후속 규칙이 아닙니다. 위에서 아래로 순서를 확인해야 하는 곳은 Rule 내부입니다. 설정 구조와 규칙 우선순위를 구분하면 설정 섹션 전체를 옮겨 '규칙 우선순위를 높이려는' 무효한 수정을 피할 수 있습니다.

Config에서 활성화된 항목 확인하기

Config에 들어가면 먼저 현재 선택된 파일을 확인한 다음 살펴보거나 편집할 항목을 여세요. 복사본을 수정하기 전에는 용도를 알아보기 쉬운 이름을 붙이고 원본 파일을 보관합니다. 편집 내용을 저장하는 것과 파일을 활성화하는 것은 별개의 확인 단계입니다. 저장은 텍스트가 기록되었다는 의미일 뿐, 현재 연결에서 해당 파일을 사용한다는 뜻은 아닙니다. 파일 목록으로 돌아가 선택 상태를 확인하고 Global Routing도 점검하세요. 화면 구성은 앱 업데이트에 따라 달라질 수 있으므로 특정 화면 좌표가 아니라 파일 이름, 선택 상태, 실제 요청 결과를 기준으로 판단해야 합니다.

사용 중인 앱이 맞는지 아직 확인하지 못했다면 정식 앱 확인 안내에서 개발자 Shadow Launch Technology Limited, 공식 아이콘, 앱 ID 932747118을 확인하세요. Shadowrocket은 Apple 플랫폼의 유료 클라이언트이며 App Store에서만 받을 수 있습니다. 시스템 요구 사항은 App Store 페이지의 표기를 기준으로 합니다. 기본 환경을 확인한 뒤 이 페이지의 필요한 설정 조각만 수정하면, 서버와 설정을 동시에 변경하는 것보다 문제 원인을 쉽게 파악할 수 있습니다.

02 / GENERAL

General 및 DNS: 이름 해석 방식과 트래픽 분기 정책은 다릅니다

General은 전역 동작을 설정하는 섹션이지만, '전역 매개변수'가 Global Routing의 Proxy를 뜻하는 것은 아닙니다. 전자는 설정이 적용되는 범위를 설명하고, 후자는 연결에 사용할 라우팅 모드를 나타냅니다. 설정을 살펴볼 때는 두 개념을 구분해야 합니다. 예를 들어 dns-server를 조정하는 것은 도메인 해석 설정을 바꾸는 것이며, 모든 요청을 자동으로 PROXY로 전환하지 않습니다. 반대로 Global Routing을 Proxy로 바꿨다고 해서 모든 DNS 조회가 특정 서버를 사용한다고 단정할 수도 없습니다.

최소한의 매개변수로 이해하는 General

[General]
bypass-system = true
dns-server = system

첫 번째 행은 시스템 관련 트래픽의 우회 설정을 활성화하고, 두 번째 행은 시스템 DNS를 사용합니다. 여기서 true는 불리언 값이고 system은 매개변수 값이지 교체할 서버 이름이 아닙니다. 시스템 관련 트래픽의 처리는 시스템 네트워크 동작 및 다른 설정의 영향도 받으므로, bypass-system을 '모든 Apple 서비스가 특정 정책에 따라 처리된다'고 해석해서는 안 됩니다. 특정 도메인 문제를 조사할 때는 실제 요청 기록을 확인하세요. 매개변수 이름만 보고 특정 요청이 반드시 우회된다고 판단하면 실제로 매칭된 규칙을 놓칠 수 있습니다.

dns-server와 Host의 역할도 다릅니다. 전자는 이름 해석에 사용할 설정을 정하고, 후자는 특정 이름에 주소를 연결합니다. Host에 어떤 도메인의 주소를 지정했다면 DNS를 바꿔도 그 이름의 결과가 달라지지 않을 수 있습니다. 문제를 확인하기 전에 같은 이름의 Host 항목이 있는지 살펴보고 캐시와 새 요청을 확인하세요. 시스템, 앱, 원격 서비스에는 서로 다른 계층의 캐시가 있을 수 있습니다. DNS를 한 번 전환한 뒤 같은 페이지를 바로 새로고침하는 것만으로는 새 설정의 효과를 입증할 수 없습니다.

이름 해석 실패와 연결 실패 구분하기

도메인에 접속하려면 일반적으로 먼저 주소를 얻고 그다음 대상에 연결하는 단계가 필요합니다. 도메인 해석에 실패하면 규칙이 예상한 IP 정보를 얻지 못한 것처럼 보일 수 있고, 해석이 끝난 뒤 연결, TLS, 원격 응답 단계에서 실패할 수도 있습니다. 따라서 '웹페이지가 열리지 않음'이 곧 DNS 오류를 뜻하지는 않습니다. 먼저 해석 결과가 있는지 확인한 뒤 요청에 적용된 정책과 서버를 살펴보세요. 다른 도메인은 같은 조건에서 정상인데 특정 사이트만 실패한다면 해당 사이트의 규칙, 주소, 연결 결과를 우선 비교하세요.

혼동하기 쉬운 세 가지 설정 계층
설정 항목주요 역할이것만으로 단정할 수 없는 내용
dns-serverDNS 관련 값 지정모든 서비스 요청이 PROXY를 사용함
[Host]이름과 주소의 매핑 지정연결 시 유효한 인증서가 자동으로 제공됨
[Rule]요청을 매칭해 정책 선택대상에 반드시 접속할 수 있음

DNS를 조정해야 하는 경우

증상이 이름 해석 단계와 관련 있을 때만 DNS 설정을 변경하세요. 예를 들어 같은 도메인이 네트워크에 따라 서로 다른 해석 결과를 반환하거나, 요청 기록에 도메인 해석이 완료되지 않은 것으로 나타나는 경우입니다. 변경 전에는 현재 값을 기록하고 테스트 네트워크를 확인하세요. 변경한 뒤에는 같은 대상을 다시 연결합니다. DNS, Global Routing, 서버를 동시에 바꾸지 마세요. 접근이 복구되어도 어떤 변경이 원인이었는지 알 수 없습니다. 설정은 우연히 한 번 성공한 조합이 아니라 결과를 설명할 수 있어야 합니다.

암호화 DNS를 사용할 때는 해당 서비스 주소에 어떻게 연결하는지도 고려해야 합니다. 해석 서비스 주소를 입력했다고 현재 네트워크에서 그 주소에 연결할 수 있다는 뜻은 아닙니다. 해석 서비스에 연결할 조건이 충족되지 않으면 도메인 규칙으로 이 선행 단계를 대신할 수 없습니다. 이 문서에서는 바로 대체해 사용할 공용 해석 서비스 목록을 제공하지 않습니다. 해당 정보를 입력해야 한다면 사용 가능 여부를 직접 확인한 자료를 이용하고, 앱에 표시되는 매개변수 형식에 맞춰 작성하세요. 서로 다른 프로토콜의 주소 문법을 섞지 마세요.

마지막으로 IPv4와 IPv6도 확인하세요. 한 도메인이 두 종류의 주소를 모두 반환할 수 있으므로 한쪽만 확인하면 실제 연결 경로를 놓칠 수 있습니다. IPv4 규칙이 매칭되지 않을 때는 규칙 범위를 바로 넓히기보다 요청이 IPv6를 사용했는지 먼저 확인하세요. DNS 선택, 반환된 주소, 주소 규칙을 함께 점검해야 합니다. 이름 해석 방식은 DNS 설정 안내에서 더 자세히 설명합니다. 여기서는 실패 단계부터 파악한 뒤 General을 수정할지 결정하는 것이 핵심입니다.

03 / DOMAIN MATCHING

도메인 규칙: 정확한 이름, 접미사, 키워드

트래픽 분기 대상을 안정적인 도메인으로 표현할 수 있다면 먼저 도메인 규칙을 고려하세요. 주소를 직접 나열하는 것보다 '특정 사이트나 서비스'라는 의도를 잘 표현하고, 서버 주소가 바뀌어도 영향을 덜 받습니다. 다만 도메인은 전체 URL이 아닙니다. 프로토콜, 경로, 쿼리 매개변수, 포트를 DOMAIN의 매칭 값에 그대로 붙여 넣으면 안 됩니다. 브라우저 주소창의 전체 URL에서 먼저 호스트 이름을 추출한 다음, 그 이름만 매칭할지 하위 도메인까지 포함할지 판단하세요.

DOMAIN: 지정한 이름만 매칭

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,account.example.com,DIRECT
FINAL,PROXY

첫 번째 행은 api.example.com, 두 번째 행은 account.example.com을 대상으로 합니다. DOMAIN은 '이 단어가 포함됨'을 뜻하지 않으며 다른 하위 도메인까지 자동으로 포함하지 않습니다. 실제 요청이 images.api.example.com이라면 같은 서비스처럼 보여도 첫 번째 행이 매칭된다고 단정할 수 없습니다. 정확한 규칙은 일부 명확한 예외를 처리할 때 적합합니다. 예를 들어 대부분의 요청에는 최종 정책을 적용하고 특정 호스트 이름 하나에만 DIRECT를 적용할 수 있습니다. 사용하기 전에 실제 요청에서 전체 이름을 확인하고, 페이지에 표시되는 브랜드 이름을 네트워크 요청의 호스트 이름으로 착각하지 마세요.

DOMAIN-SUFFIX: 도메인 경계를 기준으로 접미사 범위 매칭

[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

DOMAIN-SUFFIX,example.com은 example.com과 www.example.com 같은 하위 도메인을 포함합니다. 도메인 경계를 기준으로 접미사를 판단하므로 임의의 문자열 끝부분을 비교하는 방식이 아닙니다. 따라서 notexample.com은 정상적인 매칭 대상이 아닙니다. 위 예시처럼 넓은 접미사 규칙보다 private.example.com의 정확한 예외를 먼저 작성하세요. 두 행의 순서를 바꾸면 접미사 규칙이 예외 이름을 먼저 매칭해 정확한 규칙이 의도한 역할을 하지 못합니다. 규칙 수보다 적용 범위의 관계가 더 중요합니다.

접미사를 작성할 때는 보통 별표를 붙이지 않습니다. *.example.com을 DOMAIN-SUFFIX의 표준 값으로 사용하면 와일드카드 표현식과 접미사 매칭 방식이 혼동됩니다. 이미지 도메인까지 포함해야 한다는 이유로 범위를 짧은 공용 접미사까지 넓히지도 마세요. 범위가 넓을수록 관계없는 서비스가 함께 포함될 가능성이 커집니다. 실제 서비스에서 사용하는 등록 도메인을 출발점으로 삼고, 모든 요청이 같은 접미사를 공유한다고 추측하기보다 요청 기록을 보고 별도 도메인을 추가하세요.

DOMAIN-KEYWORD: 범위가 넓고 잘못 매칭될 가능성도 큽니다

[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT

DOMAIN-KEYWORD는 도메인에 포함된 키워드를 기준으로 매칭합니다. 여기서 example은 완전한 도메인이 아니며 DOMAIN-SUFFIX처럼 도메인 경계도 고려하지 않으므로 관계없는 이름까지 매칭될 수 있습니다. 이처럼 넓은 조건이 꼭 필요하고 적용 범위를 확인할 수 있을 때만 사용하세요. example.com과 하위 도메인만 대상으로 한다면 접미사 규칙이 일반적으로 의도에 더 잘 맞습니다. 규칙이 짧다고 더 정확한 것은 아니며, 키워드가 적다고 관리가 쉬운 것도 아닙니다.

같은 대상을 매칭하는 세 가지 범위
키워드예시 값사용 목적
DOMAINapi.example.com이름 하나에 예외 적용
DOMAIN-SUFFIXexample.com기본 도메인과 하위 도메인 포함
DOMAIN-KEYWORDexample이름에 포함된 문자열로 매칭

페이지 도메인과 전체 요청 도메인은 다릅니다

한 페이지가 로그인, 이미지, API, 정적 리소스 도메인에 각각 요청을 보낼 수 있습니다. 홈페이지는 열리지만 로그인이 실패하더라도 같은 규칙이 간헐적으로 달리 동작한다는 뜻은 아닙니다. 다른 요청에 다른 정책이 적용되었을 수 있습니다. 문제가 발생한 시점에 요청 기록을 확인해 실제로 실패한 이름을 찾은 뒤 규칙을 추가할지 결정하세요. 타사 리소스 도메인은 여러 서비스에서 함께 사용할 수 있으므로, 한 페이지에 표시된다는 이유만으로 해당 도메인의 모든 요청이 그 페이지와 같은 정책을 사용해야 한다고 판단해서는 안 됩니다.

요청 기록에 IP만 있고 매칭에 사용할 도메인 정보가 없다면 도메인 규칙이 올바른 확인 지점이 아닐 수 있습니다. 이때는 비슷한 도메인 규칙을 더 추가하는 대신 주소 규칙, DNS, 요청 발생 방식을 살펴보세요. 국제화 도메인이나 형식이 특수한 이름도 실제 기록에 표시된 형식을 기준으로 해야 합니다. 수정 후에는 대상 이름뿐 아니라 매칭되면 안 되는 비슷한 이름도 테스트하세요. 그래야 필요한 범위를 포함하면서 경계 밖의 대상은 포함하지 않았는지 확인할 수 있습니다.

04 / ADDRESS AND REQUEST

IP-CIDR, GEOIP, USER-AGENT의 적용 범위

주소 규칙은 네트워크 범위를 표현하는 데 적합하지만 도메인 규칙을 그대로 대체할 수는 없습니다. 같은 도메인이 여러 주소로 해석될 수 있고, 하나의 주소가 여러 도메인에 사용될 수도 있습니다. 두 규칙은 서로 다른 대상을 표현합니다. '특정 도메인에 접속할 때 PROXY 사용'이 목적이라면 먼저 도메인 규칙을 고려하세요. '이 로컬 네트워크 대역에 접속할 때 DIRECT 사용'이 목적이라면 주소 규칙이 더 명확합니다. 주소 규칙의 매칭 여부를 판단하려면 요청의 목적지와 네트워크 경계를 정확히 알아야 합니다.

IP-CIDR: 주소와 접두사 길이를 함께 확인

[Rule]
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
FINAL,PROXY

각 행의 두 번째 필드는 네트워크 주소와 슬래시 뒤의 접두사 길이로 이루어집니다. 192.168.0.0/16은 주소 범위를 뜻하며 192.168.0.0 기기 한 대만 가리키지 않습니다. 10.0.0.0/8과 172.16.0.0/12도 각각 사설 주소 범위입니다. 이 범위에 DIRECT를 적용한 것은 로컬 네트워크 접속의 일반적인 의도를 보여 주는 예시일 뿐, 실제 네트워크가 모두 이 범위를 사용한다는 뜻은 아닙니다. 라우터, 기기, 내부 서비스의 실제 주소를 확인한 뒤 해당 범위를 유지할지 판단하세요.

접두사 길이가 짧을수록 대체로 더 넓은 범위를 포함합니다. 단일 기기의 주소를 넓은 네트워크 대역으로 잘못 작성하면 다른 대상도 함께 매칭됩니다. 문제를 확인할 때는 주소가 해당 네트워크에 속하는지, 마스크가 예상과 맞는지, 규칙이 더 넓은 조건보다 앞에 있는지를 함께 살펴보세요. 한 번 도메인 해석으로 얻은 공인 IP를 해당 서비스의 전체 범위로 간주해 계속 사용하지 마세요. 주소가 바뀌거나 한 번의 근거리 할당 결과에 불과할 수 있습니다. 임시 주소 규칙은 가설을 검증하는 데 유용하지만 장기적인 관리 방법으로는 적합하지 않을 수 있습니다.

IP-CIDR6 및 no-resolve

[Rule]
IP-CIDR6,fc00::/7,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY

IP-CIDR6은 IPv6 주소 범위에 사용하며, 위 예시는 로컬 용도 주소 범위를 작성하는 방법을 보여 줍니다. IPv4 규칙이 IPv6까지 자동으로 포함하지 않으므로 듀얼 스택 대상에서는 실제 사용되는 주소 유형을 먼저 확인해야 합니다. 선택적 매개변수 no-resolve는 해당 IP 규칙을 위해 별도로 도메인 해석을 실행하지 않겠다는 의미입니다. 전역 DNS를 비활성화한다는 뜻도, 요청에서 해석이 절대 발생하지 않는다는 뜻도 아닙니다. 요청에 이미 주소가 있다면 주소 매칭에 사용될 수 있습니다. 사용하기 전에 어떤 단계에서 해석을 막으려는 것인지 이해해야 합니다.

GEOIP: 주소 분류를 이용하며 사용자 위치를 나타내지 않습니다

[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY

GEOIP,CN은 목적지 IP의 지역 분류를 기준으로 매칭합니다. 사용자의 현재 위치나 페이지 언어를 확인해 웹사이트의 소속 지역을 판단하는 방식이 아닙니다. 분류 결과는 앱이 사용하는 데이터에 따라 달라지므로 관련 도메인이 모두 같은 정책으로 처리된다고 보장할 수 없습니다. 분산 인프라를 사용하는 서비스는 실제 주소와 사업장이 위치한 지역이 다를 수 있습니다. 특정 도메인에 고정 정책을 적용하려면 주소 분류에 의존하는 것보다 명시적인 도메인 규칙이 의도를 더 잘 표현하며, 이런 넓은 조건보다 앞에 배치해야 합니다.

GEOIP와 도메인 규칙을 함께 사용할 때는 '조건 충족'과 '최종 적용'을 구분해야 합니다. 도메인 규칙이 위에서 먼저 매칭되면 일반적으로 요청은 아래의 GEOIP 정책까지 진행하지 않습니다. 도메인 규칙이 매칭되지 않을 때 주소 분류가 다음 판단 기준이 될 수 있습니다. 특정 대상에 DIRECT가 적용되지 않는다면 지역 데이터에 문제가 있다고 단정하기 전에 앞선 규칙을 살펴보세요. 주소 분류는 설정의 한 조건일 뿐이며 전체 순서와 분리해 연결 결과를 설명할 수 없습니다.

USER-AGENT: 모든 요청을 식별할 수 있다고 가정하지 마세요

[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY

USER-AGENT는 요청에서 확인할 수 있는 식별 정보를 대상으로 매칭하며, 위 예시는 와일드카드 패턴을 보여 줍니다. 앱 아이콘이나 앱 이름을 기준으로 트래픽을 선택하는 기능이 아니며, 특정 앱의 모든 연결을 포함한다고 보장할 수도 없습니다. 특히 복호화하지 않은 HTTPS 트래픽에서는 요청 헤더를 이런 방식으로 직접 사용할 수 없는 경우가 많습니다. 이 예시를 시험하려고 별도로 복호화를 활성화하지 마세요. 여기의 예시는 그런 설정에 의존하지 않습니다. 요청에 실제로 매칭 가능한 정보가 있을 때만 USER-AGENT를 조건으로 사용하세요.

05 / POLICY

Global Routing과 PROXY, DIRECT, REJECT

Global Routing의 Config, Proxy, Direct는 모드를 선택하는 항목이고, Rule의 PROXY, DIRECT, REJECT는 규칙의 처리 정책입니다. 비슷해 보이지만 서로 다른 계층에 속합니다. 규칙 적용 여부를 확인할 때는 먼저 Global Routing을 살펴보세요. 현재 요청을 Config 방식으로 처리하지 않는다면 Rule을 수정했다고 연결 결과가 바뀐다고 단정할 수 없습니다. 특히 테스트를 위해 Proxy나 Direct로 잠시 전환했다면 사용자 지정 분기를 확인하기 전에 원래 모드로 되돌리세요.

Global Routing 세 가지 모드 확인하기
인터페이스 용어한국어 설명확인할 내용
ConfigConfig활성화된 설정과 Rule 확인
ProxyProxy프록시 연결 경로 비교
DirectDirect현재 네트워크에서 직접 연결되는지 비교

PROXY: 프록시 경로를 사용하지만 원격 연결 성공을 보장하지 않습니다

규칙 정책 PROXY는 현재 프록시를 선택해 연결하려는 의도를 나타냅니다. 서버 주소를 지정하는 값도 아니며 필요한 인증이나 프로토콜 매개변수를 보완하지도 않습니다. 보유한 서버 정보의 주소, 포트, 인증 정보 또는 관련 설정이 잘못되었다면 규칙이 PROXY에 올바르게 매칭되어도 연결에 실패할 수 있습니다. 따라서 요청에 예상한 정책이 적용되었는지와 해당 정책의 연결 경로가 사용 가능한지를 각각 확인해야 합니다. 이 두 확인을 '규칙이 적용되지 않음'이라는 하나의 문제로 뭉뚱그리면 잘못된 방향으로 점검하게 됩니다.

Home에서 선택한 서버도 기록에 포함해야 합니다. 같은 설정 파일을 사용하더라도 서버를 바꾸면 결과가 달라질 수 있으며, 그렇다고 Rule 문법이 바뀐 것은 아닙니다. 사용자 지정 정책이나 그룹은 이름과 실제 연결 대상을 확인하고, 정의되지 않은 이름을 예시에 작성하지 마세요. 이 문서에서는 추가 그룹 정의에 의존하지 않도록 세 가지 기본 정책만 사용합니다. Trojan 매개변수를 더 확인하려면 Trojan 매개변수 안내를 참고하세요. 프로토콜 매개변수 문제를 도메인 규칙 수정으로 해결하려 하지 마세요.

DIRECT: 현재 네트워크에서 직접 연결

DIRECT는 Shadowrocket을 중지하거나 시스템의 VPN 설정을 끈다는 뜻이 아닙니다. 현재 처리 과정에서 대상에 직접 연결하는 방식을 선택합니다. 대상에 접속할 수 있는지는 현재 네트워크, 해석 결과, 서비스 상태에 따라 달라집니다. 로컬 네트워크 대상에 DIRECT를 사용하는 것은 접속 목적에 맞는 경우가 많지만 기기가 해당 네트워크에 연결되어 있어야 합니다. 기기가 같은 네트워크에 없거나 로컬 서비스가 해당 주소에서 요청을 받지 않으면 DIRECT 규칙만으로 존재하지 않는 네트워크 연결을 만들 수는 없습니다.

REJECT: 매칭된 요청을 명시적으로 거부

[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

첫 번째 행은 지정한 이름의 요청을 거부하고, 두 번째 행은 접미사 조건에 맞는 나머지 요청에 PROXY를 적용하며, 마지막 행은 그 밖의 트래픽을 처리합니다. REJECT는 연결을 원하지 않는 대상을 명확히 지정할 때 사용하며, 아직 정하지 못한 최종 정책의 대용으로 쓰지 마세요. 거부한 이름이 로그인, 인증, 콘텐츠 로딩 기능도 담당한다면 페이지 일부에 문제가 생길 수 있습니다. 수정 전에 해당 이름의 용도를 파악하고, 수정 후에는 홈페이지 표시 여부만 보지 말고 주요 기능을 확인하세요.

거부 정책은 페이지의 불필요한 요소를 자동으로 정리해 주지 않습니다. 웹페이지에서 보이는 콘텐츠와 네트워크 요청이 일대일로 대응하는 것도 아니며, 하나의 도메인이 여러 기능을 맡을 수 있습니다. 특정 리소스를 차단하려고 접미사나 키워드 규칙 범위를 지나치게 넓히면 정상 요청까지 영향을 받을 수 있습니다. 정확한 대상부터 시작해 요청 기록으로 조건을 확인한 뒤 범위를 넓힐지 판단하세요. 문제가 생기면 예외 규칙을 계속 추가해 기존 오류를 가리기보다 방금 추가한 거부 규칙부터 되돌리세요.

FINAL: 매칭되지 않은 요청의 처리 방식 지정

FINAL은 매칭 값이 없는 최종 규칙이며, 일반적인 형식은 FINAL,PROXY 또는 FINAL,DIRECT입니다. 전역 모드와는 다른 개념입니다. FINAL은 Config의 규칙 설정에 속하며 앞선 규칙에 매칭되지 않은 요청만 처리합니다. 어느 정책을 선택할지는 원하는 기본 동작에 따라 달라지므로 특정 값이 모두에게 정답이라고 볼 수 없습니다. PROXY를 사용한다면 보유한 서버가 사용 가능한지 확인하세요. DIRECT를 사용한다면 목록에 없는 대상이 직접 연결된다는 점을 고려해야 합니다.

세 모드에서 증상이 다르게 나타나면 바로 결론을 내리지 말고 차이를 기록하세요. Direct에서는 연결되지만 Proxy에서 실패한다면 서버 경로를 확인해야 할 수 있습니다. Proxy에서는 연결되지만 Config에서 실패한다면 적용된 정책과 다른 설정을 점검해야 할 수 있습니다. 세 모드 모두 실패한다면 대상이나 현재 네트워크가 원인일 수도 있습니다. 구체적인 판단에는 연결 기록이 필요하며, 모드 전환 결과만으로 다른 모든 원인을 배제할 수는 없습니다.

06 / FIRST MATCH

매칭 순서와 우선순위: 가장 구체적인 규칙이 자동으로 선택되지는 않습니다

Rule은 위에서 아래로 확인하며 먼저 매칭된 규칙이 해당 요청을 처리합니다. DOMAIN이 DOMAIN-SUFFIX보다 항상 우선한다고 가정하거나 주소 규칙이 도메인 규칙 뒤에 자동으로 배치된다고 생각해서는 안 됩니다. 키워드는 매칭 조건을 설명할 뿐 업무에 맞게 우선순위를 정해 주지는 않습니다. 관리하기 쉬운 설정을 만들려면 명확한 예외를 먼저 두고, 넓은 도메인 범위, 주소 범위와 지역 조건을 차례로 배치한 뒤 마지막에 FINAL을 둘 수 있습니다. 이는 정리 방식일 뿐 앱이 자동으로 적용하는 정렬 규칙은 아닙니다.

반례로 가려진 규칙 찾아보기

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN,private.example.com,DIRECT
FINAL,DIRECT

private.example.com은 앞의 두 조건을 모두 만족하지만 첫 번째 행이 이미 포함하므로 아래의 DIRECT 예외는 의도한 대로 적용되지 않습니다. 두 번째 행을 더 길게 쓰거나 목록 끝에 한 번 더 추가해도 우선순위가 높아지지 않습니다. 더 좁은 예외가 먼저 확인되도록 상대 순서를 바꿔야 합니다. 실제 문제를 조사할 때는 방금 추가한 행만 검색하기보다 파일 맨 위부터 내려가며 대상을 포함할 수 있는 첫 번째 조건을 찾는 것이 효과적입니다.

[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

순서를 조정하면 private.example.com은 정확한 규칙에 먼저 매칭됩니다. 나머지 example.com 도메인은 접미사 규칙에 매칭되고, 그 외 요청은 FINAL로 처리됩니다. 이 결과는 순서와 조건이 함께 작용한 것이며 DOMAIN에 고정된 최우선 순위가 있어서가 아닙니다. 나중에 private을 포함하는 DOMAIN-KEYWORD 규칙을 더 위에 추가하면 결과가 다시 달라질 수 있습니다. 따라서 넓은 조건을 추가할 때마다 새 규칙 자체만 테스트하지 말고 앞뒤에 있는 기존 예외도 확인하세요.

FINAL은 왜 마지막에 있어야 할까요?

FINAL에는 추가로 비교할 도메인이나 주소 조건이 없으며 앞에서 매칭되지 않은 요청을 처리합니다. 다른 업무 규칙보다 앞에 두면 뒤에 있는 규칙이 정상적으로 매칭될 기회를 잃습니다. 설정이 길다면 FINAL이 여러 개 있는지도 꼭 확인하세요. 서로 다른 설정 조각을 합친 파일에는 중간에 이미 최종 규칙이 들어 있을 수 있습니다. 각 조각의 원래 범위를 먼저 파악한 다음 내용을 병합해야 하며, 전체 Rule 목록을 단순히 이어 붙여서는 안 됩니다.

겹치는 주소와 해석 조건도 순서 확인하기

주소 규칙에도 포함 관계가 있습니다. 넓은 네트워크 대역이 좁은 대역을 포함할 수 있고, 지역 조건이 특정 대상 주소를 포함할 수도 있습니다. 별도 범위에 예외를 적용하려면 넓은 조건보다 앞에 배치하세요. 도메인 요청이 주소 규칙에 매칭될 수 있는지는 목적지 주소가 이미 있는지, 매칭을 위해 해석을 허용하는지 등의 조건에도 영향을 받습니다. 따라서 주소가 수학적으로 특정 범위에 속한다는 사실만으로 모든 매칭 현상을 설명할 수는 없습니다. 규칙 순서와 당시 사용할 수 있었던 정보를 함께 확인해야 합니다.

Host의 주소 변경 효과를 Rule 순서 변경으로 착각하지 마세요. Host와 DNS는 이후 사용할 수 있는 주소를 바꿀 수 있고, Rule의 주소 조건은 그 정보를 기준으로 판단합니다. 마찬가지로 URL Rewrite는 특정 도메인 규칙의 우선순위를 자동으로 높이는 도구가 아닙니다. 다른 설정 섹션은 요청 환경에 영향을 줄 수 있지만 Rule 내부의 순서는 별도로 확인해야 합니다. 문제를 살펴볼 때 '조건 입력이 바뀜'과 '규칙 위치가 바뀜'을 구분해 기록해야 인과관계를 혼동하지 않습니다.

매칭 표로 경계 검증하기

위에서 수정한 예시의 예상 결과
테스트 대상예상 매칭 규칙예상 정책
private.example.com정확한 예외DIRECT
www.example.com도메인 접미사PROXY
example.netFINALDIRECT

테스트에는 명확하게 매칭되어야 하는 대상, 인접한 범위에 있는 대상, 매칭되지 않아야 하는 대상을 포함하세요. 첫 번째 대상만 테스트하면 넓은 규칙의 영향을 놓치기 쉽습니다. 예시 도메인은 표를 읽기 위한 것이므로 실제 테스트에서는 직접 확인할 수 있는 대상으로 바꾸고, 해당 요청의 도메인, 주소, 적용된 정책을 기록하세요. 대상이 기존 연결을 재사용하면 새 규칙이 새로운 연결 판단에 적용되지 않았을 수 있으므로 저장하고 활성화한 뒤 요청을 다시 보내세요.

원격에서 가져온 설정이나 긴 설정 파일은 먼저 복사본에서 최소 반례를 구성하는 것이 좋습니다. 대상과 관련된 규칙 몇 개와 FINAL만 남겨 순서를 확인한 다음 수정 내용을 전체 설정에 반영하세요. 최소 반례는 장기적으로 사용할 대체 설정이 아니라 어떤 포함 관계가 문제를 일으켰는지 증명하는 방법입니다. 두세 줄로 문제가 재현되면 규칙을 계속 추가하며 시행착오를 겪지 않아도 이후에 쉽게 관리할 수 있습니다.

07 / HOST AND URL REWRITE

Host 및 URL Rewrite: 주소 매핑과 URL 변경은 별도로 처리

Host는 이름과 주소의 연결을 처리하고, URL Rewrite는 표현식에 맞는 URL을 처리합니다. 둘 다 PROXY나 DIRECT를 선택하는 기능은 아닙니다. 접속이 실패하면 먼저 무엇을 바꾸려는지 명확히 하세요. 같은 도메인을 다른 주소로 해석하려는 것인지, 기존 URL을 새 URL로 리디렉션하려는 것인지, 아니면 연결 경로만 바꾸려는 것인지 구분해야 합니다. 앞의 두 경우는 이 장과 관련이 있을 수 있지만 세 번째는 Rule에서 처리해야 합니다. 트래픽을 분기하려고 Host를 수정하면 주소나 인증서 문제까지 추가될 수 있습니다.

Host의 기본 예시와 적용 범위

[Host]
localhost = 127.0.0.1

왼쪽은 이름, 오른쪽은 주소입니다. localhost와 127.0.0.1은 로컬 루프백의 예시입니다. 여기서 '로컬 기기'는 연결을 시작하는 기기 자신을 뜻하며 라우터나 선택한 프록시 서버가 아닙니다. 원격 서버에 접속해야 하는 서비스에 이 주소를 사용하지 마세요. 매핑을 작성해도 주소 정보만 제공할 뿐 해당 주소에서 필요한 서비스가 자동으로 실행되지는 않습니다. 대상 포트에서 서비스가 수신 대기하지 않거나 네트워크에 연결할 수 없거나 서비스 설정이 맞지 않으면 이름이 주소에 매핑되어도 연결에 실패할 수 있습니다.

실제 도메인의 주소를 고정하기 전에 해당 주소를 누가 관리하는지, 안정적인지, 해당 방식으로 접속해도 되는지 확인하세요. 많은 서비스는 지역과 부하에 따라 주소를 동적으로 반환하므로 그중 하나를 고정하면 기존 분산 처리가 제대로 작동하지 않을 수 있습니다. 매핑 때문에 정상적인 DNS 변경이 보이지 않으면 이후 문제를 확인할 때 해석 서비스가 계속 이전 주소를 반환한다고 오해할 수도 있습니다. Host는 명확하고 직접 관리할 수 있는 매핑에 적합하며 일시적인 해석 결과를 무기한 보관하는 용도로는 적절하지 않습니다.

Host는 TLS 인증을 대신하지 않습니다

HTTPS 연결에는 요청 도메인과 인증서 등의 조건도 관련됩니다. 도메인을 특정 주소로 매핑해도 그 주소가 해당 도메인에 맞는 서비스를 제공한다는 뜻은 아니며 인증서 이름 불일치를 자동으로 해결하지도 않습니다. TLS 오류가 발생하면 대상 이름, 주소, 서버 설정을 확인하고 인증서 검증을 끄는 방법을 일반적인 해결책으로 사용하지 마세요. 테스트가 끝나 더 이상 매핑이 필요하지 않다면 삭제하고 연결을 다시 시작한 뒤 실제 주소를 확인하세요. 그래야 이전 설정이 다른 진단에 영향을 주지 않습니다.

URL Rewrite의 세 가지 구성 요소

[URL Rewrite]
^http://example\.com/ https://example.com/ 302

이 행은 매칭 표현식, 대체 대상, 리디렉션 상태 코드 순으로 구성됩니다. 처음의 ^는 문자열 시작 위치부터 매칭한다는 의미입니다. example 뒤의 백슬래시는 마침표를 일반 문자로 처리합니다. 이를 생략하면 정규식에서 마침표는 보통 임의의 문자 하나를 뜻해 매칭 범위가 넓어집니다. 마지막 슬래시도 조건의 일부입니다. 여기서는 임시 리디렉션을 보여 주기 위해 302를 사용했으며, 이 설정이 모든 HTTP 접속을 해결하거나 기존 URL의 경로와 쿼리 매개변수를 자동으로 보존한다고 볼 수는 없습니다.

예시의 대체 대상은 고정 URL이며 매칭된 URL의 나머지 부분을 명시적으로 보존하지 않습니다. 실제 요구 사항에 경로나 쿼리 매개변수가 포함된다면 캡처 범위와 대체 방식을 먼저 설계한 뒤 통제 가능한 몇 가지 대상으로 테스트하세요. 시작 도메인이 같다는 이유만으로 로그인 콜백, API 요청, 일반 페이지를 모두 사이트 홈으로 리디렉션해서는 안 됩니다. 범위가 너무 넓은 재작성은 요청의 의미를 바꾸거나 리디렉션 루프를 일으킬 수 있습니다. 재작성된 대상이 다른 재작성 조건에도 해당한다면 상호 작용도 확인해야 합니다.

HTTPS에서 확인할 수 있는 정보의 한계

HTTPS 연결에서는 전체 경로와 요청 내용이 대개 암호화되므로 URL Rewrite만 추가해 모든 암호화된 요청에 적용할 수 있다고 가정해서는 안 됩니다. 이 장에서는 HTTPS 복호화 설정을 요구하지 않으며 규칙 분기의 전제 조건으로 인증서 설치를 요구하지도 않습니다. 도메인에 따라 연결 방향만 정하려는 경우 도메인 규칙을 사용하면 되며 전체 URL을 확인하기 위해 다른 설정을 추가할 필요는 없습니다. 기능이 적용되는지는 실제로 볼 수 있는 요청 정보와 앱이 지원하는 처리 조건을 기준으로 판단하세요.

두 설정 섹션을 테스트할 때는 되돌리는 단계도 포함하세요. 기존 값을 먼저 기록하고 매핑이나 재작성 규칙 하나를 추가해 대상 동작을 확인한 다음, 변경을 취소하고 다시 테스트해 증상이 변경에 따라 일관되게 달라지는지 살펴보세요. 취소한 뒤에도 문제가 남아 있다면 항목을 계속 추가하기보다 캐시, 기존 연결, 대상 서비스의 변경 여부를 확인하세요. 전체 파일에서 네 섹션의 관계를 다시 살펴보려면 설정 파일 구조 해설을 참고하세요. 이 장에서는 영향을 설명하고 검증할 수 있는 범위로 제한하는 것을 원칙으로 합니다.

08 / CHANGE AND VERIFY

설정 수정 및 문제 해결: 반복 가능한 검증 절차 만들기

규칙이 올바르다는 판단과 접속에 성공했다는 판단은 서로 관련이 있지만 동일하지 않습니다. 올바른 규칙이 일시적으로 사용할 수 없는 경로를 선택할 수도 있습니다. 접속에 한 번 성공했더라도 캐시나 기존 연결 덕분일 수 있어 새 규칙이 적용되었다는 증거가 아닐 수 있습니다. 신뢰할 수 있는 검증을 위해 테스트 조건을 고정하고 원본 설정을 보관하며 한 번에 하나의 요소만 변경하고 새 요청 결과를 기록하세요. 이 장에서는 앞서 살펴본 규칙을 되돌릴 수 있는 절차로 정리합니다. 특정 도메인 오류, 수정 후 변화 없음, 설정 업데이트 후 동작 변경 등에 활용할 수 있습니다.

1단계: 기준 상태를 기록하고 설정은 변경하지 않기

먼저 현재 네트워크 유형, Global Routing, 활성화된 파일, 선택된 서버를 기록한 뒤 어떤 작업에서 문제가 발생하는지 설명하세요. '작동하지 않음'이라고만 쓰지 말고 홈페이지가 열리지 않는지, 이미지가 표시되지 않는지, 로그인이 실패하는지, API 요청이 실패하는지, 로컬 네트워크 기기에 접속할 수 없는지 구분해야 합니다. 반복해서 재현할 수 있는 동작을 정하고 가능한 한 같은 대상을 사용하세요. 원래 문제가 간헐적으로 발생한다면 기준 상태를 여러 번 관찰해야 합니다. 그렇지 않으면 수정 후의 우연한 성공을 해결 효과로 오해하기 쉽습니다.

2단계: 복사본을 저장하고 수정 범위를 좁히기

Config에서 원본 파일을 보관한 뒤 복사본을 편집하세요. 관련 섹션에 비슷한 규칙이 이미 있는지, 조건이 중복되었는지, FINAL이 앞쪽에 있는지 확인합니다. 도메인 하나의 문제라면 광범위한 키워드를 바로 추가하지 말고 가장 범위가 좁은 DOMAIN 예외부터 추가하세요. DNS를 조정할 때는 Rule을 이동하지 말고, Host를 조정할 때는 서버를 바꾸지 마세요. 그래야 결과가 달라졌을 때 하나의 명확한 변경 사항과 연결해 원인을 파악할 수 있습니다.

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY

이 부분 설정 예시는 정확한 예외를 검증하기 위한 것입니다. api.example.com에는 PROXY를 적용하고, 접미사에 해당하는 다른 이름에는 DIRECT를 적용하며, 나머지 요청은 최종 정책으로 처리합니다. 각 행의 의미를 확인한 다음 자신의 대상과 예상 정책을 대응시키세요. 예시 도메인으로 실제 연결 상태를 테스트하지 말고, 이미 존재하는 FINAL 뒤에 조각 전체를 추가하지도 마세요. 현재 파일 구조가 복잡하다면 복사본에서 최소 재현부터 진행하고 논리가 맞는지 확인한 뒤 장기간 유지할 설정에 반영하세요.

3단계: 저장하고 활성화한 다음 새 요청 보내기

편집을 마친 뒤 저장 상태를 확인하고 Config로 돌아가 활성화된 항목을 확인한 다음 Global Routing을 Config로 설정하세요. 대상 작업을 다시 실행하고, 기존 연결 재사용이 관찰에 미치는 영향을 줄여야 한다면 연결을 끊었다가 다시 연결합니다. 다시 연결해도 모든 앱 캐시가 사라지는 것은 아니므로 요청 기록에서 새 네트워크 요청이 발생했는지 확인해야 합니다. 테스트 중에는 '페이지에 변화가 없음'을 '규칙에 변화가 없음'과 동일하게 보지 마세요. 페이지가 관련 리소스를 다시 요청하지 않았을 수도 있습니다.

4단계: 연결보다 매칭부터 확인하기

요청에 예상한 정책이 적용되지 않았다면 Rule의 위쪽부터 범위 관계, 실제 호스트 이름, 주소 유형, Global Routing을 확인하세요. 정책은 예상대로인데도 연결에 실패한다면 선택된 서버, 프로토콜 정보, DNS, 대상 응답을 점검합니다. 특정 네트워크에서만 실패하면 네트워크 조건을 비교하고, 특정 서버에서만 실패하면 서버 연결 결과를 비교하세요. 정책이 이미 올바른데도 반복 규칙을 추가하지 마세요. 중복 항목은 인증 오류, 연결할 수 없는 주소, 대상 서비스의 문제를 해결하지 못합니다.

관찰 결과에 따라 다음 단계 선택
관찰 결과우선 확인할 항목아직 확대하지 말아야 할 항목
정책이 예상과 다름모드, 파일, 조건 및 순서서버 매개변수 변경
정책은 맞지만 연결 실패연결 경로, 해석 결과, 대상중복 분기 규칙
수정 후 새 기록이 없음새 요청이 발생했는지, 기존 연결을 재사용했는지규칙의 매칭 범위
업데이트 후 동작이 달라짐파일 내용과 활성화된 항목의 차이근거 없는 전체 교체

5단계: 인접한 대상도 다시 확인하고 복구 기록 남기기

대상이 정상적으로 복구된 뒤에도 같은 접미사에 속하는 다른 요청, 해당 범위에 속하지 않는 대상, 영향을 받을 수 있는 로컬 네트워크 접속을 확인하세요. 최종 정책을 수정했다면 매칭되지 않은 모든 요청의 경로가 바뀔 수 있으므로 더 넓게 회귀 테스트를 해야 합니다. 기록에는 어느 행을 왜 수정했는지, 어떻게 검증했는지, 어떻게 되돌릴 수 있는지를 포함하세요. 민감한 요청 내용을 전부 저장할 필요는 없습니다. 장기적으로 유지하는 설정의 가치는 수정한 당일에 동작하는 것뿐 아니라 나중에도 이유를 이해할 수 있다는 데 있습니다.

원인을 찾지 못했다면 켜져 있는데 연결되지 않을 때의 점검 순서를 따라가거나 문제 해결에서 관련 항목을 찾아보세요. 가져오기와 연결 절차를 다시 확인하려면 빠른 시작 가이드를 참고하세요. 구매 및 기기 호환성은 App Store 정품 안내에서 확인할 수 있습니다. 시스템 요구 사항과 유니버설 구매 여부는 App Store 페이지의 표기를 기준으로 합니다. 규칙 문제를 해결하기 위한 단계로 클라이언트를 다시 구매하지 마세요.