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/