V2Ray 클라이언트는 프로토콜을 대신 골라 주지 않습니다. 프로토콜은 가져온 설정이 정하며, 그 설정은 제공업체나 직접 운영하는 서버에서 옵니다. 그래서 실제 질문은 무엇을 요청할지, 또는 무엇을 구축할지입니다. 이 글은 중요한 차이를 설명하고 짧은 추천으로 끝납니다.
하나의 선택이 아니라 세 개의 계층
“VLESS냐 VMess냐”는 하나의 결정처럼 들리지만 실제로는 세 가지입니다.
- 프로토콜: 클라이언트가 어떻게 인증하고 페이로드가 어떤 모습인지(VMess, VLESS, Trojan, Shadowsocks).
- 전송 방식: 바이트가 어떻게 이동하는지(일반 TCP, WebSocket, gRPC 등).
- 보안: 연결을 무엇으로 감싸는지(없음, TLS 또는 REALITY).
같은 프로토콜이라도 나머지 두 계층에 따라 거의 보이지 않을 수도, 쉽게 눈에 띌 수도 있습니다. 검열 측에 보이는 모습은 대부분 전송 방식과 보안이 결정합니다.
검열 측이 볼 수 있는 것
- 무작위처럼 보이는 바이트. 일반 TCP 위의 Shadowsocks와 VMess에는 알아볼 수 있는 헤더가 없습니다. 이것 자체가 신호입니다. 2021년 말부터 만리방화벽(Great Firewall)은 첫 패킷이 완전히 암호화된 데이터처럼 보이는 연결을 차단해 왔습니다. 자세한 내용은 중국 편을 보세요.
- TLS 핸드셰이크. Trojan, 그리고 TLS 위의 VLESS나 VMess는 HTTPS처럼 보입니다. 그래도 검열 측은 서버 이름, IP 주소, 인증서, 연결이 동작하는 방식을 확인할 수 있습니다.
- 빌려 온 핸드셰이크. REALITY는 사용자가 고른 실제 웹사이트의 TLS 핸드셰이크를 흉내 냅니다. 키가 없는 탐색 요청은 그 실제 사이트로 넘겨져 실제 페이지를 보게 됩니다. 도메인 이름이나 인증서를 직접 마련할 필요가 없습니다.
네 가지 프로토콜 한눈에 비교
| VMess | VLESS | Trojan | Shadowsocks | |
|---|---|---|---|---|
| 페이로드를 스스로 암호화함 | 예 | 아니요, TLS 또는 REALITY에 의존 | 아니요, TLS에 의존 | 예 |
| 기본적으로 보이는 모습 | 일반 TCP 위의 무작위 바이트 | 보안 설정에 따라 다름: 무작위 바이트, TLS 또는 REALITY | HTTPS | 무작위 바이트 |
| 직접 소유한 도메인과 인증서 필요 | TLS를 쓸 때만 | TLS를 쓸 때만, REALITY에서는 불필요 | 예 | 아니요 |
| 시계가 틀리면 실패함 | 예 | 아니요 | 아니요 | 아니요 |
| v2rc로 가져오기 | 가능 | 가능 | 가능 | 가능 |
- VMess는 V2Ray의 원래 프로토콜입니다. UUID와 타임스탬프로 인증하기 때문에, 휴대폰이나 서버의 시계가 몇 분만 어긋나도 오류 메시지 없이 실패합니다. alterId는 0(AEAD 모드)을 쓰세요. 0이 아닌 alterId는 구형 방식입니다.
- VLESS는 더 가벼운 후속 프로토콜입니다. 자체 암호화를 하지 않으므로 그 아래 계층만큼만 안전합니다. TLS나 REALITY와 함께 쓰고, 열린 인터넷에서 보안
none으로는 절대 쓰지 마세요. - Trojan은 HTTPS를 그대로 따라 합니다. 평범한 TLS 연결 안에 비밀번호를 담는 방식입니다. 비밀번호를 모르는 클라이언트에게는 대신 평범한 웹 페이지를 보여 줍니다. 실제 도메인의 실제 인증서가 필요하며, 도메인은 차단될 수 있습니다.
- Shadowsocks는 오랫동안 쓰여 온 암호화 프록시이며 운영하기 가장 간단합니다. AEAD 암호를 쓰세요.
rc4-md5나aes-256-cfb같은 구형 스트림 암호는 취약합니다. 플러그인이나 래퍼가 없으면 트래픽은 완전히 암호화된 종류입니다.
REALITY와 Vision이 더하는 것
REALITY 설정에는 security=reality, 서버 이름(sni), 공개 키(pbk), 짧은 ID(sid)가 보입니다. 서버 이름은 TLS 1.3과 HTTP/2를 지원하는 실제 웹사이트여야 하며, REALITY 문서가 바로 그것을 요구합니다.
flow=xtls-rprx-vision은 Vision 플로우입니다. 다른 TLS 연결 안에 TLS 연결을 실으면 알아볼 수 있는 패턴이 남으며, 연구 문헌에서는 이를 TLS-in-TLS라고 부릅니다. Xue et al. (USENIX Security 2024)는 이런 패턴이 난독화된 프록시를 드러낼 수 있음을 보였습니다. Vision은 그 자체가 HTTPS인 트래픽에서 이 패턴을 줄이도록 설계되었습니다.
둘 다 만능은 아닙니다. 서버의 IP 주소와 호스팅 네트워크는 여전히 중요하며, REALITY도 연결이 해외 데이터센터 주소로 향한다는 사실까지 숨겨 주지는 않습니다.
무엇을 요청할까
- 제한적인 네트워크(러시아, 이란, 중국 등)에서는 443 포트의 TCP 위에서 REALITY와 Vision을 쓰는 VLESS.
- 종류가 다른 두 번째 설정: Trojan, 또는 WebSocket이나 gRPC를 쓰는 TLS 위의 VLESS이며, 필요하면 CDN 뒤에 둡니다. CDN은 서버의 IP 주소를 숨겨 주지만, CDN 자체에 접속할 수 있어야 하고 사용자가 있는 곳에서 속도가 제한되지 않아야 합니다.
- 열린 네트워크: 네 가지 중 아무거나. 제공업체가 이미 지원하는 것을 쓰세요.
- 제공업체가 구독을 준다면: 직접 고를 수는 없지만, 링크를 읽어 무엇을 받았는지 알 수 있습니다. 설정 링크 읽는 법을 보세요.
- 서로 다른 호스트의 설정을 최소 두 개 보관하세요. 하나가 실패하면 같은 서버의 다른 설정이 아니라 다른 IP 주소, 가능하면 다른 프로토콜이 필요합니다.
v2rc가 가져올 수 있는 것과 없는 것
v2rc는 링크, V2Ray JSON 파일, 클립보드, 구독 URL에서 VMess, VLESS(REALITY 포함), Shadowsocks, Trojan을 가져옵니다. Hysteria 2, TUIC, WireGuard, AmneziaWG, NaiveProxy는 가져오지 않습니다. 앞의 네 가지는 UDP 위에서 동작하는데, 제한적인 네트워크 중 상당수가 UDP를 차단합니다. NaiveProxy는 HTTPS 위에서 동작하지만 전용 클라이언트가 필요합니다. 이런 프로토콜에는 다른 앱이 필요합니다.
v2rc에는 서버가 포함되어 있지 않으며, 설정은 직접 가져와야 합니다. Smart Connect는 가장 빠른 설정을 고른 뒤 전환하기 전에 터널이 실제로 트래픽을 통과시키는지 확인합니다.
출처
- REALITY 문서와 Xray 설정 예시
- Trojan 프로토콜 설명
- Shadowsocks AEAD 사양
- Xue, Kallitsis, Houmansadr, Ensafi: Fingerprinting Obfuscated Proxy Traffic with Encapsulated TLS Handshakes, USENIX Security 2024
- Wu et al.: How the Great Firewall of China Detects and Blocks Fully Encrypted Traffic, USENIX Security 2023