Установка Shadowsocks с обходом блокировок на Keenetic
Предыстория
Не претендую на открытие Америки в этой публикации, т.к. она является компиляцией различных комментариев и статей, в т.ч. на Habr. Не судите строго, надеюсь на помощь в развитии этого направления. Делал эту инструкцию для себя и специально с нуля, чтобы каждый новичок смог повторить те же действия.
Необходимо
Любой Keenetic с поддержкой USB. Можно установить и на внутреннюю память, но не рекомендуется
Актуальная версия KeeneticOs (на данный момент 3.7.4)
Flash-накопитель любого размера (хватит даже 256Мб, но в 2022 году таких уже не найдёшь)
Раздел 1. Установка Entware
Форматирование флешки в ext4. Я использовал MiniTool Partition Wizard Free, можно использовать любую другую программу
Воспользуемся инструкцией на официальном сайте Keenetic
Скачиваем mipsel
Вставляем отформатированную флешку в роутер
Заходим в раздел Управление — Приложения и выбираем нашу флешку
В настройках роутера предварительно должно быть включено приложение »Сервер SMB» для доступа к подключаемым USB-дискам по сети.
В настройках роутера заходим в раздел Управление — OPKG, выбираем нашу флешку и удаляем сценарий, если он есть и нажимаем кнопку Сохранить
Примерно спустя минуту заходим обратно в Управление — Приложения и выбираем нашу флешку. Видим, что у нас установился entware по наличию некоторого количества папок.
Скачиваем Putty (на данный момент актуально putty-64bit-0.76-installer.msi) и запускаем её. Простенькие настроечки (если что их можно сохранить кнопкой Save)
При возможных предупреждениях соглашаемся (кнопка Accept)
Вводим логин «root» (без кавычек), нажимаем Enter, пароль «keenetic» (также без кавычек) (при вводе пароля курсор не двигается — это нормально), также Enter. Должно отобразиться:
вводим команду
passwd
и дважды вводим пароль. Курсор при вводе пароля также не двигается
Обновим opkg
P.S. здесь и далее — для копирование команды в командную строку необходимо скопировать текст на этом сайте и вставить в командную строку с помощью правой кнопкой мыши
opkg update
Раздел 2. Установка Shadowsocks и необходимых пакетов
За основу данного раздела взята вот эта инструкция
Устанавливаем необходимые компоненты с помощью настроек роутера: Общие настройки > Изменить набор компонентов
Протокол IPv6
Затем, после обновления и перезагрузки роутера, «Модули ядра подсистемы Netfilter» и, на всякий случай «Пакет расширения Xtables-addons для Netfilter» ещё раз перезагружаем роутер
Начинаем настраивать наш Entware
Для этого подключаемся к Putty (см предыдущий раздел)
Вводим логин и пароль (если логин и пароль не меняли то root-keenetic)
Вводим команду
opkg install mc bind-dig cron dnsmasq-full ipset iptables shadowsocks-libev-ss-redir shadowsocks-libev-config
Инициализация 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
Настройка Shadowsocks на примере Highload-VPN. Не является рекламой. Пока там всё бесплатно, они обещают бесплатный доступ с небольшими ограничениями, а вскоре появится информация о платном доступе, но, говорят, не слишком дорогой. Вы можете использовать любой другой сервис, либо настроить самостоятельно Shadowsocks на своём сервере, например по этой инструкции. Только теперь я не знаю как оплатить свой сервер за рубежом)))). За основу этого пункта взята эта инструкция.
После регистрации авторизуемся на сайте и заходим в панель управления
У меня автоматически создался ключ. Нажимаем на кнопку «Показать»
Синюю и зелёную часть мы также будем использовать, но позже. Пока нас интересует часть, выделенная красным цветом (от начала до «собачки»). Копируем её в буфер обмена. Она закодирована в кодировке base64, поэтому нам нужно её раскодировать. Можем использовать этот сайт
В верхнее поле вставляем нашу ссылку и нажимаем кнопку Decode. Появится декодированная строка. Нас будет интересовать пароль, который находится после двоеточия
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)
mcedit /opt/etc/init.d/S22shadowsocks
Сохраняем и выходим
Список доменов (и не только) для обхода блокировки (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
Сохраняем и выходим
Скрипт для заполнения множества 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
Картина будет примерно такая
Скрипт ручного принудительного обновления системы после редактирования списка доменов (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
Скрипт автоматического заполнения множества 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
Перенаправление пакетов с адресатами из 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
Настройка 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
Добавление задачи в 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
Отключение штатного DNS-сервера и перезагрузка маршрутизатора
·Запускаем командную строку в Windows (открываем пуск и начинаем писать «Командная строка»)
Пишем (ip роутера поменяете если другой)
telnet 192.168.1.1
Логин с паролем вводим от роутера, а не entware (скорее всего admin, а пароль лично Ваш)
Вписываем поочерёдно 3 команды
opkg dns-override
system configuration save
system reboot
exec sh
а затем
su - root
и можно использовать любые команды Entware по типу тех, которые мы вводили в данной инструкции.
Заключение
Жду отзывов и улучшения инструкции.