Project git url: https://github.com/ss/openwrt-ss
包含 ss-{local,redir,tunnel} 三個可執行文件
默認啓動 ss-local 建立本地 SOCKS 代理
ss-libev-spec 爲針對 OpenWrt 路由器的優化版本包含 ss-{redir,rules,tunnel} 三個可執行文件
ss-redir 建立透明代理, ss-tunnel 做 DNS 查詢轉發
ss-tunnel 默認轉發 127.0.0.1:5353 至 8.8.4.4:53通過 ss 服務器查詢 DNS 用於線路優化
ss-rules 可設置 ignore.list 中的 IP 流量不走代理
ss-rules 可支持 ipset 和 iptables 兩種轉發規則
默認使用性能更好的 ipset 規則, 對不支持的設備使用 iptables
if [ -n "$lan_ac_ip" ]; then
case $lan_ac_mode in
1) ac_args="w$lan_ac_ip"
;;
2) ac_args="b$lan_ac_ip"
;;
esac
fi
上面的代碼展示了bash中 if 和 case 的用法, 另外bash中也有else 和 elif 這兩個關鍵詞.注意if後面要加一個"then"
: ${timeout:=60}
這段代碼的意思是如果目前沒有定義過timeout這個變量的話, 就把它定義爲 60
cat <<-EOF >$CONFIG_FILE
cat << EOF表示從stdin中讀取,當讀到EOF時終止, 而-EOF是指如果讀到 製表符 加上 EOF 的話也終止, 最後把結果輸出到$CONFIG_FILE中.
[ "$tunnel_enable" = 1 ] && start_tunnel
&&符號的意思是當左邊的命令成功時才執行右邊的命令. 注: 在linux bash中0表示true
此外還有一個 || 表示左邊命令失敗時才執行右邊的命令.
ipset -! -R <<-EOF || return 1
create ss_spec_lan_ac hash:net
$(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip"; done)
EOF
ipset 是iptables的一個擴展, 用於方便管理大量IP的出入規則. -! 表示忽略一些重複添加的或者刪除已經被刪過的規則時發生的錯誤. -R表示從標準輸入中讀取.第二行和第三行表示創建了一個ip的集合,並向其中添加了若干IP.
iptables -t nat -A PREROUTING -p tcp -m set ! --match-set ss_spec_lan_ac src -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
iptables就是一個具體的防火牆了, "-t nat"表示應用範圍在nat轉發方面, "-A PREOUNTING"表示添加一條在轉發前生效的規則,"-p tcp"表示對tcp協議應用規則, "-m set ! --match-set ss_spec_lan_ac src"是裝了ipset以後纔有的擴展的參數. 表示針對源地址(src)不是(感嘆號)ss_spec_lan_ac集合中的ip包才應用規則. "-m comment"是加上註釋. "-j"就是指明具體應用哪一條規則了.可以使用命令 "iptables -t nat -L" 來看所有的規則.
備註:
iptables-save 可以把目前iptables的規則輸出到標準輸出, 可以通過-t來指定輸出哪個表
還有一篇文章值得研究: http://felixqu.com/2015/07/27/tomato-arm-jffs-entware-ss/