Outline משתמש בתצורה מבוססת-YAML כדי להגדיר פרמטרים של VPN ולטפל בתנועת TCP/UDP. ההגדרה תומכת בקומפוזביליות במספר רמות, ומאפשרת הגדרות גמישות וניתנות להרחבה.
בהגדרה ברמה העליונה מצוין TunnelConfig.
דוגמאות
הגדרה טיפוסית של Shadowsocks תיראה כך:
transport:
$type: tcpudp
tcp:
$type: shadowsocks
endpoint: ss.example.com:4321
cipher: chacha20-ietf-poly1305
secret: SECRET
prefix: "POST "
udp:
$type: shadowsocks
endpoint: ss.example.com:4321
cipher: chacha20-ietf-poly1305
secret: SECRET
שימו לב שעכשיו אפשר להריץ TCP ו-UDP ביציאות או בנקודות קצה שונות.
כדי להימנע משכפול, אפשר להשתמש ב-YAML anchors וב-<< merge key:
transport:
$type: tcpudp
tcp:
<<: &shared
$type: shadowsocks
endpoint: ss.example.com:4321
cipher: chacha20-ietf-poly1305
secret: SECRET
prefix: "POST "
udp: *shared
עכשיו אפשר ליצור אסטרטגיות ולבצע כמה קפיצות:
transport:
$type: tcpudp
tcp:
$type: shadowsocks
endpoint:
$type: dial
address: exit.example.com:4321
dialer:
$type: shadowsocks
address: entry.example.com:4321
cipher: chacha20-ietf-poly1305
secret: ENTRY_SECRET
cipher: chacha20-ietf-poly1305
secret: EXIT_SECRET
udp: *shared
במקרה של חסימת פרוטוקולים שקשה לזהות כמו Shadowsocks, אפשר להשתמש ב-Shadowsocks over WebSockets. במאמר דוגמה להגדרת שרת מוסבר איך פורסים את הכלי. הגדרת לקוח תיראה כך:
transport:
$type: tcpudp
tcp:
$type: shadowsocks
endpoint:
$type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/tcp
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
udp:
$type: shadowsocks
endpoint:
$type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/udp
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
שימו לב שנקודת הקצה של Websocket יכולה לקבל נקודת קצה, שאפשר להשתמש בה כדי לעקוף חסימה שמבוססת על DNS:
transport:
$type: tcpudp
tcp:
$type: shadowsocks
endpoint:
$type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/tcp
endpoint: cloudflare.net:443
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
udp:
$type: shadowsocks
endpoint:
$type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/udp
endpoint: cloudflare.net:443
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
שימו לב: בשלב הזה אין תמיכה ב-WebSockets ב-Windows. כדי להגדיר config אחד לכל הפלטפורמות, צריך להשתמש ב-first-supported לצורך תאימות לאחור:
transport:
$type: tcpudp
tcp:
$type: shadowsocks
endpoint:
$type: first-supported
options:
- $type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/tcp
- ss.example.com:4321
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
udp:
$type: shadowsocks
endpoint:
$type: first-supported
options:
- $type: websocket
url: wss://legendary-faster-packs-und.trycloudflare.com/SECRET_PATH/udp
- ss.example.com:4321
cipher: chacha20-ietf-poly1305
secret: SS_SECRET
מנהרות
TunnelConfig
Tunnel הוא האובייקט ברמה העליונה בהגדרת Outline. היא מציינת איך צריך להגדיר את ה-VPN.
פורמט: ExplicitTunnelConfig | LegacyShadowsocksConfig | LegacyShadowsocksURI
ExplicitTunnelConfig
פורמט: struct
שדות:
-
transport(TransportConfig): אמצעי התחבורה שישמש להעברת חבילות ליעד -
error(struct): מידע לתקשורת עם המשתמש במקרה של שגיאת שירות (לדוגמה, מפתח שפג תוקפו, חריגה ממכסה)message(string): הודעה ידידותית למשתמש שתוצג למשתמש-
details(string): ההודעה שתוצג כשהמשתמש יפתח את פרטי השגיאה. המידע הזה יכול לעזור בפתרון בעיות.
השדות error ו-transport הם בלעדיים.
דוגמה להצלחה:
transport:
$type: tcpudp
tcp:
... # Stream Dialer for TCP
udp:
... # Packet Listener for UDP
דוגמה לשגיאה:
error:
message: Quota exceeded
details: Used 100GB out of 100GB
תחבורה
TransportConfig
מציין איך חבילות צריכות להיות מוחלפות עם יעד היעד.
פורמט: ממשק
סוגי הממשקים הנתמכים:
-
tcpudp: TCPUDPConfig
TCPUDPConfig
TCPUDPConfig מאפשר להגדיר אסטרטגיות נפרדות ל-TCP ול-UDP.
פורמט: struct
שדות:
-
tcp(DialerConfig): חייגן הסטרימינג שבו יש להשתמש לחיבורי TCP. -
udp(PacketListenerConfig): מאזין החבילות שמשמש לחבילות UDP.
דוגמה לשליחת TCP ו-UDP לנקודות קצה שונות:
tcp:
$type: shadowsocks
endpoint: ss.example.com:80
<<: &cipher
cipher: chacha20-ietf-poly1305
secret: SECRET
prefix: "POST "
udp:
$type: shadowsocks
endpoint: ss.example.com:53
<<: *cipher
נקודות קצה
נקודות קצה יוצרות חיבורים לנקודת קצה קבועה. עדיף להשתמש בו במקום בחייגנים, כי הוא מאפשר לבצע אופטימיזציות ספציפיות לנקודות קצה. יש נקודות קצה (endpoints) של זרם ושל מנות.
EndpointConfig
פורמט: string | Interface
נקודת הקצה string היא כתובת המארח:היציאה של נקודת הקצה שנבחרה. החיבור נוצר באמצעות חייגן ברירת המחדל.
סוגי הממשקים הנתמכים לנקודות קצה של זרם ומנות:
-
dial: DialEndpointConfig -
first-supported: FirstSupportedConfig -
websocket: WebsocketEndpointConfig -
shadowsocks: ShadowsocksConfig
DialEndpointConfig
יוצר חיבורים על ידי חיוג לכתובת קבועה. חייגן יכול להרכיב אסטרטגיות.
פורמט: struct
שדות:
-
address(string): כתובת נקודת הקצה לחיוג -
dialer(DialerConfig): החייגן שמשמש לחיוג לכתובת
WebsocketEndpointConfig
מנהרות מעבירות בסטרימינג חיבורים של מנות לנקודת קצה באמצעות WebSockets.
בחיבורים של סטרימינג, כל פעולת כתיבה הופכת להודעת WebSocket. בחיבורי מנות, כל מנה הופכת להודעת WebSocket.
פורמט: struct
שדות:
-
url(string): כתובת ה-URL של נקודת הקצה של WebSocket. הסכימה צריכה להיותhttpsאוwssעבור WebSocket over TLS, ו-httpאוwsעבור WebSocket בטקסט פשוט. -
endpoint(EndpointConfig): נקודת הקצה של שרת האינטרנט שאליה מתחברים. אם הוא לא קיים, המערכת מתחברת לכתובת שצוינה בכתובת ה-URL.
חייגנים
חייגנים יוצרים חיבורים בהתאם לכתובת של נקודת קצה. יש חיוג לשידור וחיוג למנות מידע.
DialerConfig
פורמט: null | ממשק
חייגן null (לא קיים) הוא חייגן ברירת המחדל, שמשתמש בחיבורי TCP ישירים לסטרימינג ובחיבורי UDP ישירים לחבילות.
סוגי ממשקים נתמכים לחיוג בסטרימינג ובחבילות:
-
first-supported: FirstSupportedConfig -
shadowsocks: ShadowsocksConfig
סוגי הממשקים הנתמכים לחיוג בסטרימינג:
-
iptable: IPTableConfig direct: ישירblock: חסימה
פונקציות מסוג Packet Listener
ה-Packet Listener יוצר חיבור חבילות לא מוגבל שאפשר להשתמש בו כדי לשלוח חבילות לכמה יעדים.
PacketListenerConfig
פורמט: null | ממשק
הערך null (לא קיים) של Packet Listener מציין את ברירת המחדל של Packet Listener, שהיא UDP Packet Listener.
סוגי הממשקים הנתמכים:
-
first-supported: FirstSupportedConfig shadowsocks: ShadowsocksPacketListenerConfig
שיטות
Shadowsocks
LegacyShadowsocksConfig
LegacyShadowsocksConfig מייצג מנהרה שמשתמשת ב-Shadowsocks כפרוטוקול התעבורה. הוא מיישם את הפורמט מדור קודם לצורך תאימות לאחור.
פורמט: struct
שדות:
-
server(string): המארח שאליו רוצים להתחבר -
server_port(number): מספר היציאה להתחברות method (string): הצופן AEAD לשימוש-
password(מחרוזת): משמש ליצירת מפתח ההצפנה -
prefix(string): התחפושת של הקידומת לשימוש. התכונה נתמכת בחיבורים של סטרימינג ושל מנות נתונים.
דוגמה:
server: example.com
server_port: 4321
method: chacha20-ietf-poly1305
password: SECRET
prefix: "POST "
LegacyShadowsocksURI
LegacyShadowsocksURI מייצג מנהרה שמשתמשת ב-Shadowsocks כהעברה. הוא מיישם את פורמט כתובות ה-URL מדור קודם לצורך תאימות לאחור.
פורמט: string
אפשר לעיין בפורמט URI מדור קודם של Shadowsocks ובסכימת URI של SIP002. אנחנו לא תומכים בפלאגינים.
דוגמה:
ss://chacha20-ietf-poly1305:SECRET@example.com:443?prefix=POST%20
ShadowsocksConfig
ShadowsocksConfig יכול לייצג חיוג של חבילות או של סטרימינג, וגם PacketListener שמשתמש ב-Shadowsocks.
פורמט: struct
שדות:
-
endpoint(EndpointConfig): נקודת הקצה של Shadowsocks שאליה מתחברים cipher (string): הצופן AEAD לשימוש-
secret(מחרוזת): משמש ליצירת מפתח ההצפנה -
prefix(string, אופציונלי): הקידומת להסוואה לשימוש. התכונה נתמכת בחיבורים של סטרימינג ושל מנות נתונים.
דוגמה:
endpoint: example.com:80
cipher: chacha20-ietf-poly1305
secret: SECRET
prefix: "POST "
ניתוב סלקטיבי
IPTableConfig
מייצג חיוג בסטרימינג שמנתב חיבורים על סמך כתובת ה-IP של היעד. כתובת ה-IP של היעד מושווית לרשימת כללים ב-table. אם נמצאת התאמה לכלל, הטיפול בחיבור מתבצע על ידי dialer
הפעולה שצוינה בכלל. אם אין כללים תואמים, החיבור מטופל על ידי
fallback חייגן.
זהו חיוגן שפועל רק בשידור חי, וצריך להשתמש בו להעברות tcp.
פורמט: struct
שדות:
-
table(list): רשימה של כללי ניתוב.-
ips(list): רשימה של כתובות IP או טווחי CIDR (לדוגמה,192.0.2.0/24). -
dialer(DialerConfig): החייגן שבו יש להשתמש אם כתובת ה-IP של היעד תואמת לרשומה ב-ips.
-
-
fallback(DialerConfig): החייגן שבו יש להשתמש אם כתובת ה-IP של היעד לא תואמת לאף כלל ב-table.
דוגמה:
# This config blocks TCP connections to 192.0.2.0/24 and sends all
# other TCP traffic directly.
transport:
$type: tcpudp
tcp:
$type: iptable
table:
- ips:
- 192.0.2.0/24
dialer:
$type: block
fallback:
$type: direct
udp:
$type: shadowsocks
# ... udp config
חייגנים
ישיר
מייצג חיוג ישיר ב-Stream.
זהו חיוגן שפועל רק בשידור חי, וצריך להשתמש בו להעברות tcp.
דוגמה:
dialer:
$type: direct
חסימה
מייצג חיוגן שחוסם את כל ניסיונות החיבור. האפשרות הזו יכולה להיות שימושית כדי לחסום תנועה ליעדים ספציפיים, במיוחד כשמשתמשים בה עם IPTableConfig.
זהו חיוגן שפועל רק בשידור חי, וצריך להשתמש בו להעברות tcp.
דוגמה:
dialer:
$type: block
הגדרות Meta
FirstSupportedConfig
השימוש הוא בהגדרה הראשונה שהאפליקציה תומכת בה. זו דרך לשלב הגדרות חדשות תוך שמירה על תאימות לאחור עם הגדרות ישנות.
פורמט: struct
שדות:
-
options(EndpointConfig[] | DialerConfig[] | PacketListenerConfig[]): רשימת אפשרויות לבחירה
דוגמה:
options:
- $type: websocket
url: wss://example.com/SECRET_PATH
- ss.example.com:4321
ממשק
ממשקים מאפשרים לבחור אחת מתוך כמה הטמעות. הוא משתמש בשדה $type כדי לציין את הסוג שההגדרה מייצגת.
דוגמה:
$type: shadowsocks
endpoint: example.com:4321
cipher: chacha20-ietf-poly1305
secret: SECRET