#!/bin/sh /etc/rc.common
|
|
|
|
START=90
|
|
STOP=15
|
|
|
|
SERVICE_USE_PID=1
|
|
SERVICE_WRITE_PID=1
|
|
SERVICE_DAEMONIZE=1
|
|
EXTRA_COMMANDS="rules"
|
|
CONFIG_FILE=/var/etc/shadowsocks-libev.json
|
|
|
|
get_config() {
|
|
config_get_bool enable $1 enable
|
|
config_get server $1 server
|
|
config_get server_port $1 server_port
|
|
config_get local_port $1 local_port
|
|
config_get timeout $1 timeout
|
|
config_get password $1 password
|
|
config_get encrypt_method $1 encrypt_method
|
|
config_get ignore_list $1 ignore_list
|
|
config_get udp_mode $1 udp_mode
|
|
config_get udp_server $1 udp_server
|
|
config_get udp_server_port $1 udp_server_port
|
|
config_get udp_local_port $1 udp_local_port
|
|
config_get udp_timeout $1 udp_timeout
|
|
config_get udp_password $1 udp_password
|
|
config_get udp_encrypt_method $1 udp_encrypt_method
|
|
config_get_bool tunnel_enable $1 tunnel_enable
|
|
config_get tunnel_port $1 tunnel_port
|
|
config_get tunnel_forward $1 tunnel_forward
|
|
config_get lan_ac_mode $1 lan_ac_mode
|
|
config_get lan_ac_ip $1 lan_ac_ip
|
|
config_get wan_bp_ip $1 wan_bp_ip
|
|
config_get wan_fw_ip $1 wan_fw_ip
|
|
config_get ipt_ext $1 ipt_ext
|
|
: ${timeout:=60}
|
|
: ${udp_timeout:=60}
|
|
: ${tunnel_port:=5300}
|
|
: ${tunnel_forward:=8.8.4.4:53}
|
|
}
|
|
|
|
start_rules() {
|
|
local ac_args
|
|
|
|
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
|
|
/usr/bin/ss-rules \
|
|
-s "$server" \
|
|
-l "$local_port" \
|
|
-S "$udp_server" \
|
|
-L "$udp_local_port" \
|
|
-i "$ignore_list" \
|
|
-a "$ac_args" \
|
|
-b "$wan_bp_ip" \
|
|
-w "$wan_fw_ip" \
|
|
-e "$ipt_ext" \
|
|
-o $udp
|
|
return $?
|
|
}
|
|
|
|
start_redir() {
|
|
cat <<-EOF >$CONFIG_FILE
|
|
{
|
|
"server": "$server",
|
|
"server_port": $server_port,
|
|
"local_address": "0.0.0.0",
|
|
"local_port": $local_port,
|
|
"password": "$password",
|
|
"timeout": $timeout,
|
|
"method": "$encrypt_method"
|
|
}
|
|
EOF
|
|
if [ "$udp_mode" = 2 ]; then
|
|
/usr/bin/ss-redir \
|
|
-c $CONFIG_FILE \
|
|
-f /var/run/ss-redir_t.pid
|
|
cat <<-EOF >$CONFIG_FILE
|
|
{
|
|
"server": "$udp_server",
|
|
"server_port": $udp_server_port,
|
|
"local_address": "0.0.0.0",
|
|
"local_port": $udp_local_port,
|
|
"password": "$udp_password",
|
|
"timeout": $udp_timeout,
|
|
"method": "$udp_encrypt_method"
|
|
}
|
|
EOF
|
|
fi
|
|
/usr/bin/ss-redir \
|
|
-c $CONFIG_FILE \
|
|
-f /var/run/ss-redir.pid \
|
|
$udp
|
|
return $?
|
|
}
|
|
|
|
start_tunnel() {
|
|
: ${udp:="-u"}
|
|
/usr/bin/ss-tunnel \
|
|
-c $CONFIG_FILE \
|
|
-l $tunnel_port \
|
|
-L $tunnel_forward \
|
|
-f /var/run/ss-tunnel.pid \
|
|
$udp
|
|
return $?
|
|
}
|
|
|
|
rules() {
|
|
config_load shadowsocks-libev
|
|
config_foreach get_config shadowsocks-libev
|
|
[ "$enable" = 1 ] || exit 0
|
|
mkdir -p /var/run /var/etc
|
|
|
|
: ${server:?}
|
|
: ${server_port:?}
|
|
: ${local_port:?}
|
|
: ${password:?}
|
|
: ${encrypt_method:?}
|
|
case $udp_mode in
|
|
1) udp="-u"
|
|
;;
|
|
2)
|
|
udp="-U"
|
|
: ${udp_server:?}
|
|
: ${udp_server_port:?}
|
|
: ${udp_local_port:?}
|
|
: ${udp_password:?}
|
|
: ${udp_encrypt_method:?}
|
|
;;
|
|
esac
|
|
|
|
start_rules
|
|
}
|
|
|
|
boot() {
|
|
until iptables-save -t nat | grep -q "^:zone_lan_prerouting"; do
|
|
sleep 1
|
|
done
|
|
start
|
|
}
|
|
|
|
start() {
|
|
rules && start_redir
|
|
[ "$tunnel_enable" = 1 ] && start_tunnel
|
|
}
|
|
|
|
stop() {
|
|
/usr/bin/ss-rules -f
|
|
killall -q -9 ss-redir
|
|
killall -q -9 ss-tunnel
|
|
}
|