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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Предыстория

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

Необходимо

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

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

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

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

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

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

  • Скачиваем mipsel

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

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

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

  • Создаём папку install

  • Ставим курсор на новую папку и импортируем туда файл mipsel с компьютера

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

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

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

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

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

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

passwd

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

  • Обновим opkg

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

opkg update

Раздел 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 на своём сервере, например по этой инструкции. Только теперь я не знаю как оплатить свой сервер за рубежом)))). За основу этого пункта взята эта инструкция.

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

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

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

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

  • Возвращаемся в Putty и выполняем команду

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
}

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

  • Редактируем исполняемый файл Shadowsocks

mcedit /opt/etc/init.d/S22shadowsocks
  • Меняем ss-local на ss-redir

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

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

  • Создадим файл /opt/etc/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)

  • Создадим скрипт /opt/bin/unblock_ipset.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
  • Создадим скрипт /opt/bin/unblock_dnsmasq.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
  • Запускаем скрипт и затем проверяем создался ли файл. Здесь 2 команды, вводим последовательно

unblock_dnsmasq.sh
cat /opt/etc/unblock.dnsmasq

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

  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
  • Записываем содержимое. Если необходимо – меняем ip адрес роутера и наш порт. Сохраняем и закрываем

#!/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

  • Удалим содержимое конфигурационного файла dnsmasq:

cat /dev/null > /opt/etc/dnsmasq.conf
  • Откроем файл конфигурации dnsmasq:

mcedit /opt/etc/dnsmasq.conf
  • Записываем содержимое. При необходимости меняем ip роутера. Сохраняем и закрываем

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
  • Роутер перезагрузится и Вы сможете пользоваться нужными Вам сайтами

    1. После перезагрузки роутера у меня почему-то пропал доступ по 222 порту через putty по ssh. В итоге я подключаюсь по 22 порту через тот же putty, ввожу логин с паролем от роутера, пишу команду:

exec sh

а затем

su - root

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

Заключение

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

Источник: https://habr.com/ru/post/663862/


Интересные статьи

Интересные статьи

Данная статья - это не научный прорыв, а лишь помощник быстрее понять как работает стандартный функционал в BitrixДавайте представим, что в разделе каталога у нас 150 запросов к БД. Вроде бы немного п...
Публикуем перевод статьи Installing XSS Hunter и проверяем инстукцию на собственном примере. Спойлер: Всё работает! Читать дальше →
cSvn — это web-интерфейс к Subversion репозиториям. Основу cSvn представляет CGI-скрипт написанный на языке С. В данной статье рассматривается установка и настройка cSvn для работы с и...
В 1С-Битрикс: Управление сайтом (как и в Битрикс24) десятки, если не сотни настраиваемых типов данных (или сущностей): инфоблоки, пользователи, заказы, склады, форумы, блоги и т.д. Стр...
Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики — через Джиру.