Browse Source

Merge pull request #1530 from aa65535/master

shadowsocks-libev: add package
Steven Barth 9 years ago
parent
commit
b59187dc62

+ 91
- 0
net/shadowsocks-libev/Makefile View File

@@ -0,0 +1,91 @@
1
+#
2
+# Copyright (C) 2015 OpenWrt.org
3
+#
4
+# This is free software, licensed under the GNU General Public License v2.
5
+# See /LICENSE for more information.
6
+#
7
+
8
+include $(TOPDIR)/rules.mk
9
+
10
+PKG_NAME:=shadowsocks-libev
11
+PKG_VERSION:=2.2.2
12
+PKG_RELEASE:=1
13
+
14
+PKG_SOURCE_PROTO:=git
15
+PKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev.git
16
+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
17
+PKG_SOURCE_VERSION:=4883903e657095b93f88a3a3b9a0dccdffdaa397
18
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
19
+PKG_MAINTAINER:=Jian Chang <aa65535@live.com>
20
+
21
+PKG_LICENSE:=GPLv2
22
+PKG_LICENSE_FILES:=LICENSE
23
+
24
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
25
+
26
+PKG_INSTALL:=1
27
+PKG_FIXUP:=autoreconf
28
+PKG_USE_MIPS16:=0
29
+PKG_BUILD_PARALLEL:=1
30
+
31
+include $(INCLUDE_DIR)/package.mk
32
+
33
+define Package/shadowsocks-libev/Default
34
+	SECTION:=net
35
+	CATEGORY:=Network
36
+	TITLE:=Lightweight Secured Socks5 Proxy $(2)
37
+	URL:=https://github.com/shadowsocks/shadowsocks-libev
38
+	VARIANT:=$(1)
39
+	DEPENDS:=$(3) +resolveip +ipset +ip +iptables-mod-tproxy
40
+endef
41
+
42
+Package/shadowsocks-libev = $(call Package/shadowsocks-libev/Default,openssl,(OpenSSL),+libopenssl)
43
+Package/shadowsocks-libev-polarssl = $(call Package/shadowsocks-libev/Default,polarssl,(PolarSSL),+libpolarssl)
44
+
45
+define Package/shadowsocks-libev/description
46
+Shadowsocks-libev is a lightweight secured scoks5 proxy for embedded devices and low end boxes.
47
+endef
48
+
49
+Package/shadowsocks-libev-polarssl/description = $(Package/shadowsocks-libev/description)
50
+
51
+define Package/shadowsocks-libev/conffiles
52
+/etc/config/shadowsocks-libev
53
+endef
54
+
55
+Package/shadowsocks-libev-polarssl/conffiles = $(Package/shadowsocks-libev/conffiles)
56
+
57
+define Package/shadowsocks-libev/postinst
58
+#!/bin/sh
59
+uci -q batch <<-EOF >/dev/null
60
+	delete firewall.shadowsocks_libev
61
+	set firewall.shadowsocks_libev=include
62
+	set firewall.shadowsocks_libev.type=script
63
+	set firewall.shadowsocks_libev.path=/usr/share/shadowsocks-libev/firewall.include
64
+	set firewall.shadowsocks_libev.reload=1
65
+	commit firewall
66
+EOF
67
+exit 0
68
+endef
69
+
70
+Package/shadowsocks-libev-polarssl/postinst = $(Package/shadowsocks-libev/postinst)
71
+
72
+ifeq ($(BUILD_VARIANT),polarssl)
73
+	CONFIGURE_ARGS += --with-crypto-library=polarssl
74
+endif
75
+
76
+define Package/shadowsocks-libev/install
77
+	$(INSTALL_DIR) $(1)/usr/bin
78
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-{redir,tunnel} $(1)/usr/bin
79
+	$(INSTALL_BIN) ./files/ss-rules $(1)/usr/bin
80
+	$(INSTALL_DIR) $(1)/etc/config
81
+	$(INSTALL_DATA) ./files/shadowsocks-libev.config $(1)/etc/config/shadowsocks-libev
82
+	$(INSTALL_DIR) $(1)/etc/init.d
83
+	$(INSTALL_BIN) ./files/shadowsocks-libev.init $(1)/etc/init.d/shadowsocks-libev
84
+	$(INSTALL_DIR) $(1)/usr/share/shadowsocks-libev
85
+	$(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/shadowsocks-libev/firewall.include
86
+endef
87
+
88
+Package/shadowsocks-libev-polarssl/install = $(Package/shadowsocks-libev/install)
89
+
90
+$(eval $(call BuildPackage,shadowsocks-libev))
91
+$(eval $(call BuildPackage,shadowsocks-libev-polarssl))

+ 6
- 0
net/shadowsocks-libev/files/firewall.include View File

@@ -0,0 +1,6 @@
1
+#!/bin/sh
2
+
3
+if pidof ss-redir>/dev/null; then
4
+	/etc/init.d/shadowsocks-libev rules
5
+	logger -t ShadowSocks-libev "Reloading ShadowSocks-libev due to restart of firewall"
6
+fi

+ 15
- 0
net/shadowsocks-libev/files/shadowsocks-libev.config View File

@@ -0,0 +1,15 @@
1
+
2
+config shadowsocks-libev
3
+	option enable '1'
4
+	option server '127.0.0.1'
5
+	option server_port '8388'
6
+	option local_port '1080'
7
+	option password 'barfoo!'
8
+	option timeout '60'
9
+	option encrypt_method 'rc4-md5'
10
+	option ignore_list '/dev/null'
11
+	option udp_relay '0'
12
+	option tunnel_enable '1'
13
+	option tunnel_port '5300'
14
+	option tunnel_forward '8.8.4.4:53'
15
+	option lan_ac_mode '0'

+ 115
- 0
net/shadowsocks-libev/files/shadowsocks-libev.init View File

@@ -0,0 +1,115 @@
1
+#!/bin/sh /etc/rc.common
2
+
3
+START=90
4
+STOP=15
5
+
6
+SERVICE_USE_PID=1
7
+SERVICE_WRITE_PID=1
8
+SERVICE_DAEMONIZE=1
9
+EXTRA_COMMANDS="rules"
10
+CONFIG_FILE=/var/etc/shadowsocks-libev.json
11
+
12
+get_config() {
13
+	config_get_bool enable $1 enable
14
+	config_get server $1 server
15
+	config_get server_port $1 server_port
16
+	config_get local_port $1 local_port
17
+	config_get password $1 password
18
+	config_get timeout $1 timeout
19
+	config_get encrypt_method $1 encrypt_method
20
+	config_get ignore_list $1 ignore_list
21
+	config_get udp_relay $1 udp_relay
22
+	config_get_bool tunnel_enable $1 tunnel_enable
23
+	config_get tunnel_port $1 tunnel_port
24
+	config_get tunnel_forward $1 tunnel_forward
25
+	config_get lan_ac_mode $1 lan_ac_mode
26
+	config_get lan_ac_ip $1 lan_ac_ip
27
+	config_get wan_bp_ip $1 wan_bp_ip
28
+	config_get wan_fw_ip $1 wan_fw_ip
29
+	config_get ipt_ext $1 ipt_ext
30
+	: ${tunnel_port:=5300}
31
+	: ${tunnel_forward:=8.8.4.4:53}
32
+}
33
+
34
+start_rules() {
35
+	local ac_args
36
+
37
+	if [ -n "$lan_ac_ip" ]; then
38
+		case $lan_ac_mode in
39
+			1) ac_args="w$lan_ac_ip"
40
+			;;
41
+			2) ac_args="b$lan_ac_ip"
42
+			;;
43
+		esac
44
+	fi
45
+	/usr/bin/ss-rules \
46
+		-s "$server" \
47
+		-l "$local_port" \
48
+		-i "$ignore_list" \
49
+		-a "$ac_args" \
50
+		-b "$wan_bp_ip" \
51
+		-w "$wan_fw_ip" \
52
+		-e "$ipt_ext" \
53
+		-o $udp
54
+	return $?
55
+}
56
+
57
+start_redir() {
58
+	service_start /usr/bin/ss-redir \
59
+		-c "$CONFIG_FILE" $udp
60
+	return $?
61
+}
62
+
63
+start_tunnel() {
64
+	service_start /usr/bin/ss-tunnel \
65
+		-c "$CONFIG_FILE" \
66
+		-l "$tunnel_port" \
67
+		-L "$tunnel_forward" \
68
+		-u
69
+	return $?
70
+}
71
+
72
+rules() {
73
+	config_load shadowsocks-libev
74
+	config_foreach get_config shadowsocks-libev
75
+	[ "$enable" = 1 ] || exit 0
76
+	[ "$udp_relay" = 1 ] && udp="-u"
77
+	mkdir -p $(dirname $CONFIG_FILE)
78
+
79
+	: ${server:?}
80
+	: ${server_port:?}
81
+	: ${local_port:?}
82
+	: ${password:?}
83
+	: ${encrypt_method:?}
84
+	cat <<-EOF >$CONFIG_FILE
85
+		{
86
+		    "server": "$server",
87
+		    "server_port": $server_port,
88
+		    "local_address": "0.0.0.0",
89
+		    "local_port": $local_port,
90
+		    "password": "$password",
91
+		    "timeout": $timeout,
92
+		    "method": "$encrypt_method"
93
+		}
94
+EOF
95
+	start_rules
96
+}
97
+
98
+boot() {
99
+	until iptables-save -t nat | grep -q "^:zone_lan_prerouting"; do
100
+		sleep 1
101
+	done
102
+	start
103
+}
104
+
105
+start() {
106
+	rules && start_redir
107
+	[ "$tunnel_enable" = 1 ] && start_tunnel
108
+}
109
+
110
+stop() {
111
+	/usr/bin/ss-rules -f
112
+	service_stop /usr/bin/ss-redir
113
+	service_stop /usr/bin/ss-tunnel
114
+	rm -f $CONFIG_FILE
115
+}

+ 203
- 0
net/shadowsocks-libev/files/ss-rules View File

@@ -0,0 +1,203 @@
1
+#!/bin/sh
2
+
3
+usage() {
4
+	cat <<-EOF
5
+		Usage: ss-rules [options]
6
+
7
+		Valid options are:
8
+
9
+		    -s <server_host>        hostname or ip of shadowsocks remote server
10
+		    -l <local_port>         port number of shadowsocks local server
11
+		    -i <ip_list_file>       a file content is bypassed ip list
12
+		    -a <lan_ips>            lan ip of access control, need a prefix to
13
+		                            define access control mode
14
+		    -b <wan_ips>            wan ip of will be bypassed
15
+		    -w <wan_ips>            wan ip of will be forwarded
16
+		    -e <extra_options>      extra options for iptables
17
+		    -o                      apply the rules to the OUTPUT chain
18
+		    -u                      enable udprelay mode, TPROXY is required
19
+		    -f                      flush the rules
20
+EOF
21
+}
22
+
23
+loger() {
24
+	# 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug
25
+	logger -st ss-rules[$$] -p$1 $2
26
+}
27
+
28
+ipt_n="iptables -t nat"
29
+ipt_m="iptables -t mangle"
30
+
31
+flush_r() {
32
+	local IPT
33
+
34
+	IPT=$(iptables-save -t nat)
35
+	eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
36
+		sed -e 's/^-A/$ipt_n -D/' -e 's/$/;/')
37
+
38
+	for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
39
+		$ipt_n -F ${chain:1} 2>/dev/null && $ipt_n -X ${chain:1}
40
+	done
41
+
42
+	IPT=$(iptables-save -t mangle)
43
+	eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
44
+		sed -e 's/^-A/$ipt_m -D/' -e 's/$/;/')
45
+
46
+	for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
47
+		$ipt_m -F ${chain:1} 2>/dev/null && $ipt_m -X ${chain:1}
48
+	done
49
+
50
+	ip rule del fwmark 0x01/0x01 table 100 2>/dev/null
51
+	ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
52
+	ipset -X ss_spec_lan_ac 2>/dev/null
53
+	ipset -X ss_spec_wan_ac 2>/dev/null
54
+	return 0
55
+}
56
+
57
+ipset_r() {
58
+	ipset -! -R <<-EOF || return 1
59
+		create ss_spec_wan_ac hash:net
60
+		$(echo -e "$IPLIST" | sed -e "s/^/add ss_spec_wan_ac /")
61
+		$(for ip in $WAN_FW_IP; do echo "add ss_spec_wan_ac $ip nomatch"; done)
62
+EOF
63
+	$ipt_n -N SS_SPEC_WAN_AC && \
64
+	$ipt_n -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN && \
65
+	$ipt_n -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW
66
+	return $?
67
+}
68
+
69
+fw_rule() {
70
+	$ipt_n -N SS_SPEC_WAN_FW && \
71
+	$ipt_n -A SS_SPEC_WAN_FW -p tcp \
72
+		-j REDIRECT --to-ports $LOCAL_PORT 2>/dev/null || {
73
+		loger 3 "Can't redirect, please check the iptables."
74
+		exit 1
75
+	}
76
+	return $?
77
+}
78
+
79
+ac_rule() {
80
+	local TAG ROUTECHAIN
81
+
82
+	if [ -n "$LAN_AC_IP" ]; then
83
+		if [ "${LAN_AC_IP:0:1}" = "w" ]; then
84
+			TAG="nomatch"
85
+		else
86
+			if [ "${LAN_AC_IP:0:1}" != "b" ]; then
87
+				loger 3 "Bad argument \`-a $LAN_AC_IP\`."
88
+				return 2
89
+			fi
90
+		fi
91
+	fi
92
+
93
+	ROUTECHAIN=PREROUTING
94
+	if iptables-save -t nat | grep -q "^:zone_lan_prerouting"; then
95
+		ROUTECHAIN=zone_lan_prerouting
96
+	fi
97
+
98
+	ipset -! -R <<-EOF || return 1
99
+		create ss_spec_lan_ac hash:net
100
+		$(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip $TAG"; done)
101
+EOF
102
+	$ipt_n -A $ROUTECHAIN -p tcp $EXT_ARGS \
103
+		-m set ! --match-set ss_spec_lan_ac src \
104
+		-m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
105
+
106
+	if [ "$OUTPUT" = 1 ]; then
107
+		$ipt_n -A OUTPUT -p tcp $EXT_ARGS \
108
+			-m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
109
+	fi
110
+	return $?
111
+}
112
+
113
+tp_rule() {
114
+	[ "$TPROXY" = 1 ] || return 0
115
+	ip rule add fwmark 0x01/0x01 table 100
116
+	ip route add local 0.0.0.0/0 dev lo table 100
117
+	$ipt_m -N SS_SPEC_TPROXY
118
+	$ipt_m -A SS_SPEC_TPROXY -p udp -m set ! --match-set ss_spec_wan_ac dst \
119
+		-j TPROXY --on-port $LOCAL_PORT --tproxy-mark 0x01/0x01
120
+	$ipt_m -A PREROUTING -p udp $EXT_ARGS \
121
+		-m set ! --match-set ss_spec_lan_ac src \
122
+		-m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_TPROXY
123
+	return $?
124
+}
125
+
126
+while getopts ":s:l:c:i:e:a:b:w:ouf" arg; do
127
+	case $arg in
128
+		s)
129
+			SERVER=$OPTARG
130
+			;;
131
+		l)
132
+			LOCAL_PORT=$OPTARG
133
+			;;
134
+		i)
135
+			IGNORE=$OPTARG
136
+			;;
137
+		e)
138
+			EXT_ARGS=$OPTARG
139
+			;;
140
+		a)
141
+			LAN_AC_IP=$OPTARG
142
+			;;
143
+		b)
144
+			WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done)
145
+			;;
146
+		w)
147
+			WAN_FW_IP=$OPTARG
148
+			;;
149
+		o)
150
+			OUTPUT=1
151
+			;;
152
+		u)
153
+			TPROXY=1
154
+			;;
155
+		f)
156
+			flush_r
157
+			exit 0
158
+			;;
159
+	esac
160
+done
161
+
162
+if [ -z "$SERVER" -o -z "$LOCAL_PORT" ]; then
163
+	usage
164
+	exit 2
165
+fi
166
+
167
+SERVER=$(resolveip -t60 $SERVER)
168
+
169
+if [ -z "$SERVER" ]; then
170
+	loger 3 "Can't resolve the server hostname."
171
+	exit 1
172
+fi
173
+
174
+if [ -f "$IGNORE" ]; then
175
+	IGNORE_IP=$(cat $IGNORE 2>/dev/null)
176
+fi
177
+
178
+IPLIST=$(cat <<-EOF | grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}"
179
+	$SERVER
180
+	0.0.0.0/8
181
+	10.0.0.0/8
182
+	100.64.0.0/10
183
+	127.0.0.0/8
184
+	169.254.0.0/16
185
+	172.16.0.0/12
186
+	192.0.0.0/24
187
+	192.0.2.0/24
188
+	192.88.99.0/24
189
+	192.168.0.0/16
190
+	198.18.0.0/15
191
+	198.51.100.0/24
192
+	203.0.113.0/24
193
+	224.0.0.0/4
194
+	240.0.0.0/4
195
+	255.255.255.255
196
+	$WAN_BP_IP
197
+	$IGNORE_IP
198
+EOF
199
+)
200
+
201
+flush_r && fw_rule && ipset_r && ac_rule && tp_rule
202
+
203
+exit $?