서비스 제공업체에서 받은 WireGuard 매개변수를 보유하고 있으며 Shadowrocket에 직접 설정하려는 사용자를 위한 안내입니다. 먼저 기기와 Peer의 키를 구분하고 Address, Endpoint, MTU를 확인한 다음 Global Routing과 연결 상태를 살펴보세요. 예시 주소는 형식 설명용이며 실제 서비스에 사용할 수 없습니다. 문제를 확인할 때 PrivateKey나 전체 설정을 공개할 필요는 없습니다.
1. 추가하기 전에 각 매개변수가 어느 쪽에 해당하는지 확인
Shadowrocket은 iPhone과 iPad를 중심으로 제공되는 Apple 플랫폼용 유료 앱입니다. 유일한 구매 및 다운로드 경로는 App Store이며, 개발자는 Shadow Launch Technology Limited이고 앱 ID는 932747118입니다. 일회성 구매 방식입니다. 시스템 요구 사항은 App Store 페이지를 기준으로 확인하세요. 앱 구매와 회선 요금제는 별개입니다. 이 사이트는 서버나 구독을 제공하거나 판매하거나 추천하지 않습니다.
WireGuard는 키를 사용해 통신 상대를 식별합니다. 설정에서 [Interface]는 일반적으로 기기를, [Peer]는 원격 기기를 나타냅니다. Shadowrocket의 서버 편집 화면은 원본 설정 파일 편집기가 아니므로 항목이 나뉘어 표시될 수 있습니다. 각 필드의 의미에 맞게 입력하고, 설정 파일 전체를 한 필드에 붙여 넣지 마세요.
시작하기 전에 기기의 PrivateKey와 Address, 원격 PublicKey와 Endpoint, 그리고 서비스 제공업체가 요구하는 기타 매개변수를 준비하세요. 설정에 PresharedKey가 있다면 함께 보관해야 합니다. PublicKey 하나나 서버 주소 하나만으로는 설정을 완료할 수 없습니다. 서버에도 기기의 PrivateKey에 대응하는 PublicKey를 등록하고 해당 터널 주소를 허용해야 합니다.
2. Home에서 WireGuard 서버 추가
원본 매개변수를 보관한 뒤 별도의 테스트 항목을 만드세요. 아래 경로는 영어 인터페이스 이름을 기준으로 설명하며, 필드 배열은 현재 앱 버전에 따라 다를 수 있습니다. WireGuard 원본 설정을 Subscribe 링크로 추가하지 마세요. 기존 구독에 포함된 다른 프로토콜의 매개변수를 WireGuard로 바로 변환할 수 있다고 가정해서도 안 됩니다.
-
추가 화면 열기
Home으로 이동 → 오른쪽 상단의 “+” 선택 → Type에서 WireGuard를 선택합니다. Subscribe 항목이 아니라 단일 서버 기록을 편집하고 있는지 확인하세요.
-
원격 정보 입력
Endpoint에 해당하는 호스트와 포트를 서버 주소 및 포트 필드에 입력합니다. 예를 들어
vpn.example.com:51820은 호스트가vpn.example.com, 포트가51820임을 뜻합니다. 입력란이 분리되어 있다면 호스트 필드에 포트를 다시 붙이지 마세요. -
기기 정보 입력
원본 설정에 따라 PrivateKey와 Address를 입력합니다. Address는 기기에 할당된 터널 주소로, Endpoint나 현재 Wi-Fi의 로컬 네트워크 주소가 아닙니다.
-
Peer 확인
해당 필드에 원격 PublicKey를 입력합니다. 서비스 제공업체의 설정에 PresharedKey가 명시된 경우에만 해당 항목을 입력하세요. PublicKey로 대신하거나 임의의 값을 추가하지 마세요.
-
저장 후 테스트
원본 설정에 따라 MTU 등 사용 가능한 필드를 확인한 뒤 저장합니다. Home으로 돌아가 방금 추가한 항목을 선택하세요. 첫 테스트에서는 Global Routing → Proxy를 임시로 선택한 다음 Home의 연결 스위치를 켤 수 있습니다. 시스템 VPN 설정을 처음 생성할 때는 시스템 안내에 따라 승인하세요.
3. PrivateKey, PublicKey, Peer의 관계
키 설정에서 가장 흔한 오류는 길이가 아니라 통신 양쪽의 키를 뒤바꿔 입력하는 것입니다. PrivateKey는 기기에 보관하고, Peer의 PublicKey는 원격 기기를 식별하는 데 사용합니다. 서버 설정에는 기기의 PublicKey를 등록해야 합니다. 양쪽에서 Peer가 가리키는 대상은 서로 반대이므로 서버의 Peer 매개변수 전체를 기기의 Peer 항목에 그대로 입력하면 안 됩니다.
기기 매개변수
- PrivateKey
- 기기의 개인 키입니다. 서버에 등록한 기기의 PublicKey와 한 쌍이어야 합니다.
- Address
- 기기에 할당된 터널 주소입니다. 예:
10.7.0.2/32. 실제 할당된 값을 사용하세요. - MTU
- 터널 인터페이스에서 허용하는 최대 IP 패킷 길이입니다. 우선 원본 설정을 따르세요.
PrivateKey와 Address는 기기 측 매개변수이며 원격 Endpoint를 기준으로 추정하지 않습니다.
Peer 매개변수
- PublicKey
- 원격 공개 키입니다. 실제로 연결하는 서버의 개인 키와 한 쌍이어야 합니다.
- Endpoint
- 연결할 수 있는 원격 호스트와 UDP 포트입니다. 예:
vpn.example.com:51820. - PresharedKey
- 선택 사항인 추가 공유 키입니다. 사용한다면 양쪽에 동일한 값을 입력해야 합니다.
Peer는 통신 상대를 뜻하며, 구독 그룹이나 규칙 정책 그룹을 의미하지 않습니다.
표준 WireGuard 키의 Base64 텍스트는 보통 44자이며 끝에 =가 붙습니다. 이 특징은 잘림이나 복사 오류를 확인하는 데만 도움이 되며, 키가 올바르게 짝을 이루는지를 보장하지는 않습니다. 복사할 때 끝 문자를 유지하고 실수로 포함된 공백, 줄 바꿈, 따옴표는 제거하세요. PrivateKey = 같은 필드 이름을 값에 함께 입력하지 마세요.
- PrivateKey를 바꾼 뒤 연결되지 않음: 개인 키를 바꾸면 기기의 PublicKey도 달라집니다. 서버에 새 키를 등록하지 않으면 새 신원으로 기존 설정에 연결할 수 없습니다.
- 두 번째 기기에 복사한 뒤 연결이 불안정함: 여러 기기가 같은 키 신원을 동시에 사용하면 원격 측에 학습된 통신 주소가 계속 바뀔 수 있습니다. 각 기기에 별도의 신원과 주소를 서비스 제공업체에서 할당받으세요.
- PresharedKey를 비워 둔 뒤 연결되지 않음: 원격 측에서 이 항목을 요구한다면 기기에도 완전히 동일한 값을 입력해야 합니다. 임의로 생략할 수 있는 메모가 아닙니다.
4. Address, Endpoint, AllowedIPs를 혼동하지 마세요
Address는 터널 내부의 기기 주소이고 Endpoint는 터널 외부의 원격 접속 지점입니다. 예를 들어 10.7.0.2/32에서 슬래시 뒤의 숫자는 CIDR 접두사 길이이지 포트가 아닙니다. 이를 10.7.0.2:32로 바꾸지 마세요. 서비스 제공업체가 IPv4와 IPv6를 모두 할당했다면 각각 해당 필드에 입력하고, 비슷해 보이는 주소를 임의로 만들지 마세요.
| 필드 | 형식 예시 | 확인할 사항 |
|---|---|---|
| Address | 10.7.0.2/32 | 기기의 터널 주소입니다. 서버에서 할당한 값과 일치해야 합니다. |
| Endpoint | vpn.example.com:51820 | 호스트 이름이 해석 가능하고 UDP 포트가 원격 측의 수신 포트와 일치해야 합니다. |
| IPv6 Endpoint | [2001:db8::1]:51820 | 호스트와 포트를 조합한 예시입니다. 필드가 분리되어 있으면 각각 해당 필드에 입력하세요. |
| AllowedIPs | 0.0.0.0/0, ::/0 | 원본 WireGuard 설정의 Peer 주소 범위입니다. Shadowrocket의 Rule 텍스트가 아닙니다. |
| DNS | 10.7.0.1 | 형식 예시일 뿐입니다. 실제 주소는 현재 라우팅을 통해 연결할 수 있어야 합니다. |
위의 도메인과 주소는 문법을 설명하기 위한 예시이며 연결에 사용할 수 없습니다. Endpoint에 https://를 붙이거나 구독 경로를 입력하지 마세요. 원본 Endpoint가 도메인을 사용한다면 터널을 연결하기 전에 해당 도메인을 해석할 수 있어야 합니다. 따라서 “연결 후 어떤 DNS를 사용할지”와 “연결 전에 Endpoint를 해석할 수 있는지”는 서로 다른 문제입니다.
원본 WireGuard 설정에서 AllowedIPs는 Peer의 송신 경로 선택과 수신 소스 주소 확인에 사용됩니다. 클라이언트에서 흔히 사용하는 0.0.0.0/0과 ::/0은 각각 모든 IPv4 및 IPv6 주소 범위를 뜻합니다. 서버에서는 특정 클라이언트의 Peer에 해당 클라이언트에 할당된 주소만 허용하는 경우가 많습니다. 양쪽에 같은 범위를 기계적으로 입력하면 안 됩니다. Shadowrocket에서 트래픽을 해당 서버로 보낼지는 Global Routing, 현재 Config, 정책 선택에도 달려 있습니다. AllowedIPs를 앱 내 트래픽 분할 규칙으로 보면 안 됩니다.
5. MTU와 PersistentKeepalive 조정 시 유의점
MTU는 대역폭 수치가 아닙니다. WireGuard 캡슐화에는 외부 데이터 오버헤드가 추가되므로 터널 내부에서 허용할 패킷 길이는 실제 경로에 맞춰야 합니다. 원본 설정에 MTU가 지정되어 있다면 우선 그대로 입력하고, 지정되어 있지 않다면 앱의 기본 처리 방식을 유지하세요. 웹페이지 하나가 느리게 열린다는 이유로 MTU, DNS, 포트, 키를 한꺼번에 바꾸면 어떤 변경이 영향을 주었는지 판단할 수 없습니다.
- MTU를 확인할 시점: 연결은 되지만 작은 요청은 정상이고 큰 응답은 계속 멈추는 경우 경로 MTU를 점검할 수 있습니다. 패킷 손실이나 원격 측 문제도 원인일 수 있으므로 한 번의 로딩 실패만으로 결론을 내려서는 안 됩니다.
- 한 번에 한 항목씩 테스트하는 방법: 먼저 원래 값을 기록하세요. 원래 값이
1420이라면 서비스 제공업체가 허용하는 범위에서 잠시1380으로 바꾼 뒤 다시 연결하고 같은 사이트에 접속해 결과를 비교할 수 있습니다. 두 값은 테스트 예시일 뿐 보편적인 최적값이 아닙니다. - IPv6 처리 방법: 시행착오를 위해 값을 임의로
1280미만으로 낮추지 마세요. IPv6에는 링크 MTU 최솟값이 있으므로 IPv6를 사용하는 경우 서버 설정과 실제 경로를 함께 확인해야 합니다. - 원래 값으로 복원하는 방법: 변경 후 재현 가능한 개선이 없다면 원래 값으로 되돌리세요. 특정 네트워크 환경에서 효과가 있었던 값을 모든 기기와 네트워크에 그대로 적용하지 마세요.
PersistentKeepalive는 주기적으로 연결 유지 패킷을 보내는 기능으로, NAT 매핑을 유지할 때 흔히 사용됩니다. 대역폭을 높이는 기능은 아닙니다. 원본 설정의 PersistentKeepalive = 25는 약 25초마다 연결 유지 패킷을 보낸다는 뜻입니다. 이는 일반적인 설정 예시일 뿐 Shadowrocket의 고정 기본값이 아닙니다. 현재 화면에 해당 필드가 있고 서비스 제공업체가 입력을 요구하는 경우에만 안내된 값으로 설정하세요. 이 줄 전체를 다른 매개변수 필드에 입력하지 마세요.
6. Global Routing으로 프로토콜 문제와 규칙 문제 구분하기
WireGuard 항목을 저장하면 서버 매개변수 설정이 완료됩니다. Home에서는 서버를 선택하고 연결하며, Config에서는 규칙을 설정하고, Settings에는 On Demand 등의 설정이 있습니다. 문제를 확인할 때는 같은 서버, 같은 대상, 같은 네트워크를 유지한 채 Global Routing의 옵션을 비교하세요. 서버를 바꾼 뒤 나타난 현상을 모두 규칙 문제로 돌리지 마세요.
Proxy
권장이번 초기 점검에 사용하세요. Shadowrocket에 전달되는 일반 트래픽을 Proxy 방식으로 처리해 Config 규칙의 영향을 줄입니다. 테스트할 WireGuard 항목이 선택되어 있는지도 확인해야 합니다. 이 옵션으로 잘못된 키나 연결할 수 없는 Endpoint를 해결할 수는 없습니다.
적합한 경우: WireGuard 매개변수와 원격 측의 트래픽 전달 기능을 먼저 확인할 때
Config
현재 Config에 설정된 규칙과 정책에 따라 트래픽을 처리합니다. Proxy에서는 대상에 접속되지만 Config에서는 문제가 발생한다면 규칙 순서, 적용된 정책, 정책에서 실제로 선택한 서버를 확인하세요. 바로 키를 다시 생성할 필요는 없습니다.
적합한 경우: 매개변수 확인 후 규칙에 따른 트래픽 분할과 항목별 점검을 할 때
Direct
일반 트래픽을 직접 연결합니다. 이 상태에서 대상에 접속할 수 있다는 사실은 직접 연결 경로가 작동한다는 뜻일 뿐 WireGuard 터널이 작동한다는 증거는 아닙니다. WireGuard의 외부 연결 결과를 확인할 때도 적합하지 않습니다.
적합한 경우: 직접 연결 시의 네트워크 상태와 비교할 때
Global Routing에서는 Scene을 사용해 상황별로 라우팅 설정을 전환할 수도 있습니다. 초기 점검에서는 옵션을 고정해 Scene 조건이 테스트 경로를 바꾸지 않도록 하세요. 아래는 Config의 [Rule] 섹션 문법 예시이며 WireGuard 서버 매개변수가 아닙니다. 테스트 전에 현재 Config를 백업하고 설정 파일 전체를 바로 덮어쓰지 마세요.
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
규칙은 위에서부터 순서대로 적용됩니다. DOMAIN-SUFFIX는 도메인 접미사를, IP-CIDR은 주소 범위를, GEOIP는 IP 지리 데이터베이스를 기준으로 일치 여부를 확인하며, FINAL은 앞선 규칙에 해당하지 않는 트래픽을 처리합니다. 예시에서는 example.com의 하위 도메인이 첫 번째 줄에 먼저 일치합니다. 나머지 트래픽이 모두 직접 연결되는 것은 아니며 아래 규칙을 계속 확인합니다. PROXY가 최종적으로 사용하는 서버는 앱에서 확인해야 합니다.
7. 증상에 맞춰 문제 확인 정보를 제공하고 개인 키는 공유하지 않기
위 단계를 마친 후에도 “원격 측과 정상적으로 통신할 수 없는 경우”와 “터널을 통한 트래픽은 있지만 대상에 접속할 수 없는 경우”를 구분해야 합니다. 전자는 키, Endpoint, UDP 연결 가능 여부를 먼저 확인하고, 후자는 DNS, 서버 측 트래픽 전달, AllowedIPs, MTU를 점검하세요. WireGuard는 유효하지 않은 요청에 읽을 수 있는 오류를 반환하지 않을 수 있으므로 화면에 오류가 없다고 해서 모든 필드가 올바른 것은 아닙니다.
| 관찰된 증상 | 우선 확인할 항목 | 다음 단계 |
|---|---|---|
| 요청을 보낸 뒤 송신량만 증가함 | Endpoint, UDP 경로, Peer 키, PresharedKey | 원본 매개변수를 확인하고 서비스 제공업체에 서버가 요청을 수신했는지 문의하세요. |
| 연결 후 대부분의 도메인에 접속할 수 없음 | DNS 연결 여부, 해석 결과, 현재 라우팅 | 실패한 도메인과 발생 시간을 기록하고 이름 해석 실패와 대상 연결 실패를 구분하세요. |
| Proxy에서는 정상이나 Config에서는 문제가 발생함 | Config 규칙 적용 여부와 정책 선택 | 대상에 적용된 규칙과 PROXY에서 선택한 서버를 확인하세요. |
| 한동안 사용하지 않은 뒤 요청이 실패함 | NAT 매핑, 네트워크 전환, 연결 유지 설정 | 재연결 결과와 비교한 다음 서비스 제공업체에 PersistentKeepalive 설정을 확인하세요. |
| 작은 요청은 성공하지만 큰 응답은 멈춤 | 경로 MTU, 패킷 손실, 서버 측 트래픽 전달 | 한 번에 매개변수 하나만 바꾸고 같은 요청의 변경 전후 결과를 기록하세요. |
서비스 제공업체에 문의할 때는 장애 발생 시간, Wi-Fi 또는 셀룰러 네트워크 여부, 현재 Global Routing 설정, 민감 정보를 가린 Endpoint, 송수신량 변화 여부, 한 번에 한 항목씩 테스트한 결과를 전달할 수 있습니다. PrivateKey, PresharedKey, 전체 설정 파일, 인증 정보가 포함된 구독 링크는 보내지 마세요. 키가 유출되었다면 기록 이름만 바꾸지 말고 새 신원을 발급받아 이전 설정을 폐기하세요.
- 테스트가 끝나면 원래 Global Routing 설정으로 되돌리고 현재 Config와 서버 선택을 확인하세요.
- 자동 연결이 필요하다면 Settings → On Demand에서 설정을 복원한 후 Wi-Fi와 셀룰러 네트워크에서 각각 동작을 확인하세요.
- 필요한 매개변수 변경 내역은 보관하되 키를 공개 메모, 스크린샷 또는 공개 토론에 붙여 넣지 마세요.