Предыстория
Не претендую на открытие Америки в этой публикации, т.к. она является компиляцией различных комментариев и статей, в т.ч. на Habr. Не судите строго, надеюсь на помощь в развитии этого направления. Делал эту инструкцию для себя и специально с нуля, чтобы каждый новичок смог повторить те же действия.
Необходимо
Любой Keenetic с поддержкой USB. Можно установить и на внутреннюю память, но не рекомендуется
Актуальная версия KeeneticOs (на данный момент 3.7.4)
Flash-накопитель любого размера (хватит даже 256Мб, но в 2022 году таких уже не найдёшь)
Раздел 1. Установка Entware
Форматирование флешки в ext4. Я использовал MiniTool Partition Wizard Free, можно использовать любую другую программу
Воспользуемся инструкцией на официальном сайте 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 и необходимых пакетов
За основу данного раздела взята вот эта инструкция
Устанавливаем необходимые компоненты с помощью настроек роутера: Общие настройки > Изменить набор компонентов
Протокол 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. Появится декодированная строка. Нас будет интересовать пароль, который находится после двоеточия
Возвращаемся в 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
Сохраняем и выходим
Список доменов (и не только) для обхода блокировки (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
Сохраняем и выходим
Скрипт для заполнения множества 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
Картина будет примерно такая
Скрипт ручного принудительного обновления системы после редактирования списка доменов (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
Записываем содержимое. Если необходимо – меняем 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
Настройка 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
Добавление задачи в 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
Роутер перезагрузится и Вы сможете пользоваться нужными Вам сайтами
После перезагрузки роутера у меня почему-то пропал доступ по 222 порту через putty по ssh. В итоге я подключаюсь по 22 порту через тот же putty, ввожу логин с паролем от роутера, пишу команду:
exec sh
а затем
su - root
и можно использовать любые команды Entware по типу тех, которые мы вводили в данной инструкции.
Заключение
Жду отзывов и улучшения инструкции.