Jump to content

ankar84

Forum Members
  • Content count

    114
  • Joined

  • Last visited

Community Reputation

18 Good

About ankar84

  • Rank
    Advanced Member

Equipment

  • Keenetic
    Keenetic Ultra v2.12.B.0.0-1
  1. upx
    UPX

    Это лучше сделать вот тут через Package Request
  2. upx
    UPX

    Тогда, видимо, лучше оставить все как есть. А кто желает, пусть сжимает самостоятельно.
  3. upx
    UPX

    @zyxmon @Александр Рыжов может быть имеет смысл добавить сжатие сразу в пакет?
  4. Предлагаю ознакомиться с темой, возможно там есть ответ на ваш запрос: От себя добавлю (хотя это есть в моем первом посте) - рекомендую использовать dnscrypt-proxy2 как единственный DNS сервер на роутере и дать ему выбирать самый быстрый из серверов из предложенных ему вами. Именно так поступает, насколько я понял, @vasek00
  5. upx
    UPX

    Как уменьшали, если не секрет?
  6. В итоге полное решение на данный момент это вынесение оповещательной части бота в отдельный сервис (демон). По аналогии создал /opt/bin/bashbotevent.sh: #!/opt/bin/bash tail -f -n 0 /opt/var/log/syslog.log | while read line ; do if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi done В этот скрипт со временем будут добавлять реакции на нужные мне события. И создал новый /opt/etc/init.d/S52bashbotevent: #!/bin/sh ENABLED=yes PROCS=bashbotevent.sh ARGS="" PREARGS="screen -dmS bashbot.socket" DESC=$PROCS PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin . /opt/etc/init.d/rc.func Оба сделал исполняемыми chmod +x /opt/bin/bashbotevent.sh chmod +x /opt/etc/init.d/S52bashbotevent И после # /opt/etc/init.d/S52bashbotevent start Бот реагирует и на команды и присылает сообщения о не успешных попытках авторизации.
  7. Мне с помощью телеграм бота хочется реализовать такого помощника, который всегда под рукой, который помогает решать если не повседневные, то наиболее частые задачи. Основное - хочется в моменте получать от бота сообщения, о том, что кто-то успешно или не успешно подключается на WebUI, по FTP или подключается к серверу VPN. В качестве команд, которые нужно отдавать боту наиболее интересна перезагрузка роутера и добавление торрента на закачку через URL на торрент файл. Что уже сделал. # vi /opt/bin/tg_say.sh # chmod +x /opt/bin/tg_say.sh tg_say.sh: #!/opt/bin/bash API_TOKEN='токен моего бота' CHAT_ID='айди моего с ботом чата' if [ -z "$CHAT_ID" ]; then echo 'Please, define CHAT_ID first! See "chat":{"id":xxxxxxx string below:' /opt/bin/wget -qO - https://api.telegram.org/bot$API_TOKEN/getUpdates exit 1 fi MSG="<b>$(hostname)</b>: $@" /opt/bin/wget -q "https://api.telegram.org/bot$API_TOKEN/sendMessage?chat_id=$CHAT_ID&parse_mode=html&text=$MSG" 2>&1 if [ $? -eq 0 ]; then echo 'Message sent successfully.' else echo 'Error while sending message!' exit 1 fi Поправил /opt/etc/init.d/S51bashbot как тут рекомендовали с установкой screen через opkg install screen #!/bin/sh ENABLED=yes PROCS=bashbot.sh ARGS="" PREARGS="screen -dmS bashbot.socket" DESC=$PROCS PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin . /opt/etc/init.d/rc.func И теперь пробую править bashbot.sh с помощью наработок и советов этой темы: #!/opt/bin/bash TOKEN='токен моего бота' NAMEA='мой логин в телеграм' URL='https://api.telegram.org/bot'$TOKEN MSG_URL=$URL'/sendMessage?chat_id=' UPD_URL=$URL'/getUpdates?offset=' KMSG_URL=$URL'/sendMessage' OFFSET=0 TIMEOUT='&timeout=30' function send_message { res=$(curl --insecure --data-urlencode "text=$2" "$MSG_URL$1&") } function send_keyboard { local text="$1"; shift 1; local keyboard=init OLDIFS=$IFS; IFS=$(echo -en "\"") for f in $*;do [ "$f" != " " ] && local keyboard="$keyboard, [\"$f\"]";done IFS=$OLDIFS; local keyboard=${keyboard/init, /} res=$(curl -s "$KMSG_URL" --header "content-type: multipart/form-data" -F "chat_id=$TARGET" -F "text=$text" -F "reply_markup={\"keyboard\": [$keyboard],\"one_time_keyboard\": true}") } while true; do { res=$(curl --insecure $UPD_URL$OFFSET$TIMEOUT) TARGET=$(echo $res | JSON.sh | egrep '\["result",0,"message","chat","id"\]' | cut -f 2) OFFSET=$(echo $res | JSON.sh | egrep '\["result",0,"update_id"\]' | cut -f 2) MESSAGE=$(echo $res | JSON.sh -s | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2) USER=$(echo $res | JSON.sh | egrep '\["result",0,"message","from","username"\]' | cut -f 2 | cut -d '"' -f 2) [ -z "$MESSAGE" ] || echo "[$(date +%Y.%m.%d_%H:%M:%S)][$USER] $MESSAGE" >> /opt/var/log/bashbot.log OFFSET=$((OFFSET+1)) tail -f с | \ while read line ; do if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi done if [ $OFFSET != 1 ]; then case $MESSAGE in '/help') send_keyboard "Bot knows commands:" "/help" "/top" "/meminfo" "/cpuinfo" "/uname" "/log";; '/start') msg="Just few commands are implemented. Blame @ryzhov_al if something goes wrong.";; '/top') msg="$(top -n1 | head -n3)";; '/meminfo') msg="$(cat /proc/meminfo)";; '/cpuinfo') msg="$(cat /proc/cpuinfo)";; '/uname') msg="$(uname -a)";; '/log') msg="$(cat /opt/var/log/bashbot.log)";; *) msg=$(ndmq -p "$MESSAGE" -x);; esac [ $USER = $NAMEA ] || send_message "$TARGET" "Sorry. Private bot" [ $USER = $NAMEA ] && send_message "$TARGET" "$msg" fi } &>/dev/null; done Но в таком виде сообщения о не успешной авторизиции приходят, но бот не реагирует на посылаемые ему команды. Я не очень понимаю, где мне брать журнал "реального времени". То есть для сбора логов у меня в Entware установлен syslog-ng, который собирает все логи и пишет их в файл (/opt/var/log/syslog.log) но в этом случае получается, что стоит мне перезапустить бота и он тут же высыпет мне россыпь сообщений о неудачной авторизации в WebUI (мои предыдущие тесты). А мне хочется, что бы бот начал смотреть "живой" лог роутера и парсил его на лету. Файлов в /var/log/ у меня нет. В общем, сейчас 2 проблемы - совместить в одном скрипте бота ответы на мои запросы и понять как парсить живой лог роутера. UPD: Кажется первая проблема решена с помощью параметра -n 0 команды tail. Теперь бот реагирует только на актуальные события, которые произошли после его запуска, а не на все, что нашел в логе. То есть часть парсера логов теперь выглядит вот так: tail -f -n 0 /opt/var/log/syslog.log | while read line ; do if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi done
  8. С моим листом в около 2 Мб потребление RAM побольше. На текущий момент смотрю - 35% (90/256 Мб) Все верно, именно поэтому и увеличил размер кэша. Домашние в основном в инстаграмчиках сидят и прочих тайм-киллерах, так что их адреса один раз полученные с задержкой в 100 мс из кэша не исчезают (я надеюсь). Лично я не писал, что он самый быстрый. А то, что он последние пару месяцев популярный, имхо, с этим сложно спорить. Проект только запустили, об этом трубили многие профильные и не очень издания, красивый адрес опять же. Но тут суть вообще в том, что fallback_resolver используется при очень определенных условиях и не слишком часто, а именно только для разрешения адреса со списком dnscrypt серверов в случае, если системный резолвер не доступен или отключен. Так что можно оставить сервер Quad9 DNS.
  9. Данная тема создана по следам инструкций по использованию предыдущих версий первой ветки замечательного приложения dnscrypt-proxy, которое автор вернул к плотной разработке, правда, сменив язык на Go. Для начала рекомендую ознакомиться с первыми статьями: Сразу уточню, вторая версия dnscrypt-proxy подойдет тем, у кого роутер с достаточным количеством оперативной памяти, так как приложения на go довольно требовательны к ресурсам. Например, на моей Keenetic Ultra проблем с памятью нет, поэтому я и перешел на вторую ветку dnscrypt-proxy не особо раздумывая. Ознакомиться со всеми преимуществами dnscrypt-proxy2 перед первой веткой можно на странице проекта на GitHub. Хочу заметить, что при использовании dnscrypt-proxy2 уже нет необходимости в связке с dnsmasq или чем-то еще. dnscrypt-proxy2 сам умеет и кэшировать запросы и работать с несколькими серверами сразу, выбирая наиболее быстрый и ещё много чего. На момент написания данной статьи актуальной версией является dnscrypt-proxy 2.0.14 Итак, начиная с версии 2.0.8 (кажется) dnscrypt-proxy2 собрана уважаемым @zyxmon в тестовой ветке репозитория Entware. Пользователям Entware-3x и Entware-NG нужно перейти на репозиторий Entware с помощью следующих команд, введенных 2 раза подряд (за подробностями и решением проблем нужно пройти в соответствующую тему) иначе будете получать ошибку, что пакет dnscrypt-proxy2 не найден. opkg update opkg upgrade Начиная с 2.0.11 пакет dnscrypt-proxy2 доступен для обычной установки из репозитория Entware следующей командой: # opkg install dnscrypt-proxy2 Далее установим вспомогательные пакеты: iptables для того, чтобы "приземлить" все DNS запросы наших клиентов на наш dnscrypt-proxy2 cron для того, чтобы обновлять список блокируемых адресов в автоматическом режиме на регулярной основе. # opkg install cron iptables Стандартный конфигурационный файл достаточно полно документирован комментариями по той или иной настройке, да и в целом по-умолчанию всё должно запуститься успешно командой: # /opt/etc/init.d/S09dnscrypt-proxy2 start Приведу некоторые отличия моего конфигурационного файла от стандартного. listen_addresses = ['192.168.1.1:53', '[::1]:53'] В отличии от дефолтовой строчки, где сервер будет слушать на 127.0.0.1 мне было необходимо, чтобы сервер "слушал" на 192.168.1.1, чтобы я мог прописать данный сервер в настройках DHCP как сервер DNS для всех устройств моей домашней сети. Кстати, так как будем использовать dnscrypt-proxy2 как единственный DNS сервер на роутере, необходимо отключить (а точнее перевести в специальный режим работы при котором компоненты прошивки все равно смогут обращаться к DNS резолверу прошивки через RPC оставив порт 53 свободным) основной DNS сервер NDMS. Сделаем это следующими командами в Cli (не в Entware): opkg dns-override system configuration save Включать только на устройствах с функционирующим IPv6. На самом деле я особой скорости у серверов IPv6 не увидел, так что можно и не включать. ipv6_servers = true Полный путь до журнала нашего dnscrypt-proxy2 log_file = '/opt/var/log/dnscrypt-proxy-v2.log' Для диагностики проблем так же будет полезным включить наиболее подробный уровень логгирования. log_level = 0 Далее идет fallback_resolver. Вообще его можно не менять, но мне захотелось поставить популярный ныне CloudFlare DNS с его красивым адресом. fallback_resolver = '1.1.1.1:53' Размер кэша я ставлю в 4 раза больше, чем по умолчанию. Можно не менять. Кстати, в ответах просьба высказаться, какой размер кэша оптимальный по вашему? cache_size = 2048 Далее идет раздел блокировки (привет РКН). В качестве значения параметра blacklist_file указываем полный путь до вашего файла с блокируемыми доменными именами. Я свой файл получаю скриптом автора dnscrypt-proxy blacklist_file = '/opt/etc/dnscrypt-proxy/dnscrypt-blacklist-domains.txt' А обновляю этот список еженедельно с помощью cron: Создаем файл скрипта /opt/etc/cron.weekly/generate-blacklist для еженедельного обновления со следующим содержимым: #!/opt/bin/sh cd /opt/etc/dnscrypt-proxy/generate-domains-blacklists/ python generate-domains-blacklist.py -i > list.txt.tmp && mv -f list.txt.tmp /opt/etc/dnscrypt-proxy/dnscrypt-blacklist-domains.txt rm -f /opt/var/log/*.log /opt/etc/init.d/S09dnscrypt-proxy2 restart И не забываем сделать его исполняемым: chmod +x /opt/etc/cron.weekly/generate-blacklist Можно в принципе логи не зачищать, тогда строчку с rm нужно закомментировать или удалить. Для диагностики корректности блокировки того или иного ресурса или для отлова false positive блокировок рекомендую включить журнал того, что блокируется: log_file = '/opt/var/log/blocked.log' log_format = 'tsv Далее у меня прописан белый список доменных имен, которые не нужно блокировать никогда (привет РКН еще раз). На самом деле, данная опция появилась в последних версиях (кажется в 2.0.11) и ранее белый список обрабатывался скриптом генерации черного списка блокируемых адресов. То есть вхождения белого списка удалялись из черного при генерации. Теперь вот отдельная опция: whitelist_file = '/opt/etc/dnscrypt-proxy/generate-domains-blacklists/domains-whitelist.txt' Переходим к настройке dnscrypt серверов. И вот тут я очень рекомендую использовать серверы проекта OpenNIC. То есть настройка в конфигурационном файле у меня вот такая (закомментировал основной список публичных серверов и оставил только серверы проекта OpenNIC): # [sources.'public-resolvers'] # urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v2/public-resolvers.md', 'https://download.dnscrypt.info/resolvers-list/v2/public-resolvers.md'] # cache_file = 'public-resolvers.md' # minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3' # refresh_delay = 72 # prefix = '' [sources.'opennic'] url = 'http://download.dnscrypt.info/resolvers-list/v2/opennic.md' minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3' cache_file = 'opennic.md' format = 'v2' refresh_delay = 24 prefix = '' Почему именно OpenNIC? Используя именно эти серверы получаем один замечательный бонус - разрешение EmerCoin доменных имен типа *.lib и других. Благодаря этому я пользуюсь одним популярным торрент трекером по его доменному имени в зоне *.lib не занимаясь постоянным поиском живых зеркал. Опять же, эти серверы вроде бы не вносят своих блокировок и не логгируют запросы. Хотя как знать. Так же я НЕ рекомендую использовать серверы проекта компании Cisco - OpenDNS. Недавно @Александр Рыжов в канале Keenetic в одном известном мессенджере сообщил, что Cisco заворачивала на себя трафик mail.ru подставляя при этом фейковый сертификат, так что будьте бдительны. Так же прошу обратить внимание, большинство серверов проекта OpenNIC с поддержкой dnscrypt находятся в Европе и Америке, так что моментальных ответов ждать не приходится. У меня самый быстрый сервер дает около 100 мс, и на том спасибо. Отсюда и увеличенный размер кэша, которым я пытаюсь эти задержки свести к минимуму. Теперь переходим к очень важной теме, изучая которую я потратил много времени. А именно речь пойдет об использовании только локального DNS сервера dnscryprt-proxy2вместо провайдерских DNS серверов на всех устройствах сети. Суть здесь вот в чем. Начиная, кажется. с 6 версии ОС Андроид, видимо, для повышения стабильности (и, имхо, для утоления своей тотальной любознательности) параллельно посылает запросы и на тот сервер, что указан в сетевых настройках, которые получены устройством от DHCP сервера и на сервер 8.8.8.8 Я очень долго не мог понять, почему на всех устройствах я не вижу рекламу, так как она блокируется на роутере, но всегда вижу рекламу на своем Андроид смартфоне. Тогда я с помощью захвата пакетов все и обнаружил. Кстати, более простым способом было посмотреть трафик в Entware с помощью tcpdump. tcpdump -i br0 или tcpdump port 53 -n -nn -v Итак, для начала избавимся от провайдерских DNS серверов. В cli вводим вот эти 2 замечательные команды: interface ISP no ip dhcp client name-servers system configuration save Эти команды может быть и есть в документации по cli, но лично мне их удалось найти тут, на форуме в ответе уважаемого @Le ecureuil От слежки провайдера избавились, осталось приземлить все DNS запросы в корпорацию добра на наш сервер dnscrypt-proxy2. Здесь мне так же помог @Александр Рыжов на канале Keenetic. У данного метода есть и плюсы - например, при подмене локального DNS сервера вирусом на компьютере с Windows запросы пойдут все равно на роутер, а не DNS сервер злоумышленников. Есть и минусы, например, не весь трафик, который идет по UDP\53 не обязательно DNS запросы, это вполне может быть портом для подключения к, положим, OpenVPN серверу. Но так или иначе, для многих домашних сетей данный способ приносит больше плюсов, имхо. В вашем любимом текстовом редакторе создаем файл скрипта /opt/etc/ndm/netfilter.d/10-ClientDNS-Redirect.sh: #!/bin/sh [ "$type" == "ip6tables" ] && exit 0 [ "$table" != "nat" ] && exit 0 [ -z "$(iptables-save | grep " --dport 53 -j DNAT --to-destination 192.168.1.1")" ] && \ iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.1:53 exit 0 Либо, если любимого редактора еще нет, можно воспользоваться вот такой длинной командой: echo -e '#!/bin/sh\n[ "$type" == "ip6tables" ] && exit 0\n[ "$table" != "nat" ] && exit 0\n[ -z "$(iptables-save | grep " --dport 53 -j DNAT --to-destination 192.168.1.1")" ] && iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.1:53\nexit 0' >> /opt/etc/ndm/netfilter.d/10-ClientDNS-Redirect.sh Затем делаем созданный скрипт исполняемым: chmod +x /opt/etc/ndm/netfilter.d/10-ClientDNS-Redirect.sh Вероятно, скрипт можно написать значительно изящнее и ловить не UDP, но и TCP трафик, но у меня получилось только вот так. В ответах, гуру баша могут подсказать как сделать правильнее, подправлю для общего блага. Мне "приземление" только UDP трафика на 53 порт роутера помогло полностью избавиться от рекламы на всех устройствах домашней сети. Так что TCP можно и не трогать. В итоге: Защитили весь свой DNS трафик от перехвата со стороны провайдера и гугла Заблокировали рекламу на всех устройствах домашней сети (это наиболее актуально для всяких Смарт ТВ и других девайсов не нет возможности блокировать рекламу на самом устройстве) Получили разрешение имен *.lib и других, чем немного упростили себе жизнь в все более блокируемом интернете Диагностика проблем с запуском\работой. Для начала посмотрим журнал dnscrypt-proxy2 в том месте, где вы его настроили. С смотрю вот такой командой: # tail -f -n 30 /opt/var/log/dnscrypt-proxy-v2.log Следующая команда должна выдать PID процесса # ps | grep dnscrypt-proxy2 Проверить, слушается ли порт 53: # netstat -an | grep :53 tcp 0 0 192.168.1.1:53 0.0.0.0:* LISTEN tcp 0 0 ::1:53 :::* LISTEN udp 0 0 192.168.1.1:53 0.0.0.0:* udp 0 0 ::1:53 :::* Опять же все ограничения, которые касались использования первой версии dnscrypt-proxy справедливы и для второй, ссылки на инструкции я приложил выше. Это моя первая инструкция в этом разделе, так что сильно не пинать, а конструктивная критика крайне приветствуется. Если есть, что нужно подправить\доработать - пишите, вместе сделаем использование данного пакета проще и эффективнее.
  10. Прошу прощения, но скорее всего второй селф получился не по проблеме, а из-за моих экспериментов по оптимизации переадресации портов и правил межсетевого экрана. Когда поднял на роутеле L2TP\IPSec сервер, то сделал и проброс 500UDP+4500UDP и их же разрешил в межсетевом экране. А потом выяснилось, что эти правила и пробросы автоматически создаются при включении компонента L2TP\IPSec сервер. Поэтому я удалил в итоге все свои правила в межсетевом экране (а их было около 10). 4 правила помогли мне удалить на канале в телеграме. Эти правила были для Андроид устройств в сети и то, что они все запросы дублировали на 8.8.8.8. В итоге в OPKG сделал правило перенапраления всех запросов на 53 порт на DNS сервер роутера, коим у меня служит dnscrypt-proxy2. Так вот. Осталось 2 правила проброса - для FTP и HTTPS, которые я вчера и отключил (через WEB по HTTPS) и благополучно забыл про это. А сегодня проверил удаленно FTP - не работает, включил оба правила - заработал FTP и доступ по HTTPS на внешний адрес по KeenDNS имени. Так что селф тест в проблемном состоянии все еще собираю. П.С, Кстати, где можно взять инфо какие правила проброса портов и межсетевого экрана прописываются автоматически про включении того или иного компонента, а какие необходимо включать вручную?
  11. В следующем посте будет селф в моменте с недоступным по внешнему адресу вебом. Есть мысль, что проблема случается при закачке трансмишеном. Пока не качаешь, работает стабильно. Сегодня поставил один файл на закачку, словил проблему. Хотя может просто совпало.
  12. У меня на главной плавает 0-4% при отсутствии нагрузки со стороны клиентов.
  13. С помощью приложения поставил режим точки доступа и после перезагрузки общие настройки отображаются нормально. Поэтому собрал Селф тест, но так как был ребут, веб интерфейс по внешнему имени сейчас работает. В общем, в следующем посте будет селф при рабочем состоянии.
  14. Да, у меня тоже Ультра. Притом перезагрузишься, работает какое-то время и потом перестаёт отвечать. Может утекает что-то.
  15. Да, включил, попробовал зайти на внешнее имя, отключил. Роутер начал генерировать файл, потом эта ошибка. В логах вижу вот такое:
×