OpenWrt 雙s插件 bash代碼研讀

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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章