Привет!
Расскажу, как я настроил свой аппарат. Исходные данные:
Keenetic Ultra KN-1810, версия ОС 3.7.4. Домашняя сеть 172.22.0.0/16, через прозрачный прокси будет ходить диапазон 172.22.12.0/24. Настройки сделаны намеренно таким образом, чтобы при обрыве связи в туннеле или остановке демона устройства не ходили в интернет через основной канал. Все можете настроить под себя.
1. Установить необходимые пакеты:
# opkg install shadowsocks-libev-ss-redir iptables ipset bind-dig kmod
2. Создать файл /opt/etc/config/ssredir.conf с содержимым:
SS_SERVER_HOST="ИМЯ_СЕРВЕРА"
SS_SERVER_IP=`/opt/bin/dig +short $SS_SERVER_HOST | tail -1`
SS_SERVER_PORT=ПОРТ_СЕРВЕРА
SS_SERVER_PASSWORD="ПАРОЛЬ"
SS_SERVER_METHOD="АЛГОРИТМ_ШИФРОВАНИЯ"
SOURCE_NETWORK="172.22.12.0/24" # ЗДЕСЬ УКАЖИТЕ ТО, ЧТО АКТУАЛЬНО ДЛЯ ВАС
PIDFILE="/opt/var/run/ss-redir.pid"
SSREDIR="/opt/bin/ss-redir"
SSREDIR_CONFIG="/opt/etc/shadowsocks.json"
SSREDIR_LOCAL_ADDRESS="0.0.0.0"
SSREDIR_LOCAL_PORT="10800"
SSREDIR_TIMEOUT=300
3. Создать и сделать исполняемым файл /opt/etc/init.d/S100ssredir:
#!/bin/sh
PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin
. /opt/etc/config/ssredir.conf
write_config()
{
echo "{">"${SSREDIR_CONFIG}"
echo "\"server\": [\"${SS_SERVER_IP}\"],">>"${SSREDIR_CONFIG}"
echo "\"server_port\": ${SS_SERVER_PORT},">>"${SSREDIR_CONFIG}"
echo "\"password\": \"${SS_SERVER_PASSWORD}\",">>"${SSREDIR_CONFIG}"
echo "\"method\": \"${SS_SERVER_METHOD}\",">>"${SSREDIR_CONFIG}"
echo "\"mode\": \"tcp_and_udp\",">>"${SSREDIR_CONFIG}"
echo "\"local_address\": \"${SSREDIR_LOCAL_ADDRESS}\",">>"${SSREDIR_CONFIG}"
echo "\"local_port\": \"${SSREDIR_LOCAL_PORT}\",">>"${SSREDIR_CONFIG}"
echo "\"timeout\": \"${SSREDIR_TIMEOUT}\",">>"${SSREDIR_CONFIG}"
echo "}">>"${SSREDIR_CONFIG}"
}
ssredir_status ()
{
[ -f $PIDFILE ] && [ -d /proc/`cat $PIDFILE` ]
}
start()
{
$SSREDIR -u -c "${SSREDIR_CONFIG}" -f "${PIDFILE}"
}
stop()
{
kill `cat $PIDFILE`
}
case "$1" in
start)
if ssredir_status
then
echo ss-redir already running
else
write_config
start
fi
;;
stop)
if ssredir_status
then
stop
else
echo ss-redir is not running
fi
;;
status)
if ssredir_status
then
echo ss-redir already running with pid `cat $PIDFILE`
else
echo ss-redir is not running
fi
;;
restart)
stop
sleep 3
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
4. Создать и сделать исполняемым файл /opt/etc/ndm/fs.d/100-ssredir.sh:
#!/bin/sh
[ "$1" != "start" ] && exit 0
. /opt/etc/config/ssredir.conf
BYPASS_RESERVED_IPS="${SS_SERVER_IP} \
0.0.0.0/8 \
10.0.0.0/8 \
127.0.0.0/8 \
169.254.0.0/16 \
172.16.0.0/12 \
192.168.0.0/16 \
224.0.0.0/4 \
240.0.0.0/4 \
"
ipset create ss_bypass_set hash:net >/dev/null 2>&1
ipset flush ss_bypass_set
for line in $BYPASS_RESERVED_IPS; do
ipset add ss_bypass_set $line
done
if [ -z "$(ip route list table 100)" ]; then
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100
fi
exit 0
5. Создать и сделать исполняемым файл /opt/etc/ndm/netfilter.d/100-ssredir.sh:
#!/bin/sh
[ "$type" == "ip6tables" ] && exit 0
[ $(iptables-save | grep :SSREDIR | wc -l) -eq 2 ] && exit 0
insmod /lib/modules/$(uname -r)/xt_TPROXY.ko
iptables -w -t nat -N SSREDIR
iptables -w -t mangle -N SSREDIR
exit 0
6. Создать и сделать исполняемым файл /opt/etc/ndm/netfilter.d/101-ssredir.sh:
#!/bin/sh
[ "$type" == "ip6tables" ] && exit 0
[ "$table" != "nat" ] && exit 0
[ ! -z "$(iptables-save | grep tcp | grep ss_bypass_set)" ] && exit 0
. /opt/etc/config/ssredir.conf
iptables -w -t nat -A SSREDIR -p tcp -m set --match-set ss_bypass_set dst -j RETURN
iptables -w -t nat -A SSREDIR -p tcp -j REDIRECT --to-ports "${SSREDIR_LOCAL_PORT}"
iptables -w -t nat -A PREROUTING -s "${SOURCE_NETWORK}" -p tcp -j SSREDIR
exit 0
7. Создать и сделать исполняемым файл /opt/etc/ndm/netfilter.d/102-ssredir.sh:
#!/bin/sh
[ "$type" == "ip6tables" ] && exit 0
[ "$table" != "mangle" ] && exit 0
[ ! -z "$(iptables-save | grep udp | grep ss_bypass_set)" ] && exit 0
. /opt/etc/config/ssredir.conf
iptables -w -t mangle -A SSREDIR -p udp -m set --match-set ss_bypass_set dst -j RETURN
iptables -w -t mangle -A SSREDIR -p udp -j TPROXY --on-port "${SSREDIR_LOCAL_PORT}" --tproxy-mark 0x01/0x01
iptables -w -t mangle -A SSREDIR -p udp -j MARK --set-mark 1
iptables -w -t mangle -A PREROUTING -s "${SOURCE_NETWORK}" -p udp -j SSREDIR
exit 0
Ужасно не нравится метод генерации конфига json, но более красивого способа не знаю, потому что не разбираюсь в этих ваших компухтерах. Еще пересборку ipset'а BYPASS_RESERVED_IPS можно было бы добавить не к инициализации внешних устройств, а привязать в старту и остановке демона в init.d, но мне и так нормально.