Shadowsocks 서버는 암호화 방식과 암호, 그리고 선택적으로 연결을 위장하는 플러그인으로 정의됩니다. Potatso는 서버의 암호화 방식과, 있다면 플러그인을 지원할 때 서버에 연결합니다. 제공업체가 알려 준 내용이나 ss:// 링크에 나온 서버 설정을 아래 표로 확인하세요.
Shadowsocks 서버는 직접 추가하거나, ss:// 링크로 추가하거나, 다음을 가져와서 추가할 수 있습니다.
- Clash 또는 Mihomo 구독,
- 파일이나 링크로 받은 SIP008 온라인 구성,
- shadowsocks-rust 또는 shadowsocks-libev의
config.json, - Surge 구성, Xray 또는 V2Ray 구성.
암호화 방식
서버가 2022 암호화 방식을 제공하면 그것을 우선 사용하고, 그다음에 AEAD 암호화 방식을 쓰세요. 스트림 암호화 방식에는 알려진 약점이 있으므로 다른 선택지가 없는 서버에서만 사용하세요.
| 암호화 방식 | 종류 | 지원 |
|---|---|---|
2022-blake3-aes-128-gcm, 2022-blake3-aes-256-gcm |
2022 | ✅ 다중 사용자 지원 |
2022-blake3-chacha20-poly1305, 2022-blake3-chacha8-poly1305 |
2022 | ✅ |
aes-128-gcm, aes-192-gcm, aes-256-gcm |
AEAD | ✅ |
chacha20-ietf-poly1305, xchacha20-ietf-poly1305 |
AEAD | ✅ |
aes-128-ccm, aes-256-ccm, aes-128-gcm-siv, aes-256-gcm-siv |
AEAD | ✅ |
sm4-gcm, sm4-ccm |
AEAD | ✅ |
aes-128-ctr, aes-192-ctr, aes-256-ctr |
스트림 | ✅ |
aes-128-cfb, aes-192-cfb, aes-256-cfb(-cfb128로도 표기) |
스트림 | ✅ |
aes-128-cfb1, aes-192-cfb1, aes-256-cfb1 |
스트림 | ✅ |
aes-128-cfb8, aes-192-cfb8, aes-256-cfb8 |
스트림 | ✅ |
aes-128-ofb, aes-192-ofb, aes-256-ofb |
스트림 | ✅ |
camellia-128-ctr, camellia-192-ctr, camellia-256-ctr |
스트림 | ✅ |
camellia-128-cfb, camellia-192-cfb, camellia-256-cfb(-cfb128로도 표기) |
스트림 | ✅ |
camellia-128-cfb1, camellia-192-cfb1, camellia-256-cfb1 |
스트림 | ✅ |
camellia-128-cfb8, camellia-192-cfb8, camellia-256-cfb8 |
스트림 | ✅ |
camellia-128-ofb, camellia-192-ofb, camellia-256-ofb |
스트림 | ✅ |
chacha20-ietf, chacha20, salsa20 |
스트림 | ✅ |
bf-cfb, rc4-md5, rc4, table |
스트림 | ✅ |
none(plain으로도 표기) |
암호화 없음 | ✅ |
cast5-cfb, des-cfb, idea-cfb, rc2-cfb, seed-cfb, rc4-md5-6 |
스트림 | ❌ ShadowsocksR 전용 |
xchacha20, xsalsa20 |
스트림 | ❌ |
이름은 대소문자를 구분하지 않으므로 AES-256-GCM도 aes-256-gcm과 똑같이 작동합니다.
none은 트래픽을 암호화하지 않고 보냅니다. TLS를 쓰는 v2ray-plugin처럼 연결 자체를 암호화하는 플러그인과 함께 쓸 때만 사용하세요.
지원하는 모든 암호화 방식은 실제 Shadowsocks 서버 중 하나 이상으로 테스트했습니다. shadowsocks-rust, sing-box 또는 원조 Python 서버입니다. 위의 AEAD 암호화 방식 중 aes-*-ccm, aes-*-gcm-siv, sm4-*는 shadowsocks-rust 서버만 제공하며, 이를 쓰는 제공업체는 드뭅니다.
2022 키
2022 암호화 방식(SIP022)은 암호를 사용하지 않고 키를 사용합니다. 키는 암호화 방식에 필요한 길이의 임의 바이트를 Base64로 인코딩한 것입니다. 2022-blake3-aes-128-gcm에는 16바이트 키가, 나머지 2022 암호화 방식에는 32바이트 키가 필요합니다. 키는 서버에 있는 그대로 사용하세요.
Potatso는 길이가 잘못된 키나 Base64가 아닌 암호로는 연결하지 않습니다. 서버용 새 키를 만들려면 2022-blake3-aes-128-gcm에는 openssl rand -base64 16을, 나머지 2022 암호화 방식에는 openssl rand -base64 32를 실행하세요.
다중 사용자 서버
2022 서버는 한 포트를 여러 사용자가 공유할 수 있습니다(SIP023). 각 사용자에게는 고유한 키가 있습니다. 이런 서버에서는 암호를 서버 키와 사용자 키를 콜론으로 구분해 설정합니다.
server-key:user-key다중 사용자 서버는 2022-blake3-aes-128-gcm과 2022-blake3-aes-256-gcm만 지원합니다.
플러그인
플러그인은 Shadowsocks 연결을 감싸 탐지하기 어렵게 만듭니다. Potatso에는 다음 플러그인이 내장되어 있으므로 따로 설치할 필요가 없습니다.
| 플러그인 | 플러그인 이름 | 지원 | UDP |
|---|---|---|---|
| Simple Obfs | obfs-local, simple-obfs, obfs |
✅ obfs=http 및 obfs=tls |
플러그인 없이 서버로 전송 |
| v2ray-plugin | v2ray-plugin |
✅ WebSocket, TLS 유무 무관. QUIC 모드는 지원하지 않습니다. | ❌ |
| gost-plugin | gost-plugin |
✅ WebSocket, TLS 유무 무관 | ❌ |
| ShadowTLS | shadow-tls |
✅ 버전 1, 2, 3 | ❌ |
| Restls | restls |
✅ | ❌ |
| JLS | jls |
✅ | ❌ |
Potatso는 다른 플러그인이 필요한 서버는 가져오지 않습니다.
- Cloak, xray-plugin 등의 플러그인은 기기에서 Potatso와 함께 실행해야 하는 프로그램인데 iOS에서는 허용되지 않습니다.
- kcptun과 ech-tls-tunnel은 아직 Potatso에서 사용할 수 없습니다.
플러그인 설정
서버 설정에서 플러그인으로 플러그인을 선택한 다음 플러그인 매개변수에 옵션을 입력합니다. 옵션은 다음 Simple Obfs 예시처럼 세미콜론으로 구분한 key=value 쌍입니다.
obfs=tls;obfs-host=cdn.example.comtls처럼 키만 쓰면 해당 옵션이 켜집니다. 필요 없는 옵션은 생략하세요. 기본값은 아래 표에 나와 있습니다.
서버를 가져오면 Potatso가 플러그인과 옵션을 설정합니다.
ss://링크는plugin매개변수에 플러그인 이름 뒤에 옵션을 담습니다.simple-obfs;obfs=tls;obfs-host=cdn.example.com처럼 씁니다.- Clash 또는 Mihomo 구독은
plugin과plugin-opts에 담습니다. - SIP008 구성이나 shadowsocks-rust 또는 shadowsocks-libev의
config.json은plugin과plugin_opts에 담습니다.
어떤 형식이든 옵션은 같습니다. 제공업체가 Clash의 plugin-opts처럼 한 줄에 하나씩 나열해 주었다면 각각 key=value로 쓰고 세미콜론으로 이어 붙이세요.
플러그인 옵션
Simple Obfs
| 옵션 | 설명 |
|---|---|
obfs |
필수. http 또는 tls. |
obfs-host |
Host 헤더(http) 또는 TLS 핸드셰이크에서 보내는 서버 이름(tls). 비어 있으면 Potatso가 서버 주소를 사용합니다. |
obfs-uri |
http 전용. 요청 경로. 기본값은 /. |
http-method |
http 전용. 요청 메서드. 기본값은 GET. |
v2ray-plugin
| 옵션 | 설명 |
|---|---|
mode |
기본값은 websocket입니다. QUIC 모드는 지원하지 않습니다. |
tls |
TLS로 연결합니다. 기본값은 꺼짐. |
host |
Host 헤더 및 TLS의 서버 이름. 비어 있으면 Potatso가 서버 주소를 사용합니다. |
path |
WebSocket 경로. 기본값은 /. |
mux |
멀티플렉싱. 기본값은 꺼짐. 서버가 사용할 때만 켜세요. |
skip-cert-verify |
모든 서버 인증서를 허용합니다. 신뢰하는 서버에서만 사용하세요. |
header |
header=Name:Value 형식의 추가 요청 헤더. 헤더를 더 추가하려면 반복해서 씁니다. |
gost-plugin
| 옵션 | 설명 |
|---|---|
mode |
필수. websocket. |
tls |
TLS로 연결합니다. 기본값은 꺼짐. |
host |
Host 헤더 및 TLS의 서버 이름. gost와 같이 기본값은 bing.com. |
path |
WebSocket 경로. 기본값은 /. |
mux |
멀티플렉싱. 기본값은 켜짐. |
skip-cert-verify |
모든 서버 인증서를 허용합니다. 신뢰하는 서버에서만 사용하세요. |
fingerprint |
해당 인증서만 허용하기 위한 서버 인증서의 SHA-256 지문. |
header |
header=Name:Value 형식의 추가 요청 헤더. 헤더를 더 추가하려면 반복해서 씁니다. |
ShadowTLS
| 옵션 | 설명 |
|---|---|
host |
필수. 위장용 사이트의 서버 이름(예: www.example.com). |
version |
필수. 1, 2, 3. |
password |
암호. 버전 2와 3에 필요합니다. |
alpn |
쉼표로 구분한 ALPN 목록. 기본값은 h2,http/1.1. |
skip-cert-verify |
위장용 사이트의 모든 인증서를 허용합니다. |
Restls
| 옵션 | 설명 |
|---|---|
host |
필수. 위장용 사이트의 서버 이름. |
password |
필수. 암호. |
version-hint |
필수. 서버 설정에 맞춰 tls13 또는 tls12. |
restls-script |
제공업체가 알려 준 경우의 레코드 스크립트. |
JLS
| 옵션 | 설명 |
|---|---|
host |
필수. 위장용 사이트의 서버 이름. |
username |
필수. 사용자 이름. |
password |
필수. 암호. |
alpn |
쉼표로 구분한 ALPN 목록. 기본값은 h2,http/1.1. |
필수 옵션이 없거나 값이 올바르지 않으면 Potatso는 서버에 연결하지 않습니다.
UDP
Shadowsocks 서버는 UDP가 기본으로 켜져 있으며 지원하는 모든 암호화 방식에서 작동합니다. 서버가 UDP를 중계하지 않으면 서버 설정에서 끄세요.
UDP는 플러그인을 통해 전송되지 않으므로 Simple Obfs 이외의 플러그인을 쓰면 서버는 TCP만 전달합니다. Potatso는 UDP-over-TCP(링크나 구독의 udp-over-tcp 또는 uot)를 지원하지 않으며, 이를 요구하는 서버는 가져오지 않습니다.
기능 지원
| 기능 | 지원 |
|---|---|
SIP002 ss:// 링크 |
✅ 이전 Base64 형식 포함 |
| SIP003 플러그인 | 내장 플러그인만 |
| SIP003u(플러그인을 통한 UDP) | ❌ |
| AEAD 암호화 방식(SIP004) | ✅ |
| SIP008 온라인 구성 | ✅ |
| SIP022 2022 암호화 방식 | ✅ TCP와 UDP |
| SIP023 다중 사용자 ID 헤더 | ✅ AES 2022 암호화 방식 |
| 스트림 암호화 방식 | ✅ 암호화 방식 참고 |
| UDP-over-TCP | ❌ |
| TCP Fast Open, MPTCP | ❌ |
shadowsocks-rust의 일부 기능은 자체 클라이언트 프로그램인 sslocal의 설정이며, Potatso는 같은 역할을 자체 방식으로 처리합니다.
- 로컬 SOCKS5, HTTP, 터널, redir, DNS, TUN 서버: Potatso가 기기의 트래픽을 직접 가져옵니다.
- 액세스 제어 목록(ACL): 프로필의 규칙을 사용하세요.
- 여러 서버 중 가장 빠른 서버 선택: 프로필의 프록시 그룹을 사용하세요.
ss:// 링크
ss:// 링크는 서버 전체를 한 줄에 담습니다(SIP002).
ss://userinfo@host:port/?plugin=…#name| 부분 | 설명 |
|---|---|
userinfo |
cipher:password 형식의 암호화 방식과 암호로, Base64 또는 퍼센트 인코딩합니다. 2022 암호화 방식은 퍼센트 인코딩 형식을 써야 합니다. |
host |
서버 주소. IPv6 주소는 [2001:db8::1]처럼 대괄호로 묶습니다. |
port |
서버 포트. |
plugin |
선택 사항. 세미콜론으로 구분하고 퍼센트 인코딩한 플러그인 이름과 옵션. 예: simple-obfs;obfs=tls;obfs-host=cdn.example.com. |
name |
선택 사항. Potatso에서 표시할 서버 이름. |
Potatso는 # 앞의 모든 내용을 Base64로 인코딩하던 이전 형식도 가져옵니다.
ss://base64(cipher:password@host:port)#namePotatso는 표준 및 URL-safe Base64를 = 패딩 유무와 관계없이 받아들입니다. Potatso가 서버를 공유할 때는 SIP002의 Base64 및 퍼센트 인코딩 형식과 이전 형식을 제공합니다.
예시
각 예시는 가져올 링크를 보여 줍니다. AEAD 예시의 암호는 secret입니다.
aes-256-gcm을 쓰는 기본 서버:
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:8388#Basic16바이트 키 MTIzNDU2Nzg5MDEyMzQ1Ng==를 쓰는 2022 서버:
ss://2022-blake3-aes-128-gcm:MTIzNDU2Nzg5MDEyMzQ1Ng%3D%3D@ss.example.com:8388#2022서버 키와 사용자 키를 콜론(%3A)으로 구분한 다중 사용자 2022 서버:
ss://2022-blake3-aes-256-gcm:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI%3D%3AYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU%3D@ss.example.com:8388#Multi-user서버 이름으로 cdn.example.com을 쓰는 TLS용 Simple Obfs:
ss://YWVzLTI1Ni1nY206c2VjcmV0@ss.example.com:443/?plugin=simple-obfs%3Bobfs%3Dtls%3Bobfs-host%3Dcdn.example.com#Obfs기본 서버의 이전 형식:
ss://YWVzLTI1Ni1nY206c2VjcmV0QHNzLmV4YW1wbGUuY29tOjgzODg#LegacyIPv6 주소를 쓰는 서버:
ss://YWVzLTI1Ni1nY206c2VjcmV0@[2001:db8::1]:8388#IPv6