跳至主要内容

[Mac] shadowsocks setup

因大陸案子關係, 接觸了些大陸網路環境, 也因此接觸到 shadowsocks.
Shadowsocks(簡稱SS) 是一種基於Socks5代理方式的加密傳輸協定, 也可以指實現這個協定的各種開發包. 在中國大陸, SS 廣泛用於突破防火長城(GFW), 以瀏覽被封鎖, 遮蔽或干擾的內容.

Shadowsocks 需找個 VPS 跑 server, 再透過本地端 client 連線. server 端的設定這篇不談, 僅紀錄 macOS 上安裝與設定 client 的過程.

安裝 shadowsocks-libev

Shadowsocks 有不少 client 可用, 我選用 shadowsocks-libev. 他可以當系統服務, 也可以透過不少 plugin 來擴充功能, 相當強大方便.

透過套件管理工具 homebrew 即可安裝 shadowsocks-libev.

$ brew update
$ brew install shadowsocks-libev
...
To have launchd start shadowsocks-libev now and restart at login:
brew services start shadowsocks-libev
Or, if you don't want/need a background service you can just run:
/usr/local/opt/shadowsocks-libev/bin/ss-local -c /usr/local/etc/shadowsocks-libev.json

出現後面這些訊息表示安裝成功, 先透過 CLI 確認 SS 連線可以正確 work.

$ ss-local -s <SERVER_IP> -p <SERVER_PORT> -k <PASSWORD> -b 0.0.0.0 -l 1080-m aes-256-gcm


2021-03-15 17:28:36 INFO: initializing ciphers... aes-256-gcm
2021-03-15 17:28:36 INFO: listening at 0.0.0.0:1080

出現 listening at 0.0.0.0:1080 表示 SS 連線成功, 可參考後面段落設置 Socks Proxy, 連線上網確認是否正確.

設定 shadowsocks-libev

shadowsocks-libev 可以服務方式運行, 配置文件在 /usr/local/etc/shadowsocks-libev.json

{
"server":"abc.xyz.com",
"server_port":8888,
"local_port":1080,
"password":"AbCdEfGhIjKlMn",
"timeout":5,
"method":"chacha20-ietf-poly1305",
"mode":"tcp_and_udp",
}

修改後可透過 brew services 啟動服務.

$ brew services start shadowsocks-libev 
==> Successfully started `shadowsocks-libev` (label: homebrew.mxcl.shadowsocks-libev)

全區代理設定

macOS 可透過全區代理的方式, 讓所有連線都使用 SS 當跳板. 設定方式在: 系統偏好設定 > 網路 > Wi-Fi > 進階 > 代理

在 SOCKS 欄位填上本地端對應的資訊即可.

快速開關代理

一般來說不會設定為全區代理, 會透過 PAC 來設定白名單等自動代理. 但我個人需求比較簡單, 需要處理公務時開啟代理連線管理後台, 處理完畢即可關閉代理.

因此設定了簡單的 alias, 透過 CLI 來快速開關代理.

alias proxyon='brew services restart shadowsocks-libev; networksetup -setsocksfirewallproxy wi-fi localhost 1080'
alias proxyoff='brew services stop shadowsocks-libev; networksetup -setsocksfirewallproxystate wi-fi off'

之後需要連線後台時, 在 Ternimal 打 poxyon 即可透過代理連線.

$  proxyon

==> Successfully started `shadowsocks-libev` (label: homebrew.mxcl.shadowsocks-libev)

處理完畢後, 打 proxyoff 關閉代理, 回到原生網魯環境.

$ proxyoff

Stopping `shadowsocks-libev`... (might take a while)
==> Successfully stopped `shadowsocks-libev` (label: homebrew.mxcl.shadowsocks-libev)

See Also

Reference