Установка Shadowsocks с обходом блокировок на Keenetic

Предыстория

Не претендую на открытие Америки в этой публикации, т.к. она является компиляцией различных комментариев и статей, в т.ч. на Habr. Не судите строго, надеюсь на помощь в развитии этого направления. Делал эту инструкцию для себя и специально с нуля, чтобы каждый новичок смог повторить те же действия.

Необходимо

  • Любой Keenetic с поддержкой USB. Можно установить и на внутреннюю память, но не рекомендуется

  • Актуальная версия KeeneticOs (на данный момент 3.7.4)

  • Flash-накопитель любого размера (хватит даже 256Мб, но в 2022 году таких уже не найдёшь)

Раздел 1. Установка Entware

  1. Форматирование флешки в ext4. Я использовал MiniTool Partition Wizard Free, можно использовать любую другую программу

81e78cae6b7122d0e3cd51dcf9b7134e.png62c4f549f013751a2ab6a378e0d41ed6.pngfbdea4bc4d0e055c823137485c25d91f.png

  1. Воспользуемся инструкцией на официальном сайте Keenetic

  • Скачиваем mipsel

  • Вставляем отформатированную флешку в роутер

  • Заходим в раздел Управление — Приложения и выбираем нашу флешку

    В настройках роутера предварительно должно быть включено приложение »Сервер SMB» для доступа к подключаемым USB-дискам по сети.

845107d48d77157c9d5029006e0b3969.png4680afc381244546f331c2217de7b62d.png

  • В настройках роутера заходим в раздел Управление — OPKG, выбираем нашу флешку и удаляем сценарий, если он есть и нажимаем кнопку Сохранить

cc1dd0add8d48f90ca774b4559c42c8a.png

  • Примерно спустя минуту заходим обратно в Управление — Приложения и выбираем нашу флешку. Видим, что у нас установился entware по наличию некоторого количества папок.

e9a3111407133b33e31c922881766bff.png

  • Скачиваем Putty (на данный момент актуально putty-64bit-0.76-installer.msi) и запускаем её. Простенькие настроечки (если что их можно сохранить кнопкой Save)

d62fb888f9675f5cfe77588e5d7e9b16.png

При возможных предупреждениях соглашаемся (кнопка Accept)

  • Вводим логин «root» (без кавычек), нажимаем Enter, пароль «keenetic» (также без кавычек) (при вводе пароля курсор не двигается — это нормально), также Enter. Должно отобразиться:

c768593415a61f548c5ea4a1ed8d0bab.png

вводим команду

passwd

и дважды вводим пароль. Курсор при вводе пароля также не двигается

  • Обновим opkg

P.S. здесь и далее — для копирование команды в командную строку необходимо скопировать текст на этом сайте и вставить в командную строку с помощью правой кнопкой мыши

opkg update

61ddb519179db6ed68bc9b40e24a8ac1.png

Раздел 2. Установка Shadowsocks и необходимых пакетов

За основу данного раздела взята вот эта инструкция

  1. Устанавливаем необходимые компоненты с помощью настроек роутера: Общие настройки > Изменить набор компонентов

  • Протокол IPv6

  • Затем, после обновления и перезагрузки роутера, «Модули ядра подсистемы Netfilter» и, на всякий случай «Пакет расширения Xtables-addons для Netfilter» ещё раз перезагружаем роутер

  1. Начинаем настраивать наш Entware

  • Для этого подключаемся к Putty (см предыдущий раздел)

  • Вводим логин и пароль (если логин и пароль не меняли то root-keenetic)

  • Вводим команду

opkg install mc bind-dig cron dnsmasq-full ipset iptables shadowsocks-libev-ss-redir shadowsocks-libev-config
  1. Инициализация ipset, создание множества IP-адресов unblock (100-ipset.sh)

  • Проверьте, что в системе вашего маршрутизатора есть поддержка множества hash: net (как оказалась, не во всех маршрутизаторах Keenetic она есть):

ipset create test hash:net
  • Если команда никаких ошибок и сообщений не выдала, значит поддержка есть, и просто следуйте инструкции дальше. В противном случае (есть ошибка) в следующем скрипте вам нужно заменить hash: net на hash: ip. При этом вы потеряете возможность разблокировки по диапазону и CIDR.
    Скорее всего ошибок не будет у Вас

  • Создайте пустое множество адресов с именем unblock при загрузке маршрутизатора. Для этого создайте файл /opt/etc/ndm/fs.d/100-ipset.sh:

mcedit /opt/etc/ndm/fs.d/100-ipset.sh

Вставляем содержимое с помощью сочетания клавиш Shift+Insert. Далее в этой инструкции мы также будем использовать это сочетания клавиш

#!/bin/sh
[ "$1" != "start" ] && exit 0
ipset create unblock hash:net -exist
exit 0

После этого нажимаем сохранить (клавиша F2), соглашаемся (Enter) и выход (клавиша F10). Эти сочетания также будут использоваться далее

chmod +x /opt/etc/ndm/fs.d/100-ipset.sh
  1. Настройка Shadowsocks на примере Highload-VPN. Не является рекламой. Пока там всё бесплатно, они обещают бесплатный доступ с небольшими ограничениями, а вскоре появится информация о платном доступе, но, говорят, не слишком дорогой. Вы можете использовать любой другой сервис, либо настроить самостоятельно Shadowsocks на своём сервере, например по этой инструкции. Только теперь я не знаю как оплатить свой сервер за рубежом)))). За основу этого пункта взята эта инструкция.

  • После регистрации авторизуемся на сайте и заходим в панель управления

  • У меня автоматически создался ключ. Нажимаем на кнопку «Показать»

f0e628649ac6cf9c4ba8f80580608c01.png49ff2168e945ca49cc1d03dfec49130a.png

  • Синюю и зелёную часть мы также будем использовать, но позже. Пока нас интересует часть, выделенная красным цветом (от начала до «собачки»). Копируем её в буфер обмена. Она закодирована в кодировке base64, поэтому нам нужно её раскодировать. Можем использовать этот сайт

  • В верхнее поле вставляем нашу ссылку и нажимаем кнопку Decode. Появится декодированная строка. Нас будет интересовать пароль, который находится после двоеточия

4418d69f5926e79a5f30a4fef9e0c0e7.png

mcedit /opt/etc/shadowsocks.json
  • Редактируем наш файл. Изменяем строку server (в моём случае 5.5.5.5) на ip адрес (или доменное имя) из ключа, который мы получили на сайте (см вторую картинку наверх). Это «синяя» часть нашего ключа. «Зелёную» часть нашего ключа копируем в server_port (в моём случае 666). В поле password мы копируем пароль из декодированной строки (предыдущая картинка, текст выделенный красным, но после двоеточия). local_port изменяем на любой свободный порт. Можно оставить этот

{
    "server":["5.5.5.5"],
    "mode":"tcp_and_udp",
    "server_port":666,
    "password":"8888888",
    "timeout":86400,
    "method":"chacha20-ietf-poly1305",
    "local_address": "::",
    "local_port": 1082,
    "timeout": 300,
    "fast_open": false,
    "ipv6_first": true
}

dd718e0f53074b80c938848b72961d03.png

Сохраняем и выходим (напомню F2, F10)

mcedit /opt/etc/init.d/S22shadowsocks

ea00589c81ac110c5490548d92ff935f.png

Сохраняем и выходим

  1. Список доменов (и не только) для обхода блокировки (unblock.txt)

mcedit /opt/etc/unblock.txt

Каждая строка может содержать доменное имя, IP-адрес, диапазон или CIDR. Можно использовать символ # для комментирования строк.

###Торрент-трекеры
rutracker.org
kinozal.tv
###Каталоги медиаконтента для программ
filmix.cc
###Книги
lib.rus.ec
###Разное
2ip.ru

#facebooktwitterinstagram
facebook.com
twitter.com
instagram.com

###Пример разблокировки по IP (убрать # в начале строки)
#195.82.146.214
###Пример разблокировки по CIDR (убрать # в начале строки)
#103.21.244.0/22
###Пример разблокировки по диапазону (убрать # в начале строки)
#100.100.100.200-100.100.100.210

С помощью данного файла на twitter, facebook и instagram у меня через роутер теперь спокойно заходит. Сайт 2ip будет использоваться для проверки ip

Сохраняем и выходим

  1. Скрипт для заполнения множества unblock IP-адресами заданного списка доменов (unblock_ipset.sh) и дополнительного конфигурационного файла dnsmasq из заданного списка доменов (unblock_dnsmasq.sh)

mcedit /opt/bin/unblock_ipset.sh
#!/bin/sh
until ADDRS=$(dig +short google.com @localhost) && [ -n "$ADDRS" ] > /dev/null 2>&1; do sleep 5; done
while read line || [ -n "$line" ]; do
  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue
  cidr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}')
  if [ ! -z "$cidr" ]; then
    ipset -exist add unblock $cidr
    continue
  fi
  range=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}-[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
  if [ ! -z "$range" ]; then
    ipset -exist add unblock $range
    continue
  fi
  addr=$(echo $line | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
  if [ ! -z "$addr" ]; then
    ipset -exist add unblock $addr
    continue
  fi
  dig +short $line @localhost | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{system("ipset -exist add unblock "$1)}'
done < /opt/etc/unblock.txt
chmod +x /opt/bin/unblock_ipset.sh
mcedit /opt/bin/unblock_dnsmasq.sh
#!/bin/sh
cat /dev/null > /opt/etc/unblock.dnsmasq
while read line || [ -n "$line" ]; do
  [ -z "$line" ] && continue
  [ "${line:0:1}" = "#" ] && continue
  echo $line | grep -Eq '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' && continue
  echo "ipset=/$line/unblock" >> /opt/etc/unblock.dnsmasq
done < /opt/etc/unblock.txt
chmod +x /opt/bin/unblock_dnsmasq.sh
unblock_dnsmasq.sh
cat /opt/etc/unblock.dnsmasq

Картина будет примерно такая

e1c3e8ff215e59e0eb9d7b1a09125020.png

  1. Скрипт ручного принудительного обновления системы после редактирования списка доменов (unblock_update.sh)

  • Создаём его

mcedit /opt/bin/unblock_update.sh
#!/bin/sh
ipset flush unblock
/opt/bin/unblock_dnsmasq.sh
/opt/etc/init.d/S56dnsmasq restart
/opt/bin/unblock_ipset.sh &
chmod +x /opt/bin/unblock_update.sh
  1. Скрипт автоматического заполнения множества unblock при загрузке маршрутизатора (S99unblock)

mcedit /opt/etc/init.d/S99unblock
#!/bin/sh
[ "$1" != "start" ] && exit 0
/opt/bin/unblock_ipset.sh &
chmod +x /opt/etc/init.d/S99unblock
  1. Перенаправление пакетов с адресатами из unblock в Shadowsocks

mcedit /opt/etc/ndm/netfilter.d/100-redirect.sh
#!/bin/sh
[ "$type" == "ip6tables" ] && exit 0
if [ -z "$(iptables-save 2>/dev/null | grep unblock)" ]; then
    ipset create unblock hash:net family inet -exist
    iptables -I PREROUTING -w -t nat -i br0 -p tcp -m set --match-set unblock dst -j REDIRECT --to-port 1082
    iptables -I PREROUTING -w -t nat -i br0 -p udp -m set --match-set unblock dst -j REDIRECT --to-port 1082
fi
if [ -z "$(iptables-save 2>/dev/null | grep "udp \-\-dport 53 \-j DNAT")" ]; then
    iptables -w -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to 192.168.1.1
fi
if [ -z "$(iptables-save 2>/dev/null | grep "tcp \-\-dport 53 \-j DNAT")" ]; then
    iptables -w -t nat -I PREROUTING -i br0 -p tcp --dport 53 -j DNAT --to 192.168.1.1
fi
exit 0
chmod +x /opt/etc/ndm/netfilter.d/100-redirect.sh
  1. Настройка dnsmasq и подключение дополнительного конфигурационного файла к dnsmasq

cat /dev/null > /opt/etc/dnsmasq.conf
mcedit /opt/etc/dnsmasq.conf
user=nobody
bogus-priv
no-negcache
clear-on-reload
bind-dynamic
listen-address=192.168.1.1
listen-address=127.0.0.1
min-port=4096
cache-size=1536
expand-hosts
log-async
conf-file=/opt/etc/unblock.dnsmasq
server=8.8.8.8
  1. Добавление задачи в cron для периодического обновления содержимого множества unblock

  • Откроем файл:

mcedit /opt/etc/crontab
00 06 * * * root /opt/bin/unblock_ipset.sh
  • При желании остальные строчки можно закомментировать, поставив решётку в начале. Затем сохраняем и закрываем

]
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin:/opt/sbin
MAILTO=""
HOME=/
# ---------- ---------- Default is Empty ---------- ---------- #
#*/1 * * * * root /opt/bin/run-parts /opt/etc/cron.1min
#*/5 * * * * root /opt/bin/run-parts /opt/etc/cron.5mins
#01 * * * * root /opt/bin/run-parts /opt/etc/cron.hourly
#02 4 * * * root /opt/bin/run-parts /opt/etc/cron.daily
#22 4 * * 0 root /opt/bin/run-parts /opt/etc/cron.weekly
#42 4 1 * * root /opt/bin/run-parts /opt/etc/cron.monthly
00 06 * * * root /opt/bin/unblock_ipset.sh
  1. Отключение штатного DNS-сервера и перезагрузка маршрутизатора

  • ·Запускаем командную строку в Windows (открываем пуск и начинаем писать «Командная строка»)

  • Пишем (ip роутера поменяете если другой)

telnet 192.168.1.1
  • Логин с паролем вводим от роутера, а не entware (скорее всего admin, а пароль лично Ваш)

  • Вписываем поочерёдно 3 команды

opkg dns-override
system configuration save
system reboot
exec sh

а затем

su - root

и можно использовать любые команды Entware по типу тех, которые мы вводили в данной инструкции.

Заключение

Жду отзывов и улучшения инструкции.

© Habrahabr.ru