WireGuard를 설정할 때는 먼저 기기와 상대 Peer의 키, 외부 접속 주소를 구분한 뒤 터널 주소와 트래픽 범위를 확인해야 합니다. 직접 구성한 서버나 서비스 제공업체의 설정을 보유한 사용자를 위해 Shadowrocket에서 각 항목을 입력하고 연결을 확인하는 방법, 핸드셰이크·라우팅·DNS·MTU 순으로 문제를 점검하는 방법을 설명합니다. 예시 주소는 항목 설명용이며 실제 연결에 사용할 수 없습니다.
1. 추가하기 전에 Interface와 Peer 구분하기
Shadowrocket의 WireGuard 설정은 서버 주소 하나만으로 완료되지 않습니다. 일반적인 WireGuard 설정은 정보를 [Interface]와 [Peer]로 나눕니다. 전자는 기기의 키와 터널 주소를, 후자는 통신 상대의 공개 키와 접속 주소, 허용된 주소 범위를 나타냅니다. 두 항목의 키를 서로 바꿔 입력하면 주소와 포트가 정확해도 정상적으로 인증할 수 없습니다.
이 글은 사용자가 서비스 제공업체의 설정을 이미 보유하고 있다는 전제에서 설명합니다. 추가하기 전에 서로 일치하는 전체 설정을 확보해야 합니다. Endpoint만 있고 기기의 PrivateKey나 상대의 PublicKey가 없으면 사용할 수 있는 설정이 아닙니다. Shadowrocket은 유료 상용 앱이며, 앱 구매는 회선 요금제가 아닙니다. 앱을 구매해도 사용할 수 있는 WireGuard Peer가 자동으로 생성되지는 않습니다.
항목 구분: 기기와 통신 상대
Interface: 기기
PrivateKey: 기기의 개인 키로, 외부에 공개하면 안 됩니다.Address: 기기에 할당된 터널 IP이며, 보통 프리픽스 길이를 포함합니다.MTU: 터널 인터페이스의 패킷 크기 설정입니다.DNS: 일부 설정 파일에 포함된 DNS 리졸버 설정으로, WireGuard 핸드셰이크 매개변수는 아닙니다.
Peer: 통신 상대
PublicKey: 원격 Peer의 공개 키이며, 기기의 공개 키가 아닙니다.Endpoint: 원격에서 접속할 수 있는 도메인 또는 IP와 UDP 포트입니다.AllowedIPs: 이 Peer에 연결되는 주소 범위입니다.PresharedKey: 선택 항목인 사전 공유 키로, 양쪽 값이 일치해야 합니다.
먼저 원본 설정을 역할별로 정리한 다음 항목을 입력하세요. 이름이 비슷하다고 키를 서로 바꾸면 안 됩니다.
2. Home에서 WireGuard 추가하고 원본 설정 보관하기
직접 추가하려면 Home → 오른쪽 위 ‘+’ → Type → WireGuard 순서로 이동합니다. 다른 프로토콜 양식에 WireGuard 매개변수를 입력하지 않도록 프로토콜을 먼저 선택하세요. 아래에서는 WireGuard 설정 파일의 표준 항목명을 기준으로 입력 방법을 설명합니다. 앱 양식에서 Endpoint가 주소와 포트로 나뉠 수 있으며, 실제 표시 항목은 현재 앱을 기준으로 확인하세요.
-
설정 정리
원본 설정을 따로 보관하고 Interface의 PrivateKey와 Address, Peer의 PublicKey, Endpoint, AllowedIPs를 각각 표시해 두세요. PresharedKey가 있다면 함께 기록하되 공개 메모나 스크린샷에는 넣지 마세요.
-
프로토콜 선택
Home → ‘+’ → Type → WireGuard로 이동합니다. 먼저 Type을 확인한 다음 매개변수를 입력하세요. 설정 파일 전체를 서버 주소 입력란에 붙여 넣으면 안 됩니다.
-
접속 주소 입력
Endpoint의 호스트와 포트를 각각 입력합니다. 예를 들어
192.0.2.10:51820은 호스트192.0.2.10, 포트51820을 뜻합니다. 이 문서의 예시 주소는 실제 접속 주소로 사용할 수 없습니다. -
인증 정보 입력
기기의 PrivateKey, 상대 Peer의 PublicKey, 할당된 Address를 입력한 다음 원본 설정에 따라 AllowedIPs와 선택 항목을 처리합니다. 키에 따옴표나 항목명, 줄바꿈을 포함하지 마세요.
-
저장 후 확인
저장한 뒤 Home으로 돌아가 해당 설정을 선택하고 Global Routing을 확인한 다음 연결을 켭니다. 처음으로 시스템 VPN 설정 권한 요청이 표시되면 앱을 확인하고 시스템 안내를 따르세요. 접근이 허용된 것으로 확인된 대상에 요청을 보내 연결 상태를 점검합니다.
3. PrivateKey와 PublicKey: 길이가 맞아도 짝이 맞는 것은 아닙니다
PrivateKey는 기기 인증에 사용되며, 이에 대응하는 기기의 PublicKey를 원격 Peer 설정에 등록해야 합니다. Shadowrocket에 입력하는 Peer PublicKey는 원격에서 받은 키여야 합니다. 양쪽이 서로의 개인 키를 교환하는 것이 아니라 각자 자신의 개인 키를 보관하고 상대의 공개 키로 상대를 식별합니다.
위 길이는 명백한 복사 오류를 확인하는 기준일 뿐, 키가 유효하거나 같은 연결에 속한다는 것을 보장하지 않습니다. 끝의 =는 Base64 패딩일 수 있으므로 임의로 삭제하지 마세요. 채팅 앱의 서식 때문에 추가된 공백, 따옴표, 줄바꿈은 키의 일부가 아닙니다. 모양이 비슷한 문자로 누락된 내용을 임의로 채우는 것도 피하세요.
- 기기의 공개 키를 잘못 사용한 경우: Peer PublicKey에 기기의 공개 키를 입력했다면 연결을 계속 새로 만들기보다 원본 설정에서 원격 공개 키를 다시 확인하세요.
- 기기 개인 키만 교체한 경우: 새 PrivateKey에 대응하는 기기의 PublicKey도 바뀝니다. 인증 정보가 일치하도록 원격 설정에도 새 공개 키를 등록해야 합니다.
- 사전 공유 키를 빠뜨린 경우: 원본 설정에 PresharedKey가 있다면 양쪽 공개 키와 개인 키만 입력해서는 안 됩니다. 해당 값이 일치하지 않아도 인증이 실패합니다.
- 여러 기기에서 같은 인증 정보를 사용한 경우: 여러 기기에서 같은 인증 정보를 동시에 사용하면 원격에서 받은 인증 데이터에 따라 Endpoint가 갱신되어 연결이 서로 영향을 줄 수 있습니다. 설정 관리 담당자에게 기기별 Peer와 터널 주소를 따로 할당받으세요.
4. Endpoint, Address, AllowedIPs의 역할
Endpoint는 통신을 시작할 때 접속하는 외부 주소이고, Address는 기기가 터널 안에서 사용하는 주소입니다. 두 항목은 서로 바꿔 쓸 수 없습니다. 예를 들어 원격의 공인 접속 주소에 포트 51820을 사용하더라도 기기의 Address에 해당 포트를 포함할 필요는 없습니다. WireGuard는 UDP를 사용합니다. 접속 지점에서 TCP만 허용한다면 같은 포트 번호를 입력해도 UDP 연결을 대신할 수 없습니다.
| 항목 | 예시 또는 형식 | 확인할 사항 |
|---|---|---|
| Endpoint | 192.0.2.10:51820 | 문서용 예시입니다. 실제 호스트와 UDP 포트는 설정 담당자가 제공해야 합니다. 51820은 흔히 사용되는 값이지만 필수는 아닙니다. |
| IPv6 Endpoint | [2001:db8::10]:51820 | IPv6 주소와 포트를 구분하려면 대괄호 형식을 사용합니다. 주소와 포트가 나뉜 양식에서는 각 입력란에 맞춰 입력하세요. |
| Address | 10.20.0.2/32 | 터널 주소 예시입니다. 실제 할당된 값을 사용하고 다른 기기와 중복되지 않도록 하세요. |
| AllowedIPs | 10.20.0.0/24 | 이 서브넷만 지정한다고 해서 임의의 공인 IP 주소까지 이 Peer를 통해 연결되는 것은 아닙니다. |
| AllowedIPs | 0.0.0.0/0, ::/0 | IPv4와 IPv6 전체 범위를 각각 지정합니다. 원격의 포워딩 기능과 앱의 트래픽 정책도 함께 맞아야 합니다. |
WireGuard 프로토콜 계층에서 AllowedIPs는 송신 데이터에 사용할 Peer를 선택하고, 해당 Peer가 보낸 데이터의 소스 주소를 확인하는 데 사용됩니다. 웹사이트 도메인 목록이 아니므로 example.com을 입력할 수 없고 DOMAIN-SUFFIX 규칙에 직접 넣을 수도 없습니다. IPv4 기본 범위만 설정하고 IPv6 범위가 없다면 IPv6 대상까지 포함된 것으로 간주해서는 안 됩니다.
- Endpoint에 도메인을 사용하는 경우, 원격으로 핸드셰이크 데이터를 보내려면 먼저 해당 도메인을 조회할 수 있어야 합니다.
- Address의 프리픽스 길이는 관행에 따라 임의로 바꾸면 안 됩니다.
/32와/24는 서로 다른 주소 범위를 나타냅니다. - AllowedIPs 범위를 넓혀도 원격에 원래 없던 포워딩 권한이나 접근 권한이 생기지 않습니다. 먼저 상대 측에서 허용하는 용도를 확인하세요.
5. Global Routing과 WireGuard는 서로 다른 계층의 설정입니다
Shadowrocket은 먼저 자체 트래픽 정책에 따라 요청을 보낼 경로를 결정하고, WireGuard 매개변수는 해당 연결이 선택된 뒤의 통신을 제어합니다. Global Routing의 Proxy, Direct, Config, Scene은 AllowedIPs와 같은 의미가 아닙니다. Proxy는 프록시 경로, Direct는 직접 연결, Config는 설정 규칙, Scene은 설정된 시나리오에 따라 처리합니다. 실제 동작은 선택한 정책과 설정에 따라 달라집니다.
처음 연결을 확인할 때는 영향 범위를 파악한 뒤 잠시 Proxy를 사용하고 테스트할 WireGuard 연결을 선택하면 규칙에 따른 분기 때문에 판단이 어려워지는 상황을 줄일 수 있습니다. 확인을 마치면 기존 설정으로 되돌리세요. Config에서 요청이 DIRECT 규칙에 해당하면 WireGuard가 정상이어도 AllowedIPs에 기본 범위를 입력했다는 이유만으로 해당 Peer를 통해 전송되지는 않습니다.
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
IP-CIDR,192.0.2.0/24,DIRECT
FINAL,PROXY
이 부분은 규칙 키워드 예시이며 WireGuard 설정이 아니고 기존 Config를 덮어쓰라는 뜻도 아닙니다. DOMAIN-SUFFIX는 도메인 접미사, GEOIP는 IP 지리 데이터베이스, IP-CIDR은 IP 대역을 기준으로 일치 여부를 확인합니다. FINAL은 앞선 규칙에 해당하지 않은 요청을 처리합니다. 예시의 PROXY는 프록시 정책을 뜻합니다. 실제로 사용할 때는 규칙 끝의 문구만 보지 말고 Config에서 해당 정책이 어디로 연결되는지도 확인하세요.
6. MTU와 PersistentKeepalive 조정 기준
MTU는 터널 인터페이스에서 전송하는 IP 패킷의 크기를 제어합니다. WireGuard 캡슐화에는 외부 IP와 UDP 등의 오버헤드가 추가되므로 하위 링크의 MTU를 터널에 그대로 적용하면 안 됩니다. 1420은 문제를 점검할 때 참고하는 흔한 값이지만 모든 경로에 맞는 고정값은 아닙니다. 기존 설정에 지정된 값을 우선 사용하거나 앱의 기본 처리에 따르세요.
- 먼저 기본 연결 상태를 확인하세요. 핸드셰이크조차 이루어지지 않았다면 MTU를 우선 원인으로 보기 전에 Endpoint, UDP 네트워크, 키를 확인하세요.
- 재현되는 현상을 기록하세요. 작은 요청은 성공하지만 큰 응답이 반복해서 멈추는 경우라면 경로 MTU, 패킷 손실 또는 관련 네트워크 제한을 의심해 볼 수 있습니다. 이는 문제를 좁히기 위한 단서일 뿐, 현상만으로 원인을 확정할 수는 없습니다.
- 한 번에 값 하나만 변경하세요. 설정 담당자가 허용하는 범위에서 1420과 1380을 각각 비교해 볼 수 있습니다. 매번 저장하고 다시 연결한 뒤 같은 대상에 같은 요청을 보내 테스트하세요. 원래 값도 기록해 두어 복원할 수 있도록 합니다.
- 값을 계속 낮추지 마세요. 낮춰도 나아지지 않는다면 DNS, 라우팅, 원격 상태를 확인하세요. IPv6를 사용하는 경우 링크 MTU 조건도 충족해야 합니다.
PersistentKeepalive는 주기적으로 데이터를 보내 NAT 매핑을 유지하는 데 도움이 됩니다. 25초는 흔한 설정 예시이지 반드시 사용해야 하는 프로토콜 요구사항은 아닙니다. 0은 주기적 Keepalive를 끈다는 뜻입니다. 일정 시간 유휴 상태인 뒤 응답 방향의 통신이 끊기는 문제를 살펴볼 때 유용하지만, 잘못된 공개 키나 접속할 수 없는 포트, 허용되지 않은 대상 네트워크를 해결하지는 못합니다.
- 설정 파일의 단위는 초입니다. 25초를 밀리초로 잘못 입력하지 마세요.
- 모든 네트워크에 같은 Keepalive 주기가 필요한 것은 아닙니다. 설정 담당자의 요구사항과 실제 테스트 결과에 따라 결정하세요.
- 모바일 네트워크가 전환된 뒤에는 다시 테스트하세요. Keepalive를 사용해도 네트워크 주소가 바뀌는 동안 모든 요청이 끊김 없이 성공한다고 보장할 수는 없습니다.
7. 설정을 반복해서 새로 만들기보다 증상에 따라 점검하기
점검할 때마다 한 항목만 바꾸고 테스트한 네트워크, Global Routing 설정, 접속 대상, 결과를 기록하세요. Home의 지연 시간이나 연결 테스트 결과는 해당 테스트 항목의 상태만 보여 줍니다. 테스트마다 확인하는 단계가 다르므로 지연 시간 하나만으로 키, DNS, AllowedIPs와 모든 요청이 정상이라고 판단할 수 없습니다.
연결 스위치를 켰는데도 트래픽이 흐르지 않는 이유는 무엇인가요?
먼저 Home에서 방금 저장한 WireGuard 연결이 선택되어 있는지 확인하고 Global Routing도 점검하세요. 그런 다음 Endpoint의 호스트와 UDP 포트, PrivateKey와 상대의 PublicKey가 올바르게 구분되어 있는지 확인합니다. 원격 관리 권한이 있다면 요청을 보낸 뒤 핸드셰이크 시간을 확인하세요. 시스템 VPN이 시작되었다고 해서 원격 인증까지 완료된 것은 아닙니다.
일부 주소에만 접속할 수 있습니다. AllowedIPs를 잘못 설정한 건가요?
먼저 접속에 실패한 대상의 IP가 AllowedIPs 범위에 포함되는지 확인한 다음 Config에서 다른 정책으로 분류되지 않았는지 살펴보세요. 원본 설정이 10.20.0.0/24만 허용한다면 공인 네트워크로 포워딩될 것이라 기대하며 기본 범위로 바로 바꾸지 마세요. 허용 범위와 원격 포워딩 설정을 담당자에게 확인하세요.
Wi-Fi에서는 되지만 셀룰러 네트워크에서는 안 됩니다. 무엇부터 확인해야 하나요?
키, 대상, 정책은 그대로 둔 채 두 네트워크에서 각각 수동으로 연결해 보세요. Endpoint 도메인의 조회 결과, IPv4 또는 IPv6 연결 가능 여부, UDP 통신 조건을 확인한 다음 Settings → On Demand에서 네트워크별 연결 조건이 다르게 설정되어 있는지 살펴보세요. 포트, 키, MTU를 동시에 바꾸지 마세요.
같은 설정을 iPad에 복사한 뒤 iPhone 연결이 불안정해졌나요?
먼저 한 기기에서 연결을 끄고 다시 테스트하세요. 한 기기만 사용할 때는 정상이고 동시에 사용할 때 문제가 생긴다면 두 기기의 PrivateKey와 Address가 같은지 확인합니다. 설정 담당자에게 기기별 Peer와 터널 주소를 따로 요청해 각각 저장하세요. 표시 이름만 바꿔서는 프로토콜상의 기기 신원이 달라지지 않습니다.
문제 해결을 위해 스크린샷을 보낼 때 가려야 할 정보는 무엇인가요?
PrivateKey, PresharedKey, QR 코드와 모든 구독 인증 정보를 가리세요. 필드 이름, 포트, MTU, AllowedIPs 범위, 오류 현상은 민감한 값을 가린 상태로 남겨도 됩니다. 개인 키가 이미 노출되었다면 새 키로 교체하고 원격에 등록된 키도 갱신해야 합니다. 스크린샷만 삭제해서는 기존 신원을 폐기할 수 없습니다.