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/

 

posted @ 2019-09-01 20:29  爱知菜  阅读(75)  评论(0编辑  收藏  举报