Smart Dialer 會針對指定測試網域,搜尋能解除 DNS 和 TLS 封鎖的策略。這個元件會讀取包含多種策略的設定,並從中選擇一種策略。
Smart Dialer 的 YAML 設定
Smart Dialer 使用的設定為 YAML 格式,範例如下:
dns:
- system: {}
- https:
name: 8.8.8.8
- https:
name: 9.9.9.9
tls:
- ""
- split:2
- tlsfrag:1
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
DNS 設定
dns
欄位用於指定要測試的一組 DNS 解析器。- DNS 解析器可為下列任一類型:
system
:使用系統解析器,需透過空物件指定。https
:使用加密的 DNS-over-HTTPS (DoH) 解析器。tls
:使用加密的 DNS-over-TLS (DoT) 解析器。udp
:使用 UDP 解析器。tcp
:使用 TCP 解析器。
DNS-over-HTTPS 解析器 (DoH)
https:
name: dns.google
address: 8.8.8.8
name
:DoH 伺服器的網域名稱。address
:DoH 伺服器的主機和通訊埠,格式為 <主機>:<通訊埠>。預設為name
:443。
DNS-over-TLS 解析器 (DoT)
tls:
name: dns.google
address: 8.8.8.8
name
:DoT 伺服器的網域名稱。address
:DoT 伺服器的主機和通訊埠,格式為 <主機>:<通訊埠>。預設為name
:853。
UDP 解析器
udp:
address: 8.8.8.8
address
:UDP 解析器的主機和通訊埠,格式為 <主機>:<通訊埠>。
TCP 解析器
tcp:
address: 8.8.8.8
address
:TCP 解析器的主機和通訊埠,格式為 <主機>:<通訊埠>。
TLS 設定
tls
欄位用於指定一組要測試的 TLS 傳輸方式。- 每個 TLS 傳輸方式皆以一組字串表示,指定所用傳輸機制。
- 例如,
override:host=cloudflare.net|tlsfrag:1
表示使用 Cloudflare 的網域前置技術和 TLS 分割進行傳輸,詳見設定說明文件。
備援設定
當所有無 Proxy 策略都無法建立連線時,系統會使用備援設定。例如,備援設定可指定備用的 Proxy 伺服器,嘗試與使用者建立連線。只有在其他 DNS/TLS 策略失敗或逾時時,系統才會使用備援設定,因此連線啟動時間會較長。
備援設定字串應符合以下格式:
- 有效的
StreamDialer
設定字串,定義於configurl
中。 - 有效的 Psiphon 設定物件,做為
psiphon
欄位的子項。
Shadowsocks 伺服器範例
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
SOCKS5 伺服器範例
fallback:
- socks5://[USERINFO]@[HOST]:[PORT]
Psiphon 設定範例
如要使用 Psiphon 網路,請採取以下行動:
- 聯絡 Psiphon 團隊,取得可連上他們網路的設定。這可能需要簽訂合約。
- 將取得的 Psiphon 設定加入 Smart Dialer 設定的
fallback
區塊。由於 JSON 與 YAML 相容,所以直接將 Psiphon 設定內容複製貼到fallback
區塊即可,如下所示:
fallback:
- psiphon: {
"PropagationChannelId": "FFFFFFFFFFFFFFFF",
"SponsorId": "FFFFFFFFFFFFFFFF",
"DisableLocalSocksProxy" : true,
"DisableLocalHTTPProxy" : true,
...
}
如何使用 Smart Dialer
如要使用 Smart Dialer,請建立 StrategyFinder
物件並呼叫 NewDialer
方法,傳入測試網域清單和 YAML 設定。
NewDialer
方法會傳回 transport.StreamDialer
,可用來依據選出的策略建立連線。例如:
finder := &smart.StrategyFinder{
TestTimeout: 5 * time.Second,
LogWriter: os.Stdout,
StreamDialer: &transport.TCPDialer{},
PacketDialer: &transport.UDPDialer{},
}
configBytes := []byte(`
dns:
- system: {}
- https:
name: 8.8.8.8
- https:
name: 9.9.9.9
tls:
- ""
- split:2
- tlsfrag:1
fallback:
- ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTprSzdEdHQ0MkJLOE9hRjBKYjdpWGFK@1.2.3.4:9999/?outline=1
`)
dialer, err := finder.NewDialer(
context.Background(),
[]string{"www.google.com"},
configBytes
)
if err != nil {
// Handle error.
}
// Use dialer to create connections.
這是基本範例,實際使用時可能需要根據具體情況做調整。