понедельник, 12 сентября 2016 г.

Windows Store и ошибка 0x80070005

Захотелось сегодня с маркета попробовать установить пару приложений. Но столкнулся с этой ошибкой. Гугл выдавал разные варианты решения. Но ни один из вариантов мне не помогал. Потом методом тыка заметил, что не устанавливается, если выбран отличный от системного диска (То есть если ставил не в С диск). Потратив еще минут 10 нашел причину. Проблема была в галочке "Сжимать содержимое диска". После снятия галочки и удаления директорий, который Windows Store создал при установке этих приложений, все пошло. 

вторник, 23 августа 2016 г.

Отображение доменов посещенных https ресурсов в логе Squid

Есть замечательные инструкции по поднятию прозрачного прокси Squid с фильтрацией https ресурсов. В частности https://habrahabr.ru/post/272733/. Все бы хорошо (сам использую, все прекрасно работает), но кое-что меня сильно раздражало. В логах сквида вместо адреса посещенного https ресурса указывался ip адрес. В век, когда каждый второй сайт переходит на https это становится проблемой, так как не понятно, что за ресурс посещает юзер и нужно ли блокировать этот ресурс. Потратив полдня на чтение мануалов нашел правильное решение для исправления ситуации. Суть в том, что мы создаем 2 ACL и 2 logformat параметра. Отдельно для логирования запросов на 80 порт и 443. logformat для 80 порта не будет заносить в лог записи о https соединениях. А второй logformat наоборот, пишет в лог только о запросах на 443 порт. Зачем это? дело в том, что для отображения SNI записи в логе надо добавить параметр %ssl::>sni. Но тут появляется другая проблема. Для https ресурсов в логе появляется и имя домена и его IP адрес. За занесение в лог ip адреса отвечает %ru. Вот его то мы и уберем в logformat для запросов на 443 порт. В итоге у нас получаются строки:

 acl https_port port 443  
 logformat https %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ssl::>sni %[un %Sh/%<a %mt  
 cache_access_log /var/log/squid3/access.log https https_port  
 acl http_port port 80  
 logformat http %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt.  
 cache_access_log /var/log/squid3/access.log http http_port  

Теперь в логе порядок и можно любимым парсером строить отчеты и не бояться встретить там IP адрес вместо домена (за исключением случаев когда пользователь заходит именно по IP, а не по доменному имени)

четверг, 31 марта 2016 г.

Dr.Web Esuite Server + Active Directory + Bind

Решил попробовать Dr.Web Esuite Server у себя в домене. Имею тестовый домен AD. В качестве DNS сервера используется bind9. При развертывании Dr.Web server  сразу столкнулся с проблемой при предложении установщика зарегистрировать сервис в AD. Постоянно ругался на ошибку  админа домена (мол не неправильно я его указал). Хотя логин и пароль были правильными. После 2-3 часов поиска проблем (гугл на это ничего не ответил) взял в руки tcpdump/wireshark и стал смотреть что происходит при попытке продолжить установку. И сразу увидел, что установщик пытается послать данные на порт 135 моего bind сервера. Но bind не открывает 135 порт. Его открывает процесс svhost на контроллере домена. Дело в том, что установщик смотрит, какие DNS серверы указаны в настройках подключения, так как считает, что DNS сервер находиться  на контроллере домена. И в стандартной ситуации так и бывает. Но я по некоторым причинам отказался от DNS сервера Microsoft и использовал Bind. Видимо разработчики Dr.web не учитывали такой поворот. Но вернемся к проблеме. Не долго думая я перенаправил просто все запросы на 135 порт на сервер AD с помощью правил iptables

  iptables -t nat -I PREROUTING -p tcp -d <dnsservip> --dport 135 -j DNAT --to-destination <adserverip>:135  
  iptables -t nat -A POSTROUTING -p tcp --dst <adserverip> --dport 135 -j SNAT --to-source <dnsservip>  

Где
<dnsservip> IP адрес нашего сервера DNS
<adserverip> IP адрес контроллера домена.

Сразу после добавления правил установка пошла дальше. 

среда, 28 октября 2015 г.

Обход ограничения при переносе больших файлов плагином datadir в Rutorrent

Кто пользуется Rutorrent в 32 битных системах наверное сталкивались с проблемой, при которой нельзя переносить торренты размером больше 2/4 Gb. Все основные предложения по обходу этой проблемы заключались в переходе на 64 битную ОС. Я же не мог взять и так просто перейти (домашний шлюз вот уже долгое время крутился на 32 битной Ubuntu, а заниматься переустановкой и настройкой шлюза с нуля не было никакого желания). В одном из постов автор Rutorrent предложил заменить вызовы php функции переноса/копирования на sh. Но до дела так и не дошло. В итоге решил заняться этим сам (к слову с php до этого никогда не работал, поэтому код может быть не идеальным, но зато рабочий). Изменения надо вносить в файл util_rt.php, который находиться в директории ../rutorrent/plugins/datadir. Надо найти строки

function rtMoveFile( $src, $dst, $dbg = false )
{
 $ss = LFS::stat($src);
 if( !rename( $src, $dst ) )
 {
  if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
  if( $dbg ) rtDbg( __FUNCTION__, "to   ".$dst );
  if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
  if( !copy( $src, $dst ) )
  {
   if( $dbg ) rtDbg( __FUNCTION__, "copy fail" );
   return false;
  }
  if( !unlink( $src ) )
   if( $dbg ) rtDbg( __FUNCTION__, "delete fail (".$src.")" );
 }
 // there are problems here, if run-user is not file owner
 if($ss!==false)
  touch( $dst, $ss['mtime'], $ss['atime'] );
 return true;
}  
И привести к виду
function rtMoveFile( $src, $dst, $dbg = false )
{
$ss = LFS::stat($src);
     $src = escapeshellarg($src);
     $dst = escapeshellarg($dst);
     exec ("/bin/mv  -f $src $dst", $output, $retval);
     $err = implode ($output);
     if (!empty ($err))
     {
         if( $dbg ) rtDbg( __FUNCTION__, "from ".$src );
         if( $dbg ) rtDbg( __FUNCTION__, "to  ".$dst );
         if( $dbg ) rtDbg( __FUNCTION__, "erorr ".$err );
         if( $dbg ) rtDbg( __FUNCTION__, "move fail, try to copy" );
         exec ("/bin/cp -r -f $src $dst 2>&1", $output, $retval);
         $err = implode ($output);
         if (!empty ($err))
         {
             if( $dbg ) rtDbg( __FUNCTION__, "copy fail ".$err );
             return false;
         }
 }
 // there are problems here, if run-user is not file owner
 if($ss!==false)
  touch( $dst, $ss['mtime'], $ss['atime'] );
 return true;
}

Вот и все. Теперь плагин может переносить файлы любого размера.

воскресенье, 13 сентября 2015 г.

Автоматическое обновление файла ключа ee.bin для Wicardd

Любителям халявного 3колора наверное известен плагин wicardd, который долгое вемя позволял просматривать mpeg2 каналы 3колора. Но триколоровцы постоянно что-то меняли в потоке, в итоге переставал работать AU и файл ключей не обновлялся. Однажды надоев вручную обновлять этот файл навалял скрипт для домашнего шлюза, который это будет делать сам.
 #!/bin/sh  
 resip="root:root@192.168.1.4 root:root@192.168.1.5"  
 key=/tmp/ee36.bin  
 remotdir=/var/keys/  
 wget -q http://freecolor.host22.com/center/ee.bin -O $key  
 for i in $resip; do  
 lftp $i << EOF  
 lcd /tmp  
 cd ${remotdir}  
 put ee36.bin  
 exit  
 EOF  
 done  
 exit 0  

где
resip - IP адреса ресиверов. (можно сколь угодно IP адресов добавить)
key - Временный каталог не Linux машине, куда сохраняется ключ
remotdir - каталог с ключами на ресивере. (при необходимости исправляем на свое расположение).

Для работы нужно разве что доустановить lftp (для Debian/Ubuntu ставится командой sudo apt-get install lftp).

Теперь кидаем скрипт в крон, чтоб он выполнялся раз в сутки или час (кому как удобней) и наслаждаемся. Скрипт сам скачивает свежий файл и расскидывает его по ресиверам. Работает на ресиверах под управлением Enigma2.

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

среда, 26 августа 2015 г.

nShaper. Динамический шейпер для Linux.

Рано или поздно у многих встает вопрос грамотного распределения трафика в сети. А точнее шейпинга.  Особенно если в сети есть участники, качающие по протоколу bittorrent.  Во времена, когда интернет у меня раздавал роутер DIR-320 с Олеговской прошивкой, этот вопрос особенно остро и для меня встал, так как канал у меня был слабый. И вот однажды нашел на форуме, посвященному этой прошивке, замечательный скрипт с названием nShaper (тема тут). Это был динамический шейпер, суть которого сводилась в динамическом распределении ширины канала в зависимости от типа и источника/назначения трафика. То есть он сам распределял скорость, в зависимости какой трафик проходит. И не надо было отключать торрент клиент, если кому-то в сети захотелось посидеть в ютубе или послушать музыку. Шейпер урезал скорость торренту и оставлял гарантированную полосу для остального трафика.

Но вот роутер отправился на заслуженный покой, а на смешу пришел полноценный Linux шлюз с Ubuntu. Конечно захотелось и на нем использовать этот шайпер. Сразу он работать отказался. Тогда я уже взял в руки "напильник" и стал заниматься "адаптацией", а после и тестированием. По ходу так же немного расширил функционал, добавив создание правил с использованием nDpi и iptables, и приоритезация трафика на основе маркировки трафика (через тот же ndpi или iptables). Скрипт в 2 версиях, с nDpi и без, если кому-то  nDpi не нужен.

Скрипт состоит из 3 файлов. 2 конфиг. файла (nshaper.conf и ip_z1.lst) и самого скрипта (nshaper.sh). Первые 2 лежат в /etc/nshaper, второй в /etc/init.d/ соответственно (естественно надо дать права на запуск и закинуть в автозагрузку при желании).

Конфиг достаточно простой. Основные параметры:

WAN_IF — интерфейс интернет соединения (eth0, ppp0 и т.п)
LAN_IF — интерфейс локальной сети

Если провайдер использует так называемый Russian PPTP, то так же указываем
pptp_ip — сервер подключения pptp
PPTP_IF – название сетевого интерфейса, который смотрит в сеть провайдера (интерфейс, куда воткнут кабель провайдера)
В противном случае их нужно закомментировать.

WAN_DN_RATE — максимально возможная скорость. Не физическая! Например если есть локальные ресурсы, то та самая скорость в локальной сети (если она к примеру выше, чем скорость интернет тарифа). Если же локальных ресурсов нет, то выставляем максимальную скорость интернет соединения. (К примеру, у меня тариф 40мбит Интернет и пиринговые зоны со скоростью 100мбит. Мне надо выставить 100000. Значения в кбит)
WAN_UP_RATE — тоже самое, но для исходящего канала.


WAN_ZONES – название зон. Первая зона всегда остается inet. Вторая уже на Ваш вкус. Если  таких зон нет, то оставляем только inet
ZONE_PATH – каталог с файлами зон. (по умолчанию там же, где и сам конфиг, /etc/nshaper)

WAN_ZONES_DN_RATE, WAN_ZONES_UP_RATE – скорость интернет соединения (входящая и исходящая). Значения в кбит. Первая цифра, это скорость интернет соединения. Вторая и последующая -  для пиринговых зон. Если зон нет, то указываем только скорость тарифа. Например WAN_ZONES_UP_RATE="40000 100000" или WAN_ZONES_UP_RATE="40000" если нет локальных ресурсов.

В этом же блоке настраиваются скорости для тарифов с ночным увеличением. По комментариям в конфиге думаю все понятно.

RATES="10 10 20 40 15 5"
INET_NAMES="200 201 202 203 204 205"
Приоритеты. % от максимальной ширины канала и их названия. % в принципе редактировать нет необходимости. В данном случае для первого и второго приоритета резервируется 10% канала, для второго 20%, для третьего 40%, для четвертого 15% и для самого низкого 5%. Если в какой-то очереди трафика нет, то его ширина «отдается» остальным. Но если канал забит, то каждый получает свой минимум. То есть запусти вы хоть 100 закачек торрента, свои 40% ширины веб трафик получит. Если же торрентов нет, то веб возьмет все что свободно.
Второй параметр это название приоритетов. Видны при просмотре статуса. Можно как угодно называть. Например Prio, Web, Torrent и т. д.

Синтаксис правил в конфиге подробно описан. Если будут вопросы, отвечу в комментариях.

Теперь требования для работы скрипта.
Во первых (и самое главное) нужна поддержка IMQ. Для этого нужно патчить ядро. В принципе ничего сложного нет. Инструкция тут же в блоге. Она же включает и сборку nDpi (не обязательно).
Во вторых модуль nDpi (если он нужен конечно)
В третьих  gawk, conntrack и ipcalc (для корректной работы скрипта).

Запуск скрипта /etc/init.d/nshaper start либо start2 (если нужен полный вывод статистики, подробней читать в nshaper.conf). Просмотр статистики /etc/init.d/nshaper status.

По CPU особых требований нет. У меня на шлюзе слабый AMD E-350 без проблем «переваривает»  40мбит/с интернет трафика + еще 50-60 пирингового.

Скрипт возможно не идеален. Но работает.  Если есть замечания — буду рад исправить.

Версия с nDpi и без. Работоспособность проверял на Centos 7 и Ubuntu 12.04/14.04. Без проблем должно работать и в Debian.

UPD. Обновил. Теперь получение адресов и маски через ip, а не ifconfig.

воскресенье, 28 июня 2015 г.

Сборка Rtorrent с поддержкой IPv6

В этой публикации опишу сборку и установку моего любимого bittorrent клиента rtorrent.

Приступим
Для начала установим необходимые пакеты.
 apt-get install git git-man liberror-perl autoconf automake autotools-dev m4 checkinstall build-essential make libtool libcppunit-dev zlib1g-dev libcurl4-openssl-dev libncurses5-dev

Переходим в каталог src, скачиваем исходники, включаем поддержку Ipv6 и собираем. Начнем с  xmlrpc
 cd /usr/src  
 sudo wget http://downloads.sourceforge.net/project/xmlrpc-c/Xmlrpc-c%20Super%20Stable/1.33.17/xmlrpc-c-1.33.17.tgz 
 sudo tar -xvf xmlrpc-c-1.33.17.tgz
 sudo chmod 755 ./xmlrpc-c-1.33.17
 cd xmlrpc-c-1.33.17  
 sudo ./configure --prefix=/usr  
 sudo make   
 sudo checkinstall -D 

Теперь libtorrent и rtorrent (на этапе сборки пакета не забываем указывать версию пакета, иначе не соберется)
 cd ../  
 sudo git clone https://github.com/rakshasa/libtorrent.git
 cd libtorrent
 sudo ./autogen.sh
 sudo wget https://raw.githubusercontent.com/JohnFlowerful/libtorrent-ipv6-patches/master/libtorrent-0.13.4-tar.patch && sudo patch -p1 < ./libtorrent-0.13.4-tar.patch
 sudo ./configure --prefix=/usr --enable-ipv6
 sudo make
 sudo checkinstall -D 

 cd ../
 sudo git clone https://github.com/rakshasa/rtorrent.git
 cd rtorrent
 sudo ./autogen.sh
 sudo wget https://raw.githubusercontent.com/JohnFlowerful/rtorrent-ipv6-patches/master/rtorrent-0.9.4-tar.patch && sudo patch -p1 < ./rtorrent-0.9.4-tar.patch
 sudo ./configure --with-xmlrpc-c --prefix=/usr --enable-ipv6
 sudo make
 sudo checkinstall -D

На этом все. Проверить можно будет командой
  netstat -anutp | grep rtorrent  

В ответ должна быть строка, начинающаяся на tcp6