Blog

GHhost blog😊

2018-07-09 Networking-Blog

Networking-Blog

Итак пока я сыграв в русскую рулетку с каким то долбаебом на шоссере вывихнул себе правое плече благодаря чему появилось время продолжить написание данной писанинки продолжим😊

вязка squid + c-icap с моими любимыми шлюхами и блэкджеками (ака контент фильтрация) для себя любимого у меня стояла уже лет 10 как в качестве банерорезки и кеша, После начала позора роскомнадзора со своими блокировками я добавил в эту схему tor для обхода блокировок, и i2pd до кучи - хз зачем но пускай будет. Но я все время искал чем бы заменить сквид с его sslbump ибо для одного юзверя это даже не из пушки по воробьям а чето ближе к ядерной боеголовке. И не особо то находил, а без sslbump все это не имеет смысла, большая часть траффика идет по https, и его необходимо расковыривать для фильтрации баннеров и кеширования тоже. Плюс сквид это тот еще монстр и часто заточить его на чтото что вызывает standart violation без рашпиля (ковыряния в исходниках) бывает невозможно. Не для персонального использования он создан, он может не чхая переварить полгига траффика и тысячи юзверей - я правда проверял - может😊 но при этом иногда заставить его к примеру закешировать чтото что по стандарту кешироваца не должно весьма проблематично.

И тут, недавно, не помню уже с чего вдруг гдето выплыл выплыл у меня в поиске [[Glossary_wwwoffle?|wwwoffle]], который заточен какрас для персонального использования в противовес сквиду, и почемуто я решил на него глянуть, не помню уже почему - мошт просто делать нехер было. И полной неожиданностью оказалось что оно умеет mitm ака sslbump в сквиде типа из коропки, причем уже много лет, и кешировать https тоже умеет, ну и еще кучу всяких standart violation для которых squid нада затачивать что не всегда тривиально, а тут типа все есть. ну и сразу же я решил сие дело посмотреть и опробовать.

Вообще так как все это нужно для 1-2-3 добашних клиентов, требования ко всему этому очень просты:

  • Оно должно быть маленькое и простое, пофиг на производительность и масштабируемость. Хотя кстати тот же сквид кстати тормозил при старте на парсинге ACL'ей сгенерированных из списка РКН
  • Оно обязательно должно уметь mitm aka sslbump в сквиде для https.
  • Оно должно уметь роутить траффик по url спискам, ну тоесть к примеру http://www.gedanken.org.uk/software/wwwoffle/ - идем директом, https://rutracker.org/forum/viewforum.php?f=1958 - идем через некий parent прокси дабы обойти блокировку, и это должно работать и для https тоже, а url желательно с масками.
  • Так же оно должно бы уметь роутить и по dst ip адресам и подсетям, ну тоесть 1.1.1.0/22 идем директом, а 2.2.2.0/24 опять таки идем через некий parent proxy, хотя это опционально так как в случае socks прокси тора это решается на уровне системы связкой [[Glossary_tun2socks?|tun2socks]] + ipset + iproute.
  • Хорошо бы еслип оно умело делать преобразование socks<->http proxy, но тоже опционально - решаеца промежуточными прокси, к примеру 3proxy
  • Оно должно уметь блочить url по маскам дабы фильтровать рекламку и прочую дроч, желательно с возможностью подмены заблоченных ссылок на свои.
  • Неплохо было бы так же иметь контент-фильтрацию, хотя опять таки решается промежуточными прокси к примеру privoxy/bfilter.

Обход наших любимых роском/позо/надзо/ровских блокировок в linux и в gentoo в частности

Итак смотрим wwwoffle

Оно умеет далеко не все что нужно и списка выше. пойдем с конца:

  • контент фильтрации считай что нет = есть возможность прирезать какието конкретные hardcoded вещи в теле страниц но на этом все - никаких вам регэкспов итд.
  • преобразование socks<->http proxy нет, как и вообще нет поддержки socks ни сервера ни parent прокси, но есть ветка -par в которой есть socks parent - есть шанс портировать оттуда, но руки у меня до этого не дошли, выкрнутился через 3proxy
  • роутить parent proxy по dst ip тоже не умеет

Остальное все умеет, и кое чего сверху по мелочи. И да - оно маленькое и простое, и кривое😊

В gentoo оказалась довольно древняя версия, поэтому засунул на ее основе последнюю с сайта в свой локальный оверлей и благополучно собрал, и вроде бы все зашибись, кроме одного но - вылез какой то raice condition при генерации фейковых сертификатов, каким то образом получалось что одновременно 2 процесса генерируют пару ключ-сертификат для даного сайта, и один заканьчивает раньше другого, в итоге ключь к самому сертификату не подходит и естественно ничего не работает - бида пичаль.

Врубил логгинг на все - по его строкам нашол процедуру которая генерит сертификаты - в src/certificates.c

static gnutls_certificate_credentials_t GetCredentials(const char *hostname,int server)

посмотрел наискосок - вникать не стал - криво оно конечно реализовано ну да ладна - до того я еще успел нагуглить чтото типа форка wwwoffle-par, чувак долго и много чего там дорабатывал, влоб поставил на проверку - raice отсуствует - тупо скопипастил тело процедуры к себе, сделал патчь, пересобрал с оригинальной версией - raice исчез - алилуя - можно пробовать юзать дальше😊

а дальше, наткнулся на SVN, посмотрел что там, и решил подняца до него - хуже не будет, так родился второй патч😊 Попутно портировал фичу session cookies only из ветки -par, так родился третий патч, ну а четвертый мелкий фикс ворнинга - до кучи😊 Нну и пошло-поехало😊

Собсно сами патчи:

  • Patch_000-wwwoffle-2.9j-to-trunk.diff.bz2 - update до trunk версии из svn. правильнее было бы сделать отдельный ebuild но мне влом😊
  • Patch_100-certs-trunk-v3.patch - фикс рейса в генерации сертификатов.
  • Patch_110-SessionCookiesOnly.diff - опция позволяющая парсить set-cookie удаляя из них expire что делает их сессионными.
  • Patch_zzz100_reduce_RSA_BITS.patch - уменьшаем длинну RSA ключа - у меня на локалхосте нет хакеров которые будут снифать мой траффик и пытаца сломать ssl😊 зато генерит/шифрует/дешфрует быстрее и меньше нагружает entropy pool.
  • Patch_zzz100-fix_implicit_declaration_of_isspace_in_parce.c.diff - почемуто именно этот ворнинг меня задрал при сборке когда я чтото там патчил и я его поправил😊
  • Patch_zzz900_crash_fix_test_3.patch - Фикс сегфолтов, описано там ниже в конце секции о wwwoffle.
  • wwwoffle-ebuild.bz2 - ebuild если кому нужен, мой локальный оверлей из сети не доступен покашто.

На генте все эти патчи можно сложить в

/etc/portage/patches/net-proxy/wwwoffle

и они применяца автоматом при сборке, ЕСЛИ! в ебилде вызов epatch_user в src_prepare(), а есть он блять не везде.. поэтому гдето это работает а гдето нет. Но есть способ сделать чтоп работало всегда и везде.

Вобщем наигравшись с исходниками и добившись какой-никакой но приемлемой работы я принялся играца с конфигурацией😊 Итак:

Настройка wwwoffle

Собственно конфигурация wwwoffle находица в

/etc/wwwoffle/wwwoffle.conf

Я уже точно не помню что по дефолту а что я менял так что опишу что посчитаю нужным посекционно так как конциоурация у wwwoffle секционная, есть же документация в конце концов😊 итак:

StartUp
{
 bind-ipv4         = 127.0.0.1
 bind-ipv6         = none

 http-port         = 3128
 https-port        = 3129
 wwwoffle-port     = 8081

 spool-dir         = /var/spool/wwwoffle

 run-uid           = wwwoffle
 run-gid           = wwwoffle

 use-syslog        = yes

 password          = none

 max-servers       = 16
 max-fetch-servers = 1
}

Тут ничего особенного - слушаем все порты на локалхосте так как оно лиш для меня любимого, для меня любимого не на локалхосте там сбоку приставлен socks5 через который я и работаю когда не на локалхосте😊

Собственно сам http прокси живет на 3128 порту, там же и https через метод коннект, тоесть в бравзере прописывается localhost:3128 и фтыкаеца галка юзать его для всех протоколов и на этом все.

  • https-port мне не понадобился, хз для чего он ваще.
  • wwwoffle-port который 8081 используется для упрвления, через него можно отдватать команды, ну там конфигурацию перечитать, кеш почистить итд.
  • max-servers=16 - ахули!!! у меня 4 процессорный 64головый аптерон блять!!! пусть работает😊 На самом деле wwwoffle мультипоточная, на каждое соединение порождает отдельный поток, и не умеет pipeline, так что сколько запросов от вашего бравзера прилетит столько потоков и нужно чтоп их обработать без блокировки, а 64/4=16 что является одной numa нодой, в пределах нее и будем работать посредством numa aware memory placement shceduler'а в ядре😊
  • max-fetch-servers задает количество потоков которые будут выгребать страницы запрошенные в offline mode как тока наступит online mode, но блять, щас 2018 год, какие еще вжопу оффлайны, но тем не менее у нее есть такой функционал, а так же wwwoffle можно просто сказать - выкачай мне вот эти страницы, в том числе можно даже рекурсивно, количество потоков которые выкачивать будут опять таки равно этому параметру, но так как все это мне нах не нада ставим 1.
Options
{
 log-level             = info
 
 socket-timeout        = 120
 dns-timeout           = 60
 connect-timeout       = 30

 connect-retry         = no

 dir-perm              = 0755
 file-perm             = 0644

 lock-files            = yes

 reply-compressed-data = no
 reply-chunked-data    = yes

#exec-cgi = /local/cgi-bin/*
#exec-cgi = /local/*.cgi
}
  • log-level = info дабы лучше видеть что происходит, что закешировалось что нет ну итд.
  • reply-compressed-data поставил в no - заким хреном чтото жать при передаче через локалхост?
  • lock-files = yes - иначе есть засада если 2 разных потока получат запрос одной и той же страницы и начнуть допустим оба писать ее в спул кеша, поэтому используем локи.
OnlineOptions
{
 <*://*/*.js?*> request-changed = 10m
 <*://*/*.css?*> request-changed = 10m
 <*://*/*.json> request-changed = 10m
 
 <*://*/*.css> request-changed = 6w
 <*://*/*.css> pragma-no-cache = no
 <*://*/*.css> cache-control-no-cache = no
 <*://*/*.css> cache-control-max-age-0 = no
 <*://*/*.css> request-no-cache = no

  <*://*/*.js> request-changed = 6w
  <*://*/*.js> pragma-no-cache = no
  <*://*/*.js> cache-control-no-cache = no
  <*://*/*.js> cache-control-max-age-0 = no
  <*://*/*.js> request-no-cache = no
 
 <*://*/*.png> request-changed = 6w
 <*://*/*.png> pragma-no-cache = no
 <*://*/*.png> cache-control-no-cache = no
 <*://*/*.png> cache-control-max-age-0 = no
 <*://*/*.png> request-no-cache = no
 
 <*://*/*.jpg> request-changed = 6w
 <*://*/*.jpg> pragma-no-cache = no
 <*://*/*.jpg> cache-control-no-cache = no
 <*://*/*.jpg> cache-control-max-age-0 = no
 <*://*/*.jpg> request-no-cache = no


 <*://*/*.jpeg> request-changed = 6w
 <*://*/*.jpeg> pragma-no-cache = no
 <*://*/*.jpeg> cache-control-no-cache = no
 <*://*/*.jpeg> cache-control-max-age-0 = no
 <*://*/*.jpeg> request-no-cache = no

 <*://*/*.gif> request-changed = 6w
 <*://*/*.gif> pragma-no-cache = no
 <*://*/*.gif> cache-control-no-cache = no
 <*://*/*.gif> cache-control-max-age-0 = no
 <*://*/*.gif> request-no-cache = no

 <*://*/*.ico> request-changed = 6w
 <*://*/*.ico> pragma-no-cache = no
 <*://*/*.ico> cache-control-no-cache = no
 <*://*/*.ico> cache-control-max-age-0 = no
 <*://*/*.ico> request-no-cache = no

 <*://*/*.swf> request-changed = 6w
 <*://*/*.swf> pragma-no-cache = no
 <*://*/*.swf> cache-control-no-cache = no
 <*://*/*.swf> cache-control-max-age-0 = no
 <*://*/*.swf> request-no-cache = no

 <*://*/*.pdf> request-changed = 6w

 pragma-no-cache         = yes
 cache-control-no-cache  = yes
 cache-control-max-age-0 = yes

 request-changed       = 10m

 request-changed-once  = yes

 request-expired       = yes

 request-no-cache      = no

 request-redirection   = no

 request-conditional   = yes

 validate-with-etag    = no

 try-without-password  = yes

 intr-download-keep    = no
 intr-download-size    = 1
 intr-download-percent = 80

 timeout-download-keep = no

 keep-cache-if-not-found = yes

 request-compressed-data = yes
 request-chunked-data    = yes
}
  • Тут все url специфичные настройки типа <*:*/*.css> request-changed = 6w мои. Значат они что всякие картинки/иконки/пдфки/CSS/JS и прочий шит мы кешируем до усрачки на 6 недель, даже если нам будут говорить что так низзя, нинада, ну пажалуста... А перегрузить их можно только через CTRL-F5 ито если север на запрос if-modified-since скажет что они изменились.
  • Всякие css/js с параметрами, тоесть somesheet.js?track-user-id=xxx кешируем на 10 минут, если не говорят что низзя, но обычно говорят😊 оставил на всякий случай, пока же в другом месте запретил вообще кешировать динамику.
  • validate-with-etag = no - заебали все этим етагом, пихают куда ни попадя из за чего нихера не кешируеца - соотвественно тут мы на него забиваем полностью.
  • request-compressed-data/request-chunked-data = yes - запраивать компрессию у сервера - актуально при транзите через TOR.
OfflineOptions
{
 pragma-no-cache         = yes
 cache-control-no-cache  = yes
 cache-control-max-age-0 = yes
 
 confirm-requests = no
 
# Dont request any URLs at all when offline.
 <*://*/*> dont-request = yes
}

Тут только расскоментировал <*:*/*> dont-request = yes - зачем чтото запрашивать в оффлайне?

SSLOptions
{
    enable-caching = yes
    quick-key-gen = yes
    disallow-cache = *.googlevideo.com:443
    allow-tunnel = *.googlevideo.com:443
    allow-cache = *:443
}

Вотанон - святой грааль - https mitm ака sslbump в сквиде😊

  • enable-caching = yes - собсно включает расковыривание https, тоесть wwwoffle на стороне сервера выступает как обычный клиент - самостоятельно поднимает ssl/tls, шифртует/дешифрует, а со стороны клиента выглядит как сервер - тоесть генерирует фейковый сертификат для нужного домена и подсовывает его клиенту, чтоп это работало клиенту нада установить корневой сертификат сгенерированный wwwoffle при первом запуске, иначе мата не оберешся от бравзера по поводу самоподписанного сертификата и отсутствия цепочек для проверки, делается это просто через web интерфейс wwwoffle - тыркаем http://localhost:3128/certificates/root и там [Download Certificate]. Так же в бравзере нужно вырубить вот эти костыли - [[Glossary_HSTS?|HSTS - Strict transport Security]], [[Glossary_HPKP?|HPKP - Certifikate Key Pinning]] и [[Glossary_OCSP-Stapling?|OCSP Stapling]] иначе будет орать на некоторые сайты что сертификат нихуя не тот какой должен бы быть, еще может понадобица повключать weak chyphers, если применили Patch_zzz100_reduce_RSA_BITS.patch чем мы уменьшили длинну герерируемых фейковых сертификатов. Как это фсе сделать в ващем бравзере разбирайтесь сами, у меня на данный момент palemoon и там все это делается штатно в настройках безовсяких about:config + с помощью аддона pale moon commander можно тыркать криптоалгоритмы и много чего еще.
  • quick-key-gen = yes чтото там насчет источника энтропии в gnutls - насколько помню юзать какой то другой но менее надежный - но нам лучше быстро чем надежно ибо хакеров на локалхосте нет😊
  • allow-cache = *:443 - какрас включает расковыривание и кеширование https, маска хоста и порт.
  • disallow-cache = *.googlevideo.com:443 и allow-tunnel = *.googlevideo.com:443 - не расковыривать https - в данном случае это видео сервера ютуба зачем тратить ресурсы на дешифровку а потом шифровку видеопотоков когда можно просто туннелировать как обычные прокси. порядок директив имеет значение - срабатывает первая подходящая, поэтому они должны идти до allow-cache = *:443 в этой секции.
FetchOptions
{
 stylesheets = yes
 images      = yes
 frames      = yes
 iframes     = yes
 scripts     = no
 objects     = no
 webbug-images = no
 icon-images   = no
 only-same-host-images = no
}

Тут не помню - помоему ниче не трогал, но эта секция какрас отвечает за скачивание запроенных страниц в оффлайне или вручную.

IndexOptions
{
 create-history-indexes = yes

 cycle-indexes-daily    = yes

#### Example ####
# Do index files from /good/ in the barfoo.com domain.
# <*://*.barfoo.com/good/*> list-any = yes
# Don't index any hosts in the barfoo.com domain.
# <*://*.barfoo.com> list-any = no
# Don't index any gif or jpg files in the lasttime index.
# <*://*/*.gif> list-latest = no
# <*://*/*.jpg> list-latest = no
}

Так и не понял что это и зачем вообще, ниче не трогал😊

ModifyHTML
{
 enable-modify-html        = yes

 #site specific fixes
    <*://srv.lan> disable-meta-set-cookie = no

    <*://*.lostfilm.tv/*> disable-meta-refresh = no
    <*://*.lostfilm.tv/*> disable-meta-set-cookie = no

    <*://*.google.*/recaptcha/*> disable-meta-set-cookie = no
    <*://*.gstatic.com/recaptcha/*> disable-meta-set-cookie = no

    <*://*.phoronix.com> disable-meta-set-cookie = no
    <*://forum.mtbtula.ru> disable-meta-set-cookie = no
    <*://forum.nag.ru> disable-meta-set-cookie = no
    <*://*.chipdip.ru> disable-meta-set-cookie = no
    <*://*.ripe.net> disable-meta-set-cookie = no
 #end site specific fixes

 add-cache-info            = no

#anchor-cached-begin       = <font color="#00B000">
#anchor-cached-end         = </font>
#anchor-requested-begin    = <font color="#B0B000">
#anchor-requested-end      = </font>
#anchor-not-cached-begin   = <font color="#B00000">
#anchor-not-cached-end     = </font>

 disable-script            = no
 disable-applet            = no

 disable-style             = no

 disable-blink             = no
 disable-marquee           = no

 disable-flash             = no

 disable-meta-refresh      = yes
 disable-meta-refresh-self = yes
 disable-meta-set-cookie   = yes

 disable-dontget-links     = yes
 replace-dontget-images    = yes
 replacement-dontget-image = /local/dontget/replacement.gif
 replace-webbug-images     = yes
 replacement-webbug-image  = /local/dontget/replacement.gif

 disable-dontget-iframes   = yes

 demoronise-ms-chars       = no
 fix-mixed-cyrillic        = no

 disable-animated-gif      = no
}

Эта секция позволяет делать некоторые манипуляции непосредственно с контентом страницы.

  • enable-modify-html = yes - включить/выключить секцию целиком.
  • site specific fixes разрешаем куки для определенных сайтов, для всех остальных толи совсем зарезаны толи только сессионные, не помню уже, дальше по ходу дела выясним😊
  • disable-meta-refresh = yes - вырезает мета тэги с рефрешем и редиректом на другую страницу, нах так делать то?
  • disable-meta-refresh-self = yes - вырезает мета теги с просто рефрешем страницы, в том числе периодическим - нах оно мне встряло, я сам обновлю когда мне понадобица, ато с моими 100500 вкладками всякой дрочи получается постоянно чтото дергаеца и обновляеца.
  • disable-meta-set-cookie = yes - не дает устанавливать куки через мета тэг.
  • disable-dontget-links = yes - убирает все ссылки попадающие в список в секции DontGet, секция DontGet предназначена какрас для фильтрации запросов по url.
  • replace-dontget-images = yes и replacement-dontget-image = /local/dontget/replacement.gif - если вырезаемая ссылка на картинку то вместо этого подставит картинку из /local/dontget/replacement.gif в спул директории.
  • replace-webbug-images = yes и replacement-webbug-image = /local/dontget/replacement.gif - детектирует какието бажные картинки и вырезает их, с заменой на локальную /local/dontget/replacement.gif, локальная - прозрачная гифка размером 1 пиксель.
  • disable-dontget-iframes = yes - вырезает iframe если он попадает под список в секции DontGet.
LocalHost
{
 localhost
}

Собсно хост на котором крутица wwwoffle😊

LocalNet
{
srv.lan
megaprovider.ru
icf.org.ru
icf.bofh.ru
*.icf.org.ru
*.icf.bofh.ru
}

Локальные сервера, можно с масками как видим. Они не кешируются вообще и считаются всегда доступными, тоесть даже в оффлайн режиме.

AllowedConnectHosts
{
}

Суда можно вписать имена хостов или ip в [] скобках с которых будет доступ к wwwoffle если он нужен не только на локалхосте, мне такого не нужно так что пусто.

AllowedConnectUsers
{
}

Суда можно вписать юзеров с паролями имеющих доступ к wwwoffle, так как я один мне это тоже нах не нада и потому пусто.

DontCache
[
dontcache.list
]

А суда можно вписать урлы которые ненада кешировать, или заинклудить файл с ними сменив скобки с {} на [], в таком случае wwwoffle ищет этот файл в той же директории где и конфигурационный, никакие другие пути не поддерживаются.

Содержимое dontcache.list:

# Don't cache any dynamic pages
*://*/*/*?*

# Don't cache any archive files.
*://*/*.gz
*://*/*.tar
*://*/*.bz
*://*/*.bz2
*://*/*.Z
*://*/*.zip
*://*/*.rar
*://*/*.tgz
*://*/*.xz
*://*/*.rpm
*://*/*.deb

# Don't cache any video files.                                                                      
*://*/*.webm                                                                                        
*://*/*.mp4                                                                                         
*://*/*.avi                                                                                         
*://*/*.ts                                                                                          
*://*/*.m3u8                                                                                        
*://*/*/video/*                                                                                     
*://*/*/videoplayback
*://*.googlevideo.com/*

# Don't cache any audio files.
*://*/*.mp3
*://*/*.ogg
*://*/*.m4s

#other misc files
*://*/*.torrent

# other misc sites
*://*.adblockplus.org
*://easylist.to
*://raw.githubusercontent.com/zpacman/Blockzilla/master/*
*://addons.palemoon.org

Собсно тут мы запрещаем кешировать динамику, ато до этого у меня набролось куча закешированных урлов вида http://www.google.ru/url?q=http://wiki.icf.org.ru/2018-07-09_Networking-Blog&sa=U&ved=0ahUKEwiG5ffFnbHcAhVGliwKHZTbCIgQFggnMAM&usg=AOvVaw3UIUcZ1F3FUgGUcx2qYU23 благодаря ебучему гуголу которому сцуко нада следить за мною и куда я жму тоже, и по этому он отдает ссылки с поиска тока редиректом, ну и не тока ебучий гугол ебучий гугол, есть еще много других ебучих сайтов делающих примерно так же, в итоге у меня за неделю с небольшим с полгига такого дерьма закешировалось - пришлось запретить😊 Так же запрещаем кешировать всякие архивы, видео, музыку и прочую такую дрочь. Ну и несколько сайтов с которых нада получать свежак всегда, addblock листы в частности и аддоны бравзера.

DontGet
[
adblock-list-justdomains.txt
adguarddns-justdomains.txt
advblock-justdomains.txt
adwarefilters-justdomains.txt
antiadblockfilters-justdomains.txt
bitblockext-justdomains.txt
Blockzilla-justdomains.txt
cjx-annoyance-justdomains.txt
cntblock-justdomains.txt
easylistchina-justdomains.txt
easyprivacy-justdomains.txt
fanboy-annoyance-justdomains.txt
malwaredomains_full-justdomains.txt
nocoin-justdomains.txt
ruadlist+easylist-justdomains.txt

dontget.list
]

А вот и секция DontGet со списками что не нужно запрашивать совсем, иначе говоря зарезать. Списки подгружаюца так же из отдельных файликов. Единственный редактируемый вручную файл тут это dontget.list, остальные генеряца автоматически по различным блэклистам.

собсно содержимое dontget.list:

#favicons
    *://*/favicon.ico
    <*://*/favicon.ico> replacement = /local/dontget/favicon.ico
    *://*/favicon.png
    <*://*/favicon.png> replacement = /local/dontget/replacement.png
    *://*/*favicon*.png
    <*://*/*favicon*.png> replacement = /local/dontget/replacement.png

#annoing sheet
    *://*/*/twitter.png
    *://node.chathelp.ru/*
    *://*.apphb.com/signalr/*
    *://*.hypercomments.com/*

    *://*.google-analytics.com/*
    *://accounts.google.com/*
    *://*.google.*/complete/search*
    *://*.google.*/logos/doodles/*
    <*://*.google.*/logos/doodles/*> replacement = /local/dontget/replacement.gif
    *://*.googletagservices.com/*
    *://*.googletagmanager.com/*
    *://*.google.com/ads/measurement*
    *://*.google.*/*/generate_204
    *://*google.*/*/client_204?*
    *://*.google.*/coop/cse/*

    #http://yandex.st/share/share.js

    *://api.github.com/_private/browser/*
    *://api.rnet.plus/*
    *://softdatasystemru.webim.ru/*
    *://*.digitaltarget.ru/*
    *://*.scorecardresearch.com/*
    *://service.maxymiser.net/*
    *://*.facebook.com/plugins/*
    *://*.smartadcheck.de

    *://*.reddit.com/*?!POST:*
    *://*.redditmedia.com/gtm*
    *://*.redditstatic.com/desktop2x/*.js

    *://*.mamydirect.com
    *://ssp.rambler.ru/acp/*
    *://zdstatic.speedtest.net/*/zdconsent.js
    *://*.cdnst.net/javascript/prebid.*.min.js

    *://*/ajax/setcookie.php?*
    *://*/*/cookie_policy.css
    *://*/*/cookieconsent.min.css

    *://*/*/*.gif?*
    *://*/*/*.svg?*
    *://*/*/*.png?*

#annoing js
    *://*/*/raven.min.js*
    *://*/*/raven.js*

    *://*/*/adriver.js*
    *://*/*/adriver.core.2.js*

    *://*/*/ads.js*
    *://*/*/gtm.js*

    *://*/*/twemoji.min.js*

#AD
    *://ad.3dnews.ru/*
    *://ad.mail.ru/*
    *://ad.trialsport.ru/*
    *://ad.velomania.ru/*
    *://ads.adfox.ru/*
    *://ads.exoclick.com/*
    *://ads.servebom.com/*
    *://*.ads.claw.ru/*
    *://adservice.google.*/*
    *://pagead2.googlesyndication.com/*
    *://adx.com.ru/*
    *://*.doubleclick.net/*

    *://cdn.sstatic.net/clc/clc.ie.min.js
    *://cdn.sstatic.net/Js/stub.en.js

    *://*.opennet.ru/cgi-bin/opennet/hints.cgi*
    *://www.opennet.ru/img/*
    *://www.opennet.ru/img/ihor_but.png

    *://*.linux.org.ru/adv/*
    *://*.linux.org.ru/linuxpiter/*

    *://dr.habracdn.net/*/advertise.js*
    *://dr.habracdn.net/*/highlight.pack.js*
    *://special.habrahabr.ru/api/toplink/*

    *://cdnjs.cloudflare.com/*/MathJax.js*

    *://cdn.onthe.io/io.js*
    *://static.criteo.net/js/*

    *://*.amazon-adsystem.com/*

    *://*.trafficfactory.biz/*
    *://*.advertur.ru/*
    *://*.acint.net/*
    *://seal.alphassl.com/*
    *://*.betsonsport.ru/banners/*
    *://robinbob.in
    *://static.t-ru.org/templates/*/*lib.min.js
    *://*.actionteaser.ru/*
    *://*.directadvert.ru/*

#COUNTERS
    *://*counter*/*
    *://x.cnt.my/*
    *://cnt.vvv.ru/*
    *://server.comagic.ru/comagic/*
    *://tracker.comagic.ru/*
    *://collector.githubapp.com/*
    *://my-hit.org/scripts/js/metrika/metrika.js*
    *://rules.quantcount.com/*.js*
    *://*/*counter*?*

    <*://*/*/*.js> replacement = /local/dontget/replacement.js
    <*://*/*/*.png> replacement = /local/dontget/replacement.png
    <*://*/*/*.gif> replacement = /local/dontget/replacement.gif
    <*://*/*/*.jpg> replacement = /local/dontget/replacement.gif
    <*://*/*/*.svg> replacement = /local/dontget/replacement.gif

location-error = no

Это собственно то что я вручную прирезал ибо нехуй😊 Ну вот не понимаю и не принимаю я изьебов с favicon, с generate_204, с автоподсказками в поиске итд.

Остальное генерица вот этой вот штукой - https://github.com/justdomains/ci немного модифицированной, у нее на выхлопе просто списки доменов, нам же нужны маски понимаемые wwwoffle, ну Patch_justdomains.patch патч тривиальный😊

Патченный convertlists.py и lists.json находяца в /etc/wwwoffle/scripts, запускаеца это дело по крону вот так:

BLOCK_LOGFILE="/tmp/adblock.log"
@daily cd /etc/wwwoffle/scripts && /etc/wwwoffle/scripts/convertlists.py -v /etc/wwwoffle/scripts/lists.json /etc/wwwoffle &>>${BLOCK_LOGFILE} && /usr/bin/wwwoffle -config &>>${BLOCK_LOGFILE}

Содержимое lists.json:

[
	{
		"name": "RUADlist+EasyList",
		"url": "https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyList is the primary filter list that removes most adverts from international webpages, including unwanted frames, images and objects. It is the most popular list used by many ad blockers and forms the basis of over a dozen combination and supplementary filter lists.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "EasyPrivacy",
		"url": "https://easylist.to/easylist/easyprivacy.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
        {
		"name": "AntiADblock",
		"url": "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
        {
		"name": "ADVblock",
		"url": "https://easylist-downloads.adblockplus.org/advblock.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
        {
		"name": "CNTblock",
		"url": "https://easylist-downloads.adblockplus.org/cntblock.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
        {
		"name": "BITblockext",
		"url": "https://easylist-downloads.adblockplus.org/bitblockext.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "FanBoy-Annoyance",
		"url": "https://easylist.to/easylist/fanboy-annoyance.txt",
		"format": "adbp",
		"moreinformation": "https://easylist.to/",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "easylist-china",
		"url": "https://easylist-downloads.adblockplus.org/easylistchina.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "EasyPrivacy is an optional supplementary filter list that completely removes all forms of tracking from the internet, including web bugs, tracking scripts and information collectors, thereby protecting your personal data.",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "cjx-annoyance",
		"url": "https://raw.githubusercontent.com/cjx82630/cjxlist/master/cjx-annoyance.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "Specialization: removes self-promotion and privacy protection, ÄÏÐÏÌÎÅÎÉÅ Ë EasyList China",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "Blockzilla",
		"url": "https://raw.githubusercontent.com/zpacman/Blockzilla/master/Blockzilla.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "Specialization: ads and tracking protection, English",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "adware-filters",
		"url": "https://easylist-downloads.adblockplus.org/adwarefilters.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "Specialization: blocks ads injected by adware",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "Malware_Domains",
		"url": "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "Specialization: malware protection",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
		{
		"name": "spam404",
		"url": "https://raw.githubusercontent.com/Dawsey21/Lists/master/adblock-list.txt",
		"format": "adbp",
		"moreinformation": "https://adblockplus.org/ru/subscriptions",
		"description": "Specialization: blocks scam sites",
		"license-identifier": "GPL3 / CC BY-SA 3.0"
	},
	{
		"name": "AdGuard Simplified Domain Names Filter",
		"url": "https://filters.adtidy.org/extension/chromium/filters/15.txt",
		"format": "adbp",
		"outputfile": "adguarddns.txt",
		"moreinformation": "https://kb.adguard.com/en/general/adguard-ad-filters",		
                "description": "A filter composed from several other filters (English filter, Social media filter, Spyware filter, Mobile ads filter, EasyList and EasyPrivacy) and simplified specifically to be better compatible with DNS-level ad blocking. This filter is used by AdGuard DNS servers to block ads.",
		"license-identifier": "GPL3"
	},
	{
		"name": "NoCoin Filter List",
		"url": "https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt",
		"format": "hosts",
		"outputfile": "nocoin.txt",
		"moreinformation": "https://github.com/hoshsadiq/adblock-nocoin-list/",
		"description": "Blocking Web Browser Bitcoin Mining",
		"license-identifier": "MIT",
		"license": "https://github.com/hoshsadiq/adblock-nocoin-list/blob/master/LICENSE"
	}
]

тоесть по сути подписки управляюца через ists.json, ну и в DontGet не забыть вписать результирующие файлики.

DontCompress
{
 mime-type = image/gif
 mime-type = image/jpeg
 mime-type = image/png
 mime-type = image/tiff

 mime-type = video/x-msvideo
 mime-type = video/quicktime
 mime-type = video/mpeg

 mime-type = audio/basic
 mime-type = audio/x-wav

 mime-type = application/x-dvi
 mime-type = application/pdf
 mime-type = application/zip

 mime-type = application/x-ns-proxy-autoconfig

 file-ext = .gz
 file-ext = .bz
 file-ext = .bz2
 file-ext = .Z

 file-ext = .zip
 file-ext = .tgz

 file-ext = .rpm
 file-ext = .deb

 file-ext = .gif
 file-ext = .GIF
 file-ext = .jpg
 file-ext = .JPG
 file-ext = .jpeg
 file-ext = .JPEG
 file-ext = .png
 file-ext = .PNG
}

Что ненада сжимать по майм типам или по расширению файла - картинки, архивы, и все такое, помоему вообще тут ничего не правил.

CensorHeader
[
censorheader.list
]

Список заголовков которые нада вырезать, или подменить, и еще несколько фич - читайте мануал кароче😊 тут опять инклудица файл censorheader.list.

Содержимое censorheader.list:

referer-self       = yes
referer-self-dir   = no
referer-from       = no

force-user-agent   = no

pass-url-unchanged = no

User-Agent = Mozilla/5.0 (X11; Linux x86_64; rv:3.4) Gecko/20100101 Goanna/20180717 PaleMoon/27.9.4

# allow cookies for specific sites
    <*://srv.lan> Set-Cookie = no
    <*://srv.lan> Cookie = no
    <*://srv.lan> session-cookies-only = no

    <*://*.lostfilm.tv> Set-Cookie = no
    <*://*.lostfilm.tv> Cookie = no
    <*://*.lostfilm.tv> session-cookies-only = no

    <*://forum.mtbtula.ru> Set-Cookie = no
    <*://forum.mtbtula.ru> Cookie = no
    <*://forum.mtbtula.ru> session-cookies-only = no

    <*://forum.nag.ru> Set-Cookie = no
    <*://forum.nag.ru> Cookie = no
    <*://forum.nag.ru> session-cookies-only = no

    <*://*.chipdip.ru> Set-Cookie = no
    <*://*.chipdip.ru> Cookie = no
    <*://*.chipdip.ru> session-cookies-only = no

    <*://*.google.*/recaptcha/*> Set-Cookie = no
    <*://*.google.*/recaptcha/*> Cookie = no
    <*://*.google.*/recaptcha/*> session-cookies-only = yes

    <*://*.gstatic.com/recaptcha/*> Set-Cookie = no
    <*://*.gstatic.com/recaptcha/*> Cookie = no
    <*://*.gstatic.com/recaptcha/*> session-cookies-only = yes

    <*://*.phoronix.com> Set-Cookie = no
    <*://*.phoronix.com> Cookie = no
    <*://*.phoronix.com> session-cookies-only = yes


    <*://*.ripe.net> Set-Cookie = no
    <*://*.ripe.net> Cookie = no
    <*://*.ripe.net> session-cookies-only = yes

    <*://*.cvedetails.com> Set-Cookie = no
    <*://*.cvedetails.com> Cookie = no
    <*://*.cvedetails.com> session-cookies-only = yes

# block all cookies
#    Set-Cookie = yes
#    Cookie = yes

#allow session cookies only
    session-cookies-only = yes

# block other annoing headers
# dont block Access-Control-Allow-Origin - used some video hostings

    Via = yes

#    Strict-Transport-Security = yes
#    X-Frontend = yes
#    X-Powered-By = yes
#    X-Frame-Options = yes

    #github
#    X-Fastly-Request-ID = yes
#    X-Timer = yes
#    X-Cache-Hits = yes
#    X-Cache = yes
#    X-Served-By = yes
#    X-GitHub-Request-Id = yes
#    X-Geo-Block-List = yes
#    X-XSS-Protection = yes
#    X-Content-Type-Options = yes
#    Content-Security-Policy = yes
#    Access-Control-Expose-Headers = yes

тут мы разрешаем куки на нужные мне сайты.

  • User-Agent = Mozilla/5.0 (X11; Linux x86_64; rv:3.4) Gecko/20100101 Goanna/20180717 PaleMoon/27.9.4 - жестко прописываем user-agent.
  • referer-self = yes выставляет referer в запрашиваемый url.
  • session-cookies-only = yes разрешаем только сессионные куки всем кроме нужных мне сайтов, такие куки удаляюца после закрытия вкладки или браузера.
  • пытаемся фильтровать какието левые хедеры с гихаба итд но чето не взлетело - гитхаб сломался, а четаки руки не дошли разобраца потому закоментировал просто.
Proxy
[
proxy_header
blocked_domains_rkn.list
blocked_urls_rkn.list
proxy_footer
]

А вот и секция парент прокси, именно тут разруливается что через какой вышестоящий прокси запрашивать, а что на прямую - сердце так сказать механизьма обхода блокировок позорного РКН. прокси указываются раздельно для http и https что не совсем удобно.

  • proxy_header и proxy_footer для ручного вмешательства так сказать, но первый должен быть всегда первым в секции, второй последним, иначе логика работы сломаеца.
  • blocked_domains_rkn.list - генерируется автоматом из списка РКН и представляет из себя список заблокированных доменов.
  • blocked_urls_rkn.list - генерируется автоматом из списка РКН и представляет из себя список заблокированных url.

proxy_header:

# TOR internal resources
#<http://*.onion> proxy = localhost:8888
#<https://*.onion> ssl = localhost:8888

# I2P internal resources
<http://*.i2p> proxy = localhost:4444
<https://*.i2p> proxy = localhost:4444

Тут мы указываем parent прокси для внутренних ресурсов TOR и I2P сетей. TOR предоставляет только socks прокси в отличии от I2p, поэтому между ним и wwwoffle стоит промежуточный 3proxy, который умеет преобразовывать socks<=>http/s.

proxy_footer:

<*://*/*> proxy = none
<*://*/*> ssl = none

Здесь мы запрещаем все прокси для всех, тоесть если адрес не в I2P/TOR сети и не в списках РКН то идем директом, именно поэтому этот файл должен быть последним в секции.

Генерируется это все вот таким нехитрым скриптом лежащим в /etc/wwwoffle/scripts под названием rkn.sh:

#!/bin/bash

PROXY="localhost:8888"
OUT_ENCODING="koi8-r"
LOGFILE="/tmp/rkn.log"
ERDI_XML="/usr/bin/xmlstarlet"
EIPSET="/usr/sbin/ipset"
TMPFILE=`mktemp`
#TMPFILE="/tmp/dump.xml"

wget --retry-connrefused -O $TMPFILE http://api.antizapret.info/all.php?type=xml

create_ipset()
{
"${EIPSET}" flush $2 2>/dev/null || "${EIPSET}" create $2 $1 maxelem 262144
for f in "$3" "$4"
do
 [ -f "$f" ] && {
  echo Adding to ipset $2 \($1\) : $f
   sort -u "$f" | sed -nre "s/^.+$/add $2 &/p" | "${EIPSET}" -! restore
 }
done
return 0
}


ACL=/etc/wwwoffle/blocked_domains_rkn.list
echo "Список доменов нормализованный ($ACL)"
mv $ACL $ACL.bak
"${ERDI_XML}" select -E "$OUT_ENCODING" -T -t -v "/reg:register/content/domain" -n "$TMPFILE" \
|sort \
| uniq \
|idn --quiet --no-tld -- \
|awk -v PROXY=$PROXY '/[0-9]|[a-z]/ {print "<http://" $0 "> proxy = "PROXY;print "<https://" $0 "> ssl = "PROXY;}' \
> $ACL
wc -l <$ACL

ACL=/etc/wwwoffle/blocked_urls_rkn.list
echo "Список url адресов ($ACL)"
mv $ACL $ACL.bak
"${ERDI_XML}" select -E "$OUT_ENCODING" -T -t -v "/reg:register/content/url" -n "$TMPFILE" \
|tr -s "\," "\n" \
|grep -e "^http" \
|sort \
|uniq \
|grep -v "<" \
|grep -v ">" \
|awk -v PROXY=$PROXY '$0 ~ /^https:/ {print "<" $0 "> ssl = "PROXY}; $0 ~ /^http:/ {print "<" $0 "> proxy = "PROXY}' \
> $ACL
wc -l <$ACL

ACL=`mktemp`
echo "Список IP адресов ($ACL)"
"${ERDI_XML}" select -E "$OUT_ENCODING" -T -t -v "/reg:register/content/ip" -n "$TMPFILE" \
|tr "\," "\n" \
|sort -V -u \
> $ACL
wc -l <$ACL

create_ipset hash:net blocked_ip_rkn $ACL

rm $ACL
rm $TMPFILE

Слить чтоп не копипастить дохрена:)

Для работы нужен xmlstarlet и ipset, ну wget,awk,grep,sort и остальное как правило есть везде. Список блокировок выкачивается с https://antizapret.info/ через ихний api, но впрочем их куча еще и на гитхабе и где их ща тока нет😊 ipset нужен не для самой wwwofle а для PBR, который нужен потому что по ip и подсетям wwwoffle выбирать выщестоящие прокси не умеет а РКН не вкурсе такой хуйни, и блочит и по ip и подсетями тоже, причем нехилыми такими типа /15, а потом фсе плачут и пиздец, но хуйвам - прорвемся😊 и поэтому чтоп как то обратабывать эти блоки подсетей и ипишников используется ipset + PBR.

Переменную PROXY нада выставить в адрс и порт того самого промежуточного 3proxy.

запускаеца по крону вот так:

RKN_LOGFILE="/tmp/rkn.log"
@reboot /usr/bin/sleep 30 && /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
@daily /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
0 10 * * * /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
0 18 * * * /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}

@reboot - запуск после перезагрузки, нужен чтоп заполнить ipset, который в ядре и перезагрузку соттветственно не перживает и оказывается пустым.

Purge
{

 <*://*/*.css> age = 7w
 <*://*/*.js> age = 7w
 <*://*/*.json> age = 7w

 <*://*/*.png> age = 7w
 <*://*/*.jpg> age = 7w
 <*://*/*.jpeg> age = 7w
 <*://*/*.gif> age = 7w
 <*://*/*.ico> age = 7w

 <*://*/*.pdf> age = 7w
 <*://*/*.swf> age = 7w

 use-mtime     = no

 max-size      = -1
 min-free      = -1

 use-url       = yes

 del-dontget   = yes
 del-dontcache = yes

 age           = 4w

 compress-age  = -1
}

Секция Purge управляет очисткой кеша, здесь определяеца че скока хранить и когда удалять. Тут мы храним всякие картинки пдфки css/js и всю такую хорошо кешируемую дроч 7 недель😊

  • use-mtime = no - не использовать mtime - время последней модификации файла, вместо этого смотреть на atime - время последнего доступа к файлу, файл тут равен обьекту в кеше, это автоматом значит что ФС с кешем нельзя монтировать с noatime - будет не совсем правильно работать, тоесть будет удалять что угодно спустя 7 недель так как atime будет равен дате создания файла что равно времени когда обьект закешировали. но впринципе можно юзать relatime или lazytime если есть и если машина работает круглосуточно.
  • use-url = yes - оперировать урлами при очистке кеша, иначе будет смотреть только на протокол и хост.
  • del-dontget = yes - удалять сразу же все из кеша что попадает в DontGet список, удобно когда закешировал чтото не то или просто поправил DontGet - можно перечитать конфигурацию и запустить очистку.
  • del-dontcache = yes - тоже самое только для секции DontCache
  • age = 4w - максимальное время жизни обьекта. Если к нему небыло доступа в течении заданного промежутка времени то он удаляеца, это общее правило для всех у кого не указано индивидуально в начале секции.

Ох вроде все по конфигу wwwoffle😊 Вот такая вота партянка по маленькому персональному проксику😊 Вот еще мой полный crontab обслуживающий wwwoffle:

RKN_LOGFILE="/tmp/rkn.log"
BLOCK_LOGFILE="/tmp/adblock.log"

@reboot /usr/bin/sleep 30 && /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
@daily /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
0 10 * * * /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}
0 18 * * * /etc/wwwoffle/scripts/rkn.sh &>${RKN_LOGFILE} && /usr/bin/wwwoffle -config &>>${RKN_LOGFILE}

@daily cd /etc/wwwoffle/scripts && /etc/wwwoffle/scripts/convertlists.py -v /etc/wwwoffle/scripts/lists.json /etc/wwwoffle &>${BLOCK_LOGFILE} && /usr/bin/wwwoffle -config &>>${BLOCK_LOGFILE}

@daily /usr/bin/wwwoffle -purge|grep -i del &>/var/log/wwwoffle-purge.log

тоесть тут еще и чистка кеша приплюсовалась.

Основные часто используемые команды 2:

  • wwwoffle -config - перечитать конфигурацию.
  • wwwoffle -purge - почистить кеш.

больше мне вроде особо ниче не нужно было, но там есть еще😊

По работе впринципе особых нареканий нет, не смотря на весьма обьемныей списки, к примеру только ркновские домены+урлы 198218 записей, блоклисты 91182 записей, итого под 300 тысяч в сумме переваривает кабудта их нет - запуск, перечитывание конфига, да и просто работа - никаких тормозов не ощющаю как и загрузки cpu, единственное очистка кеша тормозит при этом знатно, точно знаю что из за них - без списков тоже летала. Видимо это из за del-dontget и del-dontcache, но на работу самого прокси это всеравно не влияет никак. Вот тебе и домашний проксик😊 А вот сквид на тех же условиях правда плюсом еще список ip а это еще уже почти 100К записей на данный момент при запуске на парсинге всего этого тупил уже ближе к минуте наверное, тоесть перезапускать или переконфигурить его это был ад и израиль😊 Хотя когда запустица - работал и не чхал😊

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

UPD - пока дошли руки - отдебажил и поправил это дело попутно написав Как собрать пакет для отладки в Gentoo, а проблема была вот тут:

src/wwwoffles.c:

       httpsUrl=ParseRequest(client,&request_head,&request_body);

       FreeURL(Url);
       Url=CreateURL("https",httpsUrl->hostport,httpsUrl->path,httpsUrl->args,httpsUrl->user,httpsUrl->pass);
       FreeURL(httpsUrl);

       goto checkrequest;
      }

ParseRequest возвращает null если по какой то причине не может распарсить запрос, подозреваю что он не мог потому что по какой то причине соединение обламывалось так как этому предшествовали в логе записи вида

Jul 24 20:30:44 srv wwwoffles[25247]: Nothing to read from the wwwoffle proxy socket; timed out or connection lost?

И парсить ему поэтому вообще тупо нечего😊 И судя по коду это сообщение какрас парсер и выводит😊 А потом мы пытаемся создать какой то Url в строке Url=CreateURL из того что нам вернул ParseRequest, а так как он нихрена не вернул, мы обращаемся к нулевым указателям и получаем сегфолт. Ну и на работе не сказывалось видимо потому что рас соединение обломилось то мы тут ниче собсно поделать то и не можем, правда остается вопрос почему они обламываются но это потом как нибудь, на пенсии повыясняю когда делать нехер будет😊

Решение довольно простое:

diff -ruN wwwoffle-2.9j/src/wwwoffles.c wwwoffle-2.9j-new/src/wwwoffles.c
--- wwwoffle-2.9j/src/wwwoffles.c       2018-07-24 02:12:59.233577980 +0300
+++ wwwoffle-2.9j-new/src/wwwoffles.c   2018-07-24 20:26:41.528637086 +0300
@@ -439,11 +439,19 @@

        httpsUrl=ParseRequest(client,&request_head,&request_body);

-       FreeURL(Url);
-       Url=CreateURL("https",httpsUrl->hostport,httpsUrl->path,httpsUrl->args,httpsUrl->user,httpsUrl->pass);
-       FreeURL(httpsUrl);
-
-       goto checkrequest;
+       if (httpsUrl) {
+            FreeURL(Url);
+            Url=CreateURL("https",httpsUrl->hostport,httpsUrl->path,httpsUrl->args,httpsUrl->user,httpsUrl->pass);
+            FreeURL(httpsUrl);
+            goto checkrequest;
+        }
+       else {
+            PrintMessage(Warning,"https (SSL) connection error - Request parse error for '%s', '%s', '%s'",Url->hostport, request_head?"HTTP request HEAD":"The HTTP request HEAD was empty",request_body?"HTTP request BODY":"The HTTP request BODY was empty");
+            HTMLMessage(client,500,"WWWOFFLE Server Error",NULL,"ServerError",
+                   "error","An https (SSL) connection to specified host (and port) is not established - Cannot parse Request.",
+                   NULL);
+            mode=InternalPage; goto internalpage;
+      };
       }
     else
       {

Слить чтоп не копипастить

я не вдавался в подробности и логику обработки запросов, а просто сделал проверку что парсер чтото вернул и если нет то кажем стандартную ошибку и вякаем в лог - падения убрались, ну покрайней мере по этой причине, и вроде ниче не сломалось

Впринципе вот эта вот система масок у него тоже очень понравилась. На фоне сквидовских регэкспов, да, они универсальней конечно, но сука с ними головняка в 10 рас больше - то экранируй это экранируй тут чето не срослось там нето тут какой то дебил по русски в листе написал или по китайски или спецсимволов наткал и фсе - оно споткнулось и сразмаху наебнулось, сквид не стартанул, бида пичаль фсе плачут и пиздец😊 А в wwwoffle никаких проблем - все просто как для дебилов и эффективно, и покрывает наверное 90 процентов того что можно накрутить регэкспами в сквиде.

А вот система логгирования это у wwwoffle ад израиль и пиздец😊 и я плачу😊 оно там конечно пишет - что из кеша, что в кеш, и pid процесса, но если много запросов то оно пишет в разнобой и бывает сходу хрен поймеш че к чему, request hit rate/byte hit rate оценить по логам в свете этого тоже та еще задача потому что на 1 запрос куча строк получается, встроенной статистики тоже нет никакой, впринципе не критично, но обидно😊 и с листами тоже нада доработать - оно пишет что попало к примеру в DontGet, но не пишет куда именно в нем, а если он большой то задолбаешся искать, может уровень логгинга поднять и начнет писать, я не пробовал, но я его итак уже приподнял чтоп хотябы видеть что закешировалось что нет что заблочилось. Впрочем сквид тоже не пишет в какой именно регэксп запрос попал - догадайся сам😊

Логгинг я отправил в сислог, у меня syslog-ng, им удобно разруливать такие вещи, примерно вот та:

## WWWOFFLE
destination d_wwwoffled { file("/var/log/wwwoffled.log"); };
filter f_wwwoffled { program("wwwoffled") or program ("wwwoffles"); };
log { source(src); filter(f_wwwoffled); destination(d_wwwoffled); flags(final); };

при этом ротейтить его можно логротейтом без дерганья самого wwwoffle, примерно вот так:

/var/log/wwwoffled.log {
        missingok
        notifempty
        copytruncate
}

По части кеширования можно хоть чтото прикрнуть вот так: ncdu

это наверное гдето за полмесяца, тоесть директория https в которой все что по https уже 2.4 гига, a http всего 213 мегабайт, что лиш подтверждает что на данный момент прокси без mitm в https потеряли актуальность чуть менее чем совсем.

Блять, неужели я наконец то дописал это😊 ладна теперь пойдем дальше:

Настройка TOR

Который нам нужен как средство обойти блокировки так как выходные ноды у него разбросаны по всему миру. Собсно конфиг:

/etc/tor/torrc:

#
# Minimal torrc so tor will work out of the box
#
User tor
PIDFile /var/run/tor/tor.pid
Log notice syslog
SafeLogging 0
DataDirectory /var/lib/tor/data
AvoidDiskWrites 1
#HardwareAccel 1
#AccelName cryptodev
SOCKSPort 127.0.0.1:9050 NoIPv6Traffic NoIsolateClientAddr NoIsolateSOCKSAuth
SocksTimeout 60
TestSocks 1
DNSPort 127.0.0.2:53 NoIsolateClientAddr
TransPort 127.0.0.1:9049 NoIsolateClientAddr NoPreferIPv6Automap
ControlPort 9051
MaxMemInQueues 256 MB
HashedControlPassword 16:5A0131CDE07B048560AD57E0306553CEDB23743F7DB20C74243C5EE58E
ShutdownWaitLength 1

#OutboundBindAddress 10.32.75.177

#dns resolver automap
AutomapHostsSuffixes .onion
VirtualAddrNetworkIPv4 169.254.0.0/16
AutomapHostsOnResolve 1

#DownloadExtraInfo 0
#EnforceDistinctSubnets 0
#OptimisticData auto

#FetchDirInfoEarly 0
#FetchDirInfoExtraEarly 0

#UseEntryGuards 1
#NumEntryGuards 32

TrackHostExits .
TrackHostExitsExpire 600

#LearnCircuitBuildTimeout 1
#NewCircuitPeriod 10
#CircuitBuildTimeout 30
#CircuitStreamTimeout 10
#CircuitIdleTimeout 3600
#MaxCircuitDirtiness 14400
#MaxClientCircuitsPending 512
#KeepalivePeriod 60

KeepBindCapabilities 0
GeoIPExcludeUnknown 0
ExcludeExitNodes {ru},{??}

#ExcludeExitNodes {ru},{ua},{se},{io},{ro}, \
#                   46.105.0.0/16, \
#                   46.183.216.0/21, \
#                   192.42.116.0/22, \
#                   77.247.176.0/21, \
#                   185.38.12.0/22, \
#                   163.172.0.0/16, \
#                   46.166.144.0/21, \
#                   216.218.128.0/17, \
#                   193.90.0.0/16, \
#                   104.233.64.0/18, \
#                   62.210.0.0/16, \
#                   176.10.96.0/19, \
#                   85.248.0.0/16, \
#                   137.74.167.224, \
#                   94.142.240.0/21, \
#                   185.11.180.0/22, \
#                   89.31.56.0/21, \
#                   151.80.0.0/16, \
#                   198.50.200.128/27, \
#                   199.249.223.0/24, \
#                   94.242.192.0/18, \
#                   149.56.229.17, \
#                   173.208.128.0/17, \
#                   66.180.193.192/27, \
#                   199.127.224.0/22, \
#                   41.206.160.0/19, \
#                   93.174.88.0/21, \
#                   69.162.128.0/18, \
#                   193.70.0.0/17, \
#                   207.244.64.0/18, \
#                   37.187.0.0/16, \
#                   195.228.0.0/16

ClientOnly 1

Стоит он у меня уже давно, поэтому я всех ньюансов уже не помню, только основные:

  • SOCKSPort 127.0.0.1:9050 NoIPv6Traffic NoIsolateClientAddr NoIsolateSOCKSAuth собсно адрес:порт на котором принимать socks соединения, NoIPv6Traffic - запретить ipv6, у меня он в системе отсутствует как класс, NoIsolateClientAddr - не изолировать клиентов на основе их адреса путем выделения отдельного circuit каждому клиенту, ну клиент то один - изолировать нехер по определению😊 NoIsolateSOCKSAuth - тоже самое только различает клиентов по авторизации на socks прокси, но авторизации тоже нет, клиент все еще 1 я поэтому опять таки изолировать нехер и потому нехер😊
  • DNSPort 127.0.0.2:53 NoIsolateClientAddr - очень полезный весчь - поднимает корявый и кривой dns сервир который резольвит через тор имена, но только A и AAAA помоему, ни MX ни че еще покруче не умеет впринципе, но зато туда можно потом форвардить запросы с бинда и пресечь dns-leaks или выкрутица если провайдер вкорень охуеет и начнет подменять/резать днс запросы/ответы. NoIsolateClientAddr то же самое что и до этого.

Следующие 3 строчки делают еще 1 полезную весчь называемую dns resolver automap, суть в том что при запросе внутреннего ресурса в зоне .onion, вот тот внутренний днс сервер выдает ему левый ип из определенного диапазона, и сопоставляет с той белибердой называемой внутренними адресами в сети тор, благодаря чему, любой софт может обратица к данному ресурсу и не обламаца при днс резольвинге пока живо это сопоставление.

  • AutomapHostsSuffixes .onion - для какой зоны вкдючать этот автомаппинг, пока вроде есть только .onion
  • VirtualAddrNetworkIPv4 169.254.0.0/16 - подсеть из которой пэпить адреса, это вроде link-local которая мне нахер не нужна нигде и никогда.
  • AutomapHostsOnResolve 1 - собсно включить этот автомэппинг.

У меня этот автомэппинг работает в связке с tun2socks, это по сути обычный tun интерфейс в системе в который отроучена 169.254.0.0/16, другим концом он цепляеца на socks сервер тора, правда умеет он тока TCP но udp через тор не особо то и нада с его то лагами. ну и плюс форвардинг с локального днс сервера. Таким образом в onion может лазить вообще любой софт, ему не нужен никакой прокси, он просто запрашивает у локального днс сервера адрес, тот лезет на днс сервер тора с той же целью, сервер тора отвечат и сразу делает мэппинг, после чего приложение работает как обычно - все адреса из мэппинга то отроучены в tun, не нужно уметь никакой socks прокси вообще. Таким же образом работает и ipset с заблокированными подсетями, только тут уже даже и мэппинг не нужен - главное отправить траффик на этот адрес через tun интерфейс.

  • TrackHostExits . - да да - там точка😊 нужно для того чтоп при запросах к одному и тому же dst ip использовалась одна и та же exit node что означает один и тот же ip адрес, нужно потому что некоторые форумы очень не любят когда авторизованный пользователь скачет по разным ip в рамках форумной сессии и получается ой, а тор без этой хрени может вообще для каждого запроса выбрать разные exit node к примеру, плюс это получается быстрее, правда документация утверждает что галактекапасносте и при этом вас могут отследить но мне насрать на это - я ниче такого не делаю каму я нах нужен меня отслеживать😊
  • TrackHostExitsExpire 600 - таймаут сопоставления dst ip-exit node, после него выбирается новая exit node, правда с этим есть косяк - если нода уйдет в даун - фсе сломаеца, почемуто он не вабирает новую пока таймаут не коньчица. какой далбаеб так придумал яхз, хотя может уже поправили, много времени уже прошло с тех пор как я это ковырял.
  • GeoIPExcludeUnknown 0 - не удалять неизвестные по мнению geoip базы а так же из A1(че за а1???) из exit node и транзитных нод.
  • ExcludeExitNodes {ru},{??} - удалить по мнению geoip российские -{ru} и неизвестногде {??} ноды из выходных нод - иначе будем нарываца на те же блокировки если нода находица в россси. Правда блокировки есть не только в россси, поэтому можно нарваца на другие блокировки, в других странах и местах, но это не так страшно - всегда можно сменить exit node в ручную или заэксклудить всю страну/подсеть.
  • ClientOnly 1 - использовать только клиентскую часть - у меня нет никаких сервисов в сети тор, покашто😊 в ip2 есть этот сайтик зато, до тора руки не дошли еще да и не хочеца прикладывать то особо потому что когда то давно некоторое время я был транзитной нодой, когда был у меня белый ip, потом я переехал и его не стало, а серверная часть тора через нат работает мягко говоря через жопу - ему почемуто нада задать и внутренний серый локальный ip машины и внешний ip ната, пробросить порты, подождать сполчаса пока он это проверит, если заебись то тогда работает, а у меня и серый и натовский белый адреса динамические, и как блять быть???? I2PD тут же шпарит из коробки - похуйна нат, даже на двойной ибо я за роутером еще. а тут присягаблязатрах, ип сменился - и че? мне конфиги править каждый день? да нахер нада...

Вот вроде бы и все что я смог вспомнить с тором то.

Вобщем дальше настало время связующего звена между тором и wwwoffle в виде 3proxy в позе http/s=>socks прокси. В случае сквида оно было не нужно, там я через ацл мог сразу отправить запрос через тот самый tun2socks интерфейс и не парица - оно просто работало, wwwoffle так не может, и нужно промежуточное звено, тоже долго искал... чучуть поработал с tinyproxy который пришлось пропатчить на предмет поддержки socks, но потом всетаки остановился на [Glossary_3proxy|3proxy]], он маленький, дохера чего может, можно сделать кучу разных проксей для разных задач и все в рамках одной софтины, потому остановился на нем.

Настройка 3proxy

Тут так просто сходу 2 кнопками нихера не выйдет - придеца вдумчиво читать документацию😊 порядок команд имеет значение, порядок ACL тоже, и еще куча ньюансов, но тем не менее все работает😊 Неожиданностью оказалось что он тоже умеет mitm aka sslbump для https, правда не понятно нахуя😊 может для фильтрации тока, кешировать к сожалению он не умеет впринципе, зато умеет проксировать http/https,socks4/5/ftp/pop/smtp и даже просто tcp, естественно умеет http/s=>socks и наоборот тоже, иначе бы я его не поставил😊 Расширяеца плагинами, и судя по сайту довольно активно пилица. Эдакий маленький кобайн который может дохрена всего, размером всего в полмегабайта. Умел бы он кешировать думаю надобность в wwwoffle бы отпала, а он бы точно стал паравозиком который смог😊 но, неумеет.

Тут не только то что нам нада для решения задачи, но и кое что еще сбоку - socks->http прокси, я через него же подключаюсь с работы, хоть я и работаю в ISP, и могу обойти эти блокировки по другому так как все железо подконтрольно мне в том числе и то что эти блокировки реализует, да и можно тупо подключица выше этих блокираторов, но это ломает стройность операторского ядра сети и поэтому я не хочу так делать, а юзаю домашний прокси с работы через socks, заодно и банерорезку получаю.

ebuild в gentoo кривоватый, не в плане что не собираеца, а в плане что тупо ставит бинарники и документацию и все - никаких init скриптов и дефолтных конфигов нет, никакого отдельного пользователя для процесса тоже нет, пришлось создавать вручную, все директории тоже вручную, в самом архиве есть init скрипт но пришлось подправить пути и еще там по мелочи. но это все мелочи😊

итак конфиг:

config /etc/3proxy/3proxy.cfg
setgid 990
setuid 999
daemon
internal 10.32.75.177
external 127.0.0.1
nserver 127.0.0.1
#nscache 1024
fakeresolve
timeouts 1 5 30 60 180 1800 15 60
log /var/log/3proxy/3proxy.log D
logformat "L%d-%m-%Y %H:%M:%S.%.  %N.%p %E %U %C:%c %R:%r %O %I %h %T"
archiver gz /bin/gzip %F
rotate 30

users $/etc/3proxy/.proxyauth

############### Private HTTP -> SOCKS, used to link wwwoffle to socks servers in tor
maxconn 64
auth iponly
allow * 127.0.0.0/8 * * *
parent 1000 socks5+ 127.0.0.1 9050
allow * 127.0.0.0/8 * * HTTP,HTTPS
proxy -a -n -p8888 -i127.0.0.1 -e127.0.0.1
flush

############### Public SOCKS -> HTTP service - personal use on my work to obey rkn blocks for example
maxconn 64
#auth iponly strong
auth iponly
allow * 91.193.236.34 * 80,8080
parent 1000 http 127.0.0.1 3128
allow * 91.193.236.34 * 443
parent 1000 connect+ 127.0.0.1 3128
socks
flush

############### Test auth
#auth strong
#maxconn 64
#allow root
#socks -u2
#flush


pidfile /run/3proxy.pid

ну тут впринципе все понятно😊

  • config /etc/3proxy/3proxy.cfg - путь к конфигу, насколько я понял используется в случае если сервер рестартует сам себя, так то при старте ему с командной строки конфиг указывается.
  • setgid 990 и setuid 999 - вытсавляют uid/gid процесса, тоесть он сбрасывает права, я создал специально системного юзера под него, не помню как - не спрашивайте, в конце концов если вы этого не можете то вам тут ваще читать нехер - всеравно нихера не сделаете😊 их нада ближе к началу, и до pidfile, иначе будет ой, 2 штуки, но мне лень расписывать каких и почему😊
  • daemon - стать демоном😊 тоже лучше ближе к началу и до pidfile, ато он сделает форк и в pidfile будет старый pid, из за чего не получица потом сделать ни стоп ни релоад через init скрипт, вообще тут идеология такова что он тупо читает этот файл и тут же выполняет все по очереди, как интерпретатор, в отличии от других у которых просто набор опций, которые сначала все читаются и формируется конечная конфигурация а потом уже включается логика на ее основе, тут не так.
  • internal 10.32.75.177 - задает внутренний ip по умолчанию, внутренний тут значит тот на котором он ожидает клиентские запросы, какие бы то нибыло, можно задать другой для конкретного сервиса, а если в сервисе не указан явно то будет этот.
  • external 127.0.0.1 задает внешний ip по умолчанию, внешний тут значит тот с которого он будет делать запросы в мир, можно задать другой для конкретного сервиса, а если в сервисе не указан явно то будет этот. 127.0.0.1 тут потому что нам мир ваще не нужен - мы локальный прокси между двумя другими локальными прокси.
  • nserver 127.0.0.1 - адрес днс сервера, автор рекомендует указывать тут, хотя если не указать он юзает системный, но гдето у него были какието грабли с libc при этом поэтому он рекомендует указать тут😊 ну нам не жалко - укажем на свой локальный бинд.
  • fakeresolve резольвить все в 127.0.0.2, не совсем понятна эта хрень, используется когда резольвинг вообще не нужен, к примеру при socks5 и http parent'ах - резольвит parent прокси, нам это не нужно, но если нам это не нужно нахрена чтото резольвить в 127.0.0.2? не понятно нихуя ну да ладно - автор рекомендует это юзать в нашей ситуации - не будем спорить😊
  • log /var/log/3proxy/3proxy.log D - куда писать лог, и как часто ротейтить - D каждый день, логи он ротейтит сам, совсем сам - сам ротейтит сам пакует, сам удаляет старые... впервый рас такое вижу😊
  • logformat "L%d-%m-%Y %H:%M:%S.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T" формат лога - я там формат времени поменял, но уже точно не помню че да как, в документации смотрите но сдаеца мне что это L%d-%m-%Y %H:%M:%S.%.
  • archiver gz /bin/gzip %F - команда архивирования логов.
  • rotate 30 - ротация логов, будет хранить за последние 30 дней.
  • users $/etc/3proxy/.proxyauth таким вот макаром он инклудит кусок конфига из другого файла, в данном случае там логины с паролями которые я пытался заюзать на socks->http с работы, но как оказалось у браузеров неожиданно socks авторизация мягко говоря бывает прихрамывает, и пока у меня с этим нихуя не вышло - зарезал доступ по ip фаером.

дальше собственно кусок который какрас реализует http->socks между wwwoffle и тором:

  • maxconn 64 - максимальное число соединений - действует на все сервисы после данной команды.
  • auth iponly - авторизация по ip, есть и другие, нам тут авторизация не нужна, нам нужен тупо транзит, всеравно оно все на lo крутица - никто туда не достанет, и есть такая - none, но при none не работают ACL'и с ip, так что придеца юзать iponly
  • allow * 127.0.0.0/8 * * * - разрешить все всем со всех адресов локальной петли.
  • parent 1000 socks5+ 127.0.0.1 9050 - а вот этот финт ушами обязательно должен идти только после предыдущего allow, почему так читайте в официальной документации. и делает он какрас то что нам нада - отправляет все на socks сервер тора, 1000 это типа вес данного парента, их может быть несколько и выбираца они могут на основе веса, socks5+ - протокол, + означает резольвить имена через вышестоящий прокси, 127.0.0.1 9050 соответственно адрес и порт вышестоящего прокси.
  • allow * 127.0.0.0/8 * * HTTP,HTTPS разрешить HTTP и HTTPS запросы с петлевой подсети на локальный http прокси, который должен идти именно за этим allow, почему так читайте выше😊
  • proxy -a -n -p8888 -i127.0.0.1 -e127.0.0.1 - запускает http прокси сервер, -a значит анонимный, тока хз что это значит в точности - не написано😊 -n откючает NTLM авторизацию, -p8888 - на каком порту слушать, -i127.0.0.1 -e127.0.0.1 это тоже самое что internal/external выше но только для даного конкретного сервиса, тоесть по сути это оверврайтинг того что в internal/external.
  • flush - сбрасывает все предыдущие ACL'и, как точно это работает я не разобрался, но как я понял начиная с auth он их запоминает и применяет ко всем сервисам какие описаны пока не наткнеца на flush, после чего можно опять написать auth и другие ACL'и для других сервисов, и они не будут никак пересекаца с предыдущими.
  • pidfile /run/3proxy.pid - куда писать pid, лучще чтоп оно было в конце, ато он там в некоторых случаях форкаеца в процессе а пид не перезаписывает.

Вот впринципе и все, запускаеца он путем 3proxy /path/to/config😊 по сигналу USR1 он толи перезапускаеца толи конфиг перечитывает толи и то и другое - хз. Так же там еще в конфиге откомментированная секция c SOCKS->HTTP прокси который я юзаю с работы, принцип вобщем то тот же только там 2 парента, один для http другой для https и соотвествующие ACL'и к ним выбирающие их по dst port, сделано так потому что для http и https различный тип парентов что впринципе логично, так как использование https несколько отличается от http, если вам данный функционал не нужен то просто удалите эту секцию.

Поправленный init скрипт - положить в /etc/init.d/3proxy:

#!/bin/sh
#
# chkconfig: 2345 20 80
# description: 3proxy tiny proxy server
#
#
#
#

PID="/run/3proxy.pid"
if [ ! -f $PID ]; then
    touch $PID && chown proxy3.proxy3 $PID
fi

case "$1" in
   start)
       echo Starting 3Proxy

       /usr/bin/3proxy /etc/3proxy/3proxy.cfg

       RETVAL=$?
       echo
       [ $RETVAL ]
       ;;

   stop)
       echo Stopping 3Proxy
       if [ $PID ]; then
               /bin/kill `cat $PID`
       else
               /usr/bin/killall 3proxy
       fi

       RETVAL=$?
       echo
       [ $RETVAL ]
       ;;

   restart|reload)
       echo Reloading 3Proxy
       if [ $PID ]; then
               /bin/kill -s USR1 `cat $PID`
       else
               /usr/bin/killall -s USR1 3proxy
       fi
       ;;


   *)
       echo Usage: $0 "{start|stop|restart}"
       exit 1
esac
exit 0

ну и в gentoo сделать rc-update add 3proxy default. По работе могу сказать покашто тока одно - его не видно и не слышно - настроил(поебался) и забыл😊 никаких глюков, падений и проблем небыло.

На данный момент должна работать wwwofle <=> внешний мир, и связка wwwoffle <=http/s=> 3proxy <=socks5=> tor <=> внешний мир для всего что есть в proxy_header и в ркновских блоклистах😊 если нет то проверяем покомпонентно тем же браузером начиная с tor и движемся в сторону wwwofle.

Если вам это не удаеца и вы не можете идентифицировать неработающий компонент, если вы не знаете как использовать tcpdump, как телнетом запросить страничку по http, или не понимаете разницу между socks http и https протоколами хотя бы отдаленно, если не знаете как применить патч и не можете узнать, или не дай бог не отличаете клиента от сервера или не можете читать по английски недайбоже то тушим свет и расходимся, вам на хабр настраивать прокси для телеграмов а не такие связки лепить. Это даже еще не половина😊 Ко мне с вопросами пачемунипашет приставать даже не пытайтесь.

Ладна, поехали дальше, тепень нам нужен способ обойти блокировки по ip, тоесть все то что в том ипсете который формируется скриптом script_wwwoffle_rkn.sh нужно как то отправить через tor, и есть такой способ - tun2socks из пакета badvpn.

итак tun2socks и сопуствующая хрень

tun2socks собсно одним концом представляет из себя обычный сетевой tun интерфейс, с одним ограничением - не умеет udp, там есть какаято примочка для этого но мне не нужна и я не вникал, так что у меня не уммет😊 а другим концом он цепляется на socks сервер, таким образом любое приложение может работать через socks по tcp при условии что траффик идет через данный интерфейс.

Так как у меня генту, готовые конфиги для нее, интерфейс собсно поднимается штатно, ну или почти штатно - через netifrc. ставица emerge net-vpn/badvpn, так как мне нужен только tun2socks я оставил тока tun2socks use flag, ато там еще до кучи поставица какой то ихний сервир, какой то скриптовый интерпретатор для конфигрурации сети и еще всякая хрень - зачем засорять систему???

/etc/conf.d/net


modules="!system !iwconfig !wpa_supplicant !l2tp"
dns_domain_lo="lan"

config_enp2s0f1="10.32.75.177/30"
routes_enp2s0f1="default via 10.32.75.178"

config_tun2sock0="100.64.0.1 netmask 255.255.255.252 brd 100.64.0.3"
rules_tun2sock0="from 100.64.0.0/30 table tun2socks
                fwmark 10 lookup tun2socks"
routes_tun2sock0="default via 100.64.0.2 table tun2socks
    169.254.0.0/16 via 100.64.0.2 dev tun2sock0"

preup() {
    if [ "${IFACE}" == "tun2sock0" ]; then
        ip tuntap add dev tun2sock0 mode tun
        badvpn-tun2socks --tundev tun2sock0 --netif-ipaddr 100.64.0.2 --netif-netmask 255.255.255.252 --socks-server-addr 127.0.0.1:9050 --loglevel 3 --syslog-facility local &
        sysctl net.ipv4.conf.${IFACE}.rp_filter=0
    fi
}

postdown() {
    if [ "${IFACE}" == "tun2sock0" ]; then
       kill `pidof badvpn-tun2socks` && ip tuntap del dev tun2sock0 mode tun
    fi
}

Ну тут собсно config_enp2s0f1 это обычный сетевой интерфейс машины, badvpn-tun2socks - так называется бинарник поднимающий tun2socks интефейс, preup()/postdown() - стандартные процедуры вызываемые при поднятии/после опускания интерфейса в gentoo.

  • tun2sock0 - имя интерфейса.
  • preup() - функция запускаемая перед попыткой сконфигурировать интерфейс, тут собственно стартует tun2socks, --netif-ipaddr 100.64.0.2 - адрес типа виртуального роутера - по сути аналог маршрута по умолчанию, --netif-netmask 255.255.255.252 - маска интерфейса, они же потом используется в конфигурации интерфейса, тоесть они не от балды😊 --socks-server-addr 127.0.0.1:9050 - ip адрес:порт socks сервера tor, ну оставшееся понятно наверное итак - логгинг через syslog с facility local, sysctl net.ipv4.conf.${IFACE}.rp_filter=0 - отключает reverce path filtering для данного интерфейса, иначе система отбросит все пакеты которые исходят не с подсетей на этом интерфейсе и ниче соответственно работать не будет.
  • postdown() - функция запускаемая ппосле деактивации и деконфигурирования интерфейса - тут нам просто нужно прибить процесс и удалить интерфейс.
  • config_tun2sock0="100.64.0.1 netmask 255.255.255.252 brd 100.64.0.3" стандартное обьявление адресов на интерфейсе, я взял из этого диапазона так как он редко используется в локалках и вероятность пересечься с чем то крайне мала.
  • rules_tun2sock0 - PBR - все с подсети 100.64.0.0/30 роутим через отдельную таблицу маршрутизации tun2socks, так же через нее же роутим все что имеет fw метку 10.
  • routes_tun2sock0 - маршрут по умолчанию в таблице tun2socks, и туда же роутим все что идет на подсеть для мэппинга имен в tor - 169.254.0.0/16. эти параметры писать как есть - в 2 строки или скока там, иначе не сработает.

так же нада добавить таблицу маршрутизации tun2socks в /etc/iproute2/rt_tables чтоп к ней можно было обращаца по имени, вприсываем туда в конец 1 tun2socks к примеру, чтоп было примерно так:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

1 tun2socks

Таблица маршрутизации после поднятия интерфейса должна выглядеть примерно так за исключением того что к делу не относица:

#ip rule list
0:	from all lookup local 
32764:	from all fwmark 0xa lookup tun2socks 
32765:	from 100.64.0.0/30 lookup tun2socks 
32766:	from all lookup main 
32767:	from all lookup default 

#ip route show table tun2socks
default via 100.64.0.2 dev tun2sock0 metric 7 
#

Теперь у нас есть через чего мы можем тупо отправить tcp траффик через socks, осталось дело за выбором че отправлять че нет, делается это штатным фаерволом, у меня вот так:

#!/bin/bash

IPT="/sbin/iptables"
IPSET="/usr/sbin/ipset"
TABLES=`cat /proc/net/ip_tables_names 2>/dev/null`

for i in $TABLES;
do
    $IPT -t $i -F
done

for i in $TABLES;
do
    $IPT -t $i -X
done.

if ! $IPSET list blocked_ip_rkn &>/dev/null ; then.
     $IPSET flush blocked_ip_rkn 2>/dev/null || $IPSET create blocked_ip_rkn hash:net maxelem 262144
fi

$IPT -t mangle -A OUTPUT -p tcp -m multiport --dports 443,80 -m owner --uid-owner wwwoffle --gid-owner wwwoffle -m set --match-set blocked_ip_rkn dst -j MARK --set-mark 10

# SOCKS ACCESS
$IPT -N 3proxy_access
$IPT -A 3proxy_access -s 91.193.236.34 -j ACCEPT
$IPT -A 3proxy_access -j REJECT.

$IPT -A INPUT ! -i lo -p tcp --dport 1080 -j 3proxy_access

в Gentoo он у меня лежит в /etc/local.d/firewall.start благодаря чему запускается автоматически. В начале идет очистка всех правил, потом проверка что ipset blocked_ip_rkn есть, потому что если его нет то правило iptables не добавица, ну и в конце там еще socks 3proxy зафаерволен который я на работе юзаю. собсно нас тут интересует правило iptables:

$IPT -t mangle -A OUTPUT -p tcp -m multiport --dports 443,80 -m owner --uid-owner wwwoffle --gid-owner wwwoffle -m set --match-set blocked_ip_rkn dst -j MARK --set-mark 10 - именно оно ставит метку 10 благодаря которой потом траффик принудительно маршрутизируется через tun2socks а не через дефолт, разберем подробней:

  • -p tcp - только tcp
  • -m multiport --dports 443,80 - расширение multiport - позволяет задавать список портов за рас, тут у нас порты назначения 80 и 443.
  • -m owner --uid-owner wwwoffle --gid-owner wwwoffle - основное колдунство😊 - классифицирует гокальный траффик на основе идентификаторов пользователя/группы процесса, тут мы выделяем траффик wwwoffle - только от нее он будет идти через tun2socks.
  • -m set --match-set blocked_ip_rkn dst - расширение set - для проверок в ipset, тут собсно проверяем что ip адрес назначения попадает в ipset blocked_ip_rkn.
  • -j MARK --set-mark 10 собсно таргет всего данного правила - выставить метку 10, по которой потом правилом from all fwmark 0xa lookup tun2socks и маршрутизируется траффик по таблице tun2socks, в которой 1 маршрут - через интерфейс tun2socks.

Впринципе, после всего этого уже любой запрос через wwwoffle на любой адрес из ipset blocked_ip_rkn должен пойти через socks сервер tor, ну к примеру:

┌────[root@srv: 2018-07-26 20:15:55 ~]
└─># ipset list blocked_ip_rkn|tail
104.27.176.3
185.106.140.52
95.211.113.169
88.208.50.182
23.253.135.112
78.140.141.120
5.45.70.120
81.94.208.16
94.242.241.63
104.18.44.77
┌────[root@srv: 2018-07-26 20:15:58 ~]
└─># tcpdump -n -i tun2sock0
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun2sock0, link-type RAW (Raw IP), capture size 262144 bytes
20:16:10.710511 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [SEW], seq 3424285378, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
20:16:10.710606 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [S.], seq 19638, ack 3424285379, win 5840, options [mss 1460], length 0
20:16:10.710697 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [.], ack 1, win 29200, length 0
20:16:10.710859 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [P.], seq 1:420, ack 1, win 29200, length 419: HTTP: GET / HTTP/1.1
20:16:10.835219 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [.], ack 420, win 5421, length 0
20:16:11.176441 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [.], seq 1:1461, ack 420, win 5421, length 1460: HTTP: HTTP/1.1 403 Forbidden
20:16:11.176489 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [.], ack 1461, win 32120, length 0
20:16:11.176562 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [P.], seq 1461:1764, ack 420, win 5421, length 303: HTTP
20:16:11.176579 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [.], ack 1764, win 35040, length 0
20:16:11.586123 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [F.], seq 1764, ack 420, win 5421, length 0
20:16:11.586949 IP 10.32.75.177.34194 > 104.18.44.77.80: Flags [F.], seq 420, ack 1765, win 35040, length 0
20:16:11.587020 IP 104.18.44.77.80 > 10.32.75.177.34194: Flags [.], ack 421, win 5420, length 0
20:16:11.643978 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [SEW], seq 3817387905, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
20:16:11.644092 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [S.], seq 25566, ack 3817387906, win 5840, options [mss 1460], length 0
20:16:11.644183 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 1, win 29200, length 0
20:16:11.644315 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [P.], seq 1:493, ack 1, win 29200, length 492: HTTP: GET /cdn-cgi/styles/cf.errors.css HTTP/1.1
20:16:11.644406 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [SEW], seq 1368472906, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
20:16:11.644437 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [S.], seq 31494, ack 1368472907, win 5840, options [mss 1460], length 0
20:16:11.644458 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 1, win 29200, length 0
20:16:11.644609 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [P.], seq 1:478, ack 1, win 29200, length 477: HTTP: GET /cdn-cgi/scripts/zepto.min.js HTTP/1.1
20:16:11.659409 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [SEW], seq 2218674855, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
20:16:11.659472 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [S.], seq 37422, ack 2218674856, win 5840, options [mss 1460], length 0
20:16:11.659518 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [.], ack 1, win 29200, length 0
20:16:11.659744 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [P.], seq 1:478, ack 1, win 29200, length 477: HTTP: GET /cdn-cgi/scripts/cf.common.js HTTP/1.1
20:16:11.837011 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [.], ack 478, win 5363, length 0
20:16:11.837054 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], ack 478, win 5363, length 0
20:16:11.837062 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [.], ack 493, win 5348, length 0
20:16:12.046699 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], seq 1:1461, ack 478, win 5363, length 1460: HTTP: HTTP/1.1 200 OK
20:16:12.046754 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 1461, win 32120, length 0
20:16:12.046763 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], seq 1461:2921, ack 478, win 5363, length 1460: HTTP
20:16:12.046806 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 2921, win 35040, length 0
20:16:12.046904 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [P.], seq 2921:3487, ack 478, win 5363, length 566: HTTP
20:16:12.046957 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 3487, win 37960, length 0
20:16:12.094814 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], seq 3487:4947, ack 478, win 5363, length 1460: HTTP
20:16:12.094856 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 4947, win 40880, length 0
20:16:12.094880 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], seq 4947:6407, ack 478, win 5363, length 1460: HTTP
20:16:12.094890 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 6407, win 43800, length 0
20:16:12.094919 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [P.], seq 6407:7471, ack 478, win 5363, length 1064: HTTP
20:16:12.094946 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 7471, win 46720, length 0
20:16:12.107706 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], seq 7471:8931, ack 478, win 5363, length 1460: HTTP
20:16:12.107759 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 8931, win 49640, length 0
20:16:12.107920 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [P.], seq 8931:9793, ack 478, win 5363, length 862: HTTP
20:16:12.107950 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [.], ack 9793, win 52560, length 0
20:16:12.178175 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [.], seq 1:1461, ack 493, win 5348, length 1460: HTTP: HTTP/1.1 200 OK
20:16:12.178214 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 1461, win 32120, length 0
20:16:12.178221 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [.], seq 1461:2921, ack 493, win 5348, length 1460: HTTP
20:16:12.178231 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 2921, win 35040, length 0
20:16:12.178250 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [P.], seq 2921:3487, ack 493, win 5348, length 566: HTTP
20:16:12.178261 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 3487, win 37960, length 0
20:16:12.215356 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [.], seq 3487:4947, ack 493, win 5348, length 1460: HTTP
20:16:12.215385 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 4947, win 40880, length 0
20:16:12.215461 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [P.], seq 4947:5319, ack 493, win 5348, length 372: HTTP
20:16:12.215478 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [.], ack 5319, win 43800, length 0
20:16:12.276385 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [.], seq 1:1461, ack 478, win 5363, length 1460: HTTP: HTTP/1.1 200 OK
20:16:12.276422 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [.], ack 1461, win 32120, length 0
20:16:12.276474 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [P.], seq 1461:2441, ack 478, win 5363, length 980: HTTP
20:16:12.276489 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [.], ack 2441, win 35040, length 0
20:16:12.587898 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [F.], seq 2441, ack 478, win 5363, length 0
20:16:12.587947 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [F.], seq 5319, ack 493, win 5348, length 0
20:16:12.587963 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [F.], seq 9793, ack 478, win 5363, length 0
20:16:12.590500 IP 10.32.75.177.34212 > 104.18.44.77.80: Flags [F.], seq 478, ack 2442, win 35040, length 0
20:16:12.590563 IP 104.18.44.77.80 > 10.32.75.177.34212: Flags [.], ack 479, win 5362, length 0
20:16:12.590690 IP 10.32.75.177.34204 > 104.18.44.77.80: Flags [F.], seq 493, ack 5320, win 43800, length 0
20:16:12.590715 IP 104.18.44.77.80 > 10.32.75.177.34204: Flags [.], ack 494, win 5347, length 0
20:16:12.598426 IP 10.32.75.177.34208 > 104.18.44.77.80: Flags [F.], seq 478, ack 9794, win 52560, length 0
20:16:12.598485 IP 104.18.44.77.80 > 10.32.75.177.34208: Flags [.], ack 479, win 5362, length 0
^C
66 packets captured
66 packets received by filter
0 packets dropped by kernel
┌────[root@srv: 2018-07-26 20:16:16 ~]
└─># 

Это я вбил 104.18.44.77 в адресную строку бравзера - фсе работает😊 Оказалось это адрес одной из нод Cloudflare и получается заблокировали всех кто на нее попадет😊 Впринципе мэппинг зоны .onion в Tor тоже должен работать, если прописать днс сервером 127.0.0.2 в /etc/resolv.conf то можно проверить вот так к примеру:

┌────[root@srv: 2018-07-26 21:00:41 ~]
└─># host 3g2upl4pq6kufc4m.onion 
3g2upl4pq6kufc4m.onion has address 169.254.211.122
┌────[root@srv: 2018-07-26 21:01:11 ~]
└─>#

Тоесть нам выдали ip для 3g2upl4pq6kufc4m.onion из диапазона для мэппинга в Tor 169.254.0.0/16, вбиваем в браузер https://3g2upl4pq6kufc4m.onion/ и наблюдаем следующее на tun2socks интерфейсе:

┌────[root@srv: 2018-07-26 21:13:34 ~]
└─># tcpdump -n -i tun2sock0
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun2sock0, link-type RAW (Raw IP), capture size 262144 bytes
21:13:38.143806 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [SEW], seq 3827395173, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
21:13:38.143860 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [S.], seq 395346, ack 3827395174, win 5840, options [mss 1460], length 0
21:13:38.143940 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 1, win 29200, length 0
21:13:38.144127 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 1:270, ack 1, win 29200, length 269
21:13:38.214322 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], ack 270, win 5571, length 0
21:13:41.510642 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], seq 1:1461, ack 270, win 5571, length 1460
21:13:41.510708 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 1461, win 32120, length 0
21:13:41.510719 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], seq 1461:2921, ack 270, win 5571, length 1460
21:13:41.510738 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 2921, win 35040, length 0
21:13:41.510772 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [P.], seq 2921:3487, ack 270, win 5571, length 566
21:13:41.510787 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 3487, win 37960, length 0
21:13:41.574820 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [P.], seq 3487:4256, ack 270, win 5571, length 769
21:13:41.574878 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 4256, win 40880, length 0
21:13:41.576256 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 270:345, ack 4256, win 40880, length 75
21:13:41.717564 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], ack 345, win 5496, length 0
21:13:41.717648 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 345:396, ack 4256, win 40880, length 51
21:13:41.954137 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 345:396, ack 4256, win 40880, length 51
21:13:41.954235 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], ack 396, win 5445, length 0
21:13:42.087069 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [P.], seq 4256:4530, ack 396, win 5445, length 274
21:13:42.088590 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 396:865, ack 4530, win 43800, length 469
21:13:42.217913 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], ack 865, win 4976, length 0
21:13:42.566856 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [.], seq 4530:5990, ack 865, win 4976, length 1460
21:13:42.614098 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 5990, win 46720, length 0
21:13:42.614148 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [P.], seq 5990:7423, ack 865, win 4976, length 1433
21:13:42.614163 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [.], ack 7423, win 49640, length 0
21:13:42.626013 IP 100.64.0.1.22306 > 169.254.211.122.443: Flags [P.], seq 865:896, ack 7423, win 49640, length 31
21:13:42.626060 IP 169.254.211.122.443 > 100.64.0.1.22306: Flags [R.], seq 7423, ack 896, win 5840, length 0
21:13:43.153681 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [SEW], seq 1831618165, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 9], length 0
21:13:43.153773 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [S.], seq 408169, ack 1831618166, win 5840, options [mss 1460], length 0
21:13:43.153858 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [.], ack 1, win 29200, length 0
21:13:43.154077 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [P.], seq 1:270, ack 1, win 29200, length 269
21:13:43.218258 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], ack 270, win 5571, length 0
21:13:43.935375 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], seq 1:1461, ack 270, win 5571, length 1460
21:13:43.935413 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [.], ack 1461, win 32120, length 0
21:13:43.935420 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], seq 1461:2921, ack 270, win 5571, length 1460
21:13:43.935456 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [.], ack 2921, win 35040, length 0
21:13:43.935504 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [P.], seq 2921:3487, ack 270, win 5571, length 566
21:13:43.935525 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [.], ack 3487, win 37960, length 0
21:13:44.037489 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [P.], seq 3487:4256, ack 270, win 5571, length 769
21:13:44.037520 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [.], ack 4256, win 40880, length 0
21:13:44.038769 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [P.], seq 270:345, ack 4256, win 40880, length 75
21:13:44.219077 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], ack 345, win 5496, length 0
21:13:44.219117 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [P.], seq 345:396, ack 4256, win 40880, length 51
21:13:44.469480 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], ack 396, win 5445, length 0
21:13:44.652660 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [P.], seq 4256:4530, ack 396, win 5445, length 274
21:13:44.654222 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [P.], seq 396:1048, ack 4530, win 43800, length 652
21:13:44.719427 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], ack 1048, win 4793, length 0
21:13:45.056474 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [P.], seq 4530:5197, ack 1048, win 4793, length 667
21:13:45.056831 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [P.], seq 1048:1079, ack 5197, win 46720, length 31
21:13:45.056888 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [R.], seq 5197, ack 1079, win 5840, length 0
21:13:45.056907 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [F.], seq 1079, ack 5197, win 46720, length 0
21:13:45.056928 IP 169.254.211.122.443 > 100.64.0.1.22334: Flags [.], ack 1079, win 4762, length 0
21:13:45.056964 IP 100.64.0.1.22334 > 169.254.211.122.443: Flags [R], seq 1831619244, win 0, length 0
^C
53 packets captured
53 packets received by filter
0 packets dropped by kernel
┌────[root@srv: 2018-07-26 21:13:49 ~]
└─># 

И поисковик DockDuckGo в браузере - опять фсе работает, кстати через церочку прокси тоже будет работать😊 Если не работает, попробуйте другие адреса, к примеру http://zqktlwi4fecvo6ri.onion/wiki/index.php/Main_Page, Tor штука не совсем стабильная - бывает чтото конкретное не работает, бывает иногда совсем ниче не работает а надо просто подождать😊

Осталось дело за малым - поднять свой днс рекурсор, хотя впринципе это не обязательно, но система блокировки у провайдера может подменять днс ответы, а благодаря dnssec у нас есть шанс узнать об этом, и если он таки так делает то на этом же рекурсоре мы можем сделать форвардинг запросов на dns сервер tor, можно его и на прямую прописать - впринципе работать скорее всего будет, но с рекурсором как то больше возможностей для маневров, и вдобавок получим кеширование что несколько ускорит загрузку страниц в любом случае, а в случае форварда на tor сервер ускорит существенно ибо он нихрена не быстрый и вообще кривой😊 Да и вообще я всю жизнь так делаю😊

Comments on this page

2018-05-15 Blog

Нанотехнологии😊

Нано это ноу-хау великих мужей
С нано жить лучше, жить веселей
Нано это круто, поверьте, ребята
Нано это десять в минус девятой!
Нано мечты, воплощенные реальность.
Нано это шанс доказать свою лояльность
Без нано что будет? Коллапс и разруха,
А с нано улыбка от уха до уха,

И с нано, у причастных, сытое брюхо.

Comments on this page

2017-12-23 Web-Blog

Web-Blog

Вобщем после создания сего сайта который вы счас читаете, как это водица - одолели спам-боты, коментарии были открыты всем, и вот начали они мне туда "комментировать"😊

Вывод - привернуть регистрацию, а для этого нужна почта, причем на этой же машине где крутица движок сайта.

А ее то тут и нету, вообще, даже локальной, тоесть MTA отсутствует напрочь, а как то мыло для регистрации слать нада. Вобщем то движок при отсылке дергает sendmail как все остальные милионы движков, все стандартно. Поэтому нада чтото что могло бы выступать заменой sendmail'у. Выходы:

  1. поставить MTA и настроить форвардинг всей почты на почтовый сервер. как правило в составе любого MTA есть затычка аля sendmail.
  2. поискать чтото аля fetchmail наоборот, ну или какойнить совсем легкий MTA чтоп всю локальную почту форвардило через акаунт на почтовом сервере, тоесть по сути 1 хрен вариант 1 но только это будет уже не из пушки по воробьям как в случае полноценного MTA

И такие варианты нашлись, аж несколько. Начал смотреть и пробовать:

  1. esmtp отложил как last resort сразу - на страничке проэкта надпись THIS PROJECT IS NO LONGER BEING MAINTAINED.
  2. ssmtp завел, настроил, и exim на почтовом сервере мне сказал SMTP protocol synchronization error, это значит что ssmtp пытается слать команды до того как почтовый сервер выдаст ему приглашение, что в свою очередь значит что ssmtp херова следует стандартам и по сему я его забраковал после этого как поделие какованить очередного криворукого далбаеба, вдобавок он работает в синхронном режиме - тоесть ктото дернул там mail/sendmail, он тут же начинает слать в том же процессе, если не удачно ну чтож - обидно, досадно, но ладно - тоесть никакой очереди и ретраев у него нет. пока не отослал или не получил отлуп процесс блокируется, что опять таки намекает на криворуких далбаебов.
  3. nullmailer завелся не сразу, почемуто localhost в /etc/nullmailer/me ему не понравилось - выплевывал какуюто непонятную ошибку при попытке отправить что либо даже не доходя до smtp, тоесть выплевывал сам еще до того как поместить письмо в свою локальную очередь, хз почему, но после того как туда вписал домен от которого собираюсь слать все наладилось и заработало. Так же он имеет очередь, тоесть доставка асинхронна в отличии от варианта 2, и если сразу доставить не удалось будет пытаца потом сделать это снова.
  4. masqmail последняя версия от 2015 года, в генте вообще отсутствует - отмел так как вариант 3 задачу решает и присутствует в генте штатно, а именно она стоит на этом сервере.

Итак, выбор пал на nullmailer. Далее собсно более подробно о настройке nullmailer ибо она не тривиальна, а очень тривиальна😊 Всего 4 строчки(ну мне просто делать нех и я тут печатаю хрень всякую😊 Рас уж начал - нада дописать до конца😊

Итак, Nullmailer или fetchmail наоборот😊

Слать почту мы будем через акканут srv@megaprovider.ru на одноименном сервере - megaprovider.ru😊

Конфигурация находица в /etc/nullmailer

  • /etc/nullmailer/adminaddr - email адрес администратора, туда будет идти вся почта для рута итд, у меня тут - bottleman@megaprovider.ru
  • /etc/nullmailer/defaultdomain - домен по умолчанию - megaprovider.ru.
  • /etc/nullmailer/me - ? кто я? тут FQDN машины на которой работает nullmailer, или ip на худой конец если , им он будет представляца в EHLO и MAIL FROM в сессии к почтовому серверу, так что localhost с большой вероятностью не прокатит.
  • /etc/nullmailer/remotes - наверное единственное что в нем хоть какой то настройкой назвать можно😊 вообще не знаю зачем для него аж 4 файла конфигурации, все уместилось бы в 1😊 но есть как есть, итак, в remotes собсно описывается сервер на который отсылать почту.
megaprovider.ru smtp starttls insecure user=логин pass=пароль

и, все😊 Шлет, эмулирует при этом команду sendmail, так что все что заточено слать через нее будет работать и с nullmailer.

Единственное что я сначала напоролся на insecure - без него вякает на сертификат на сервере, но нифига не ясно на что именно, естественно возникла мысль что так как он там самоподписанный то может на него вякать, и методом тыка (добавлением insecure) это было подтверждено.

Comments on this page

2017-12-22 Networking-Blog

Blog

Беда не приходит одна - эпопея продолжается😊 Скоро переплюнем сантабарбару

После вот этого когда кризис вроде бы отступил, появилось время подумать😊

После осознания того, что с 4 прерываниями на карту удается задействовать только 8 ядре из 12 в голову закралась мысль что нада больше прерываний то😊 Три маршрутизатора справлялись, однако резерва то нет и при выходе из строя хотябы одного будет жопа.

Соответственно нада другие сетевые - купить - хуйвам сказала Танюха, фсе бабло ушло на водку и питарды ибо корпоратив завтра😊

И начались поиски подходящих сетевых путем разгребания всякого хлама ибо чтото гдето такое вроде как было, да и за почти 20 лет работы не могло такого быть чтоп чтото гдето не валялось подходящего, тока где... и вот они - 4 двухпортовых BCM5709 как скуста, часа через пол после начала поисков😊

Чувак там ночью проводил работы и заодно и их воткнул😊 Как итог - стало лучше, но, тоже не без косяков:

 
#тут у нас какаято блять брадкомовская магия - combined оно говорит что не умеет и при попытке дать шлет нахуй,
#при rx 6 tx 6 получается 6 прерываний в сумме, первое из которых не работает вообще - тоесть тупо не прерывается
#и не дает никакой нагрузки, при rx 6 tx 1 получется тоже 6 в сумме но при этом вроде бы нормально работающих.
#че ето за херня яхз но пока так.
#
# upd - нихуя не нормально работающих, первое почемуто всегда не догружено причем значительно, возможно это tx,
# хотя иногда оно всетаки дает нагрузку как то всплесками. судя по acct2  rx 6 tx 6 combined 6 дает ту же картину.
# нада блять будет попробовать 7+1, и опять ебаца как их распределить чтоп задействовать ядра полностью, правда че
# будет с теми всплесками зх.

#ethtool -L enp1s0f0 rx 6 tx 6 combined 6
ethtool -L enp1s0f0 rx 6 tx 1
#ethtool -L enp1s0f0 combined 6

#ethtool -L enp3s0f0 rx 6 tx 6 combined 6
ethtool -L enp3s0f0 rx 6 tx 1.
#ethtool -L enp3s0f0 combined 6

#ethtool -L enp1s0f1 rx 6 tx 6 combined 6
ethtool -L enp1s0f1 rx 6 tx 1.
#ethtool -L enp1s0f1 combined 6

#ethtool -L enp3s0f1 rx 6 tx 6 combined 6
ethtool -L enp3s0f1 rx 6 tx 1.
#ethtool -L enp3s0f1 combined 6

Это мой коментарий с куском скрипта разруливающего прерывания. тоесть теперь мы можем задействовать 10 ядер из 12 - прогресс как говорица на лицо😊

При этом по названию прерываний в /proc/interrupt tx от rx не отличить, ибо обзываются они просто eth-0/1/2/3 нуитд, примерно так:

acct1 ~ # cat /proc/interrupts |grep enp1s0f0 
 50:  446973042          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI 524288-edge      enp1s0f0-0
 51:         91  344667423          0          0          0          0          0          0          0          0          0          0   PCI-MSI 524289-edge      enp1s0f0-1
 52:         85          0  352724036          0          0          0          0          0          0          0          0          0   PCI-MSI 524290-edge      enp1s0f0-2
 53:         60          0          0  363097349          0          0          0          0          0          0          0          0   PCI-MSI 524291-edge      enp1s0f0-3
 54:        129          0          0          0  344874594          0          0          0          0          0          0          0   PCI-MSI 524292-edge      enp1s0f0-4
 74:         86          0          0          0          0  358027569          0          0          0          0          0          0   PCI-MSI 524293-edge      enp1s0f0-5
acct1 ~ # 

и кто из них кто хз, так же не понятно почему при tx 6 rx 6 их всего 6 когда по логике должно быть 12. Вобщем прерываюца эти бродкомы как то через жопу😊

При этом, BCM5720 вполне себе нормально все рисует и количество прерываний тоже сходица, как указали rx 4 tx 1 так и есть, 5 штук суммарно:

acct0 ~ # cat /proc/interrupts |grep enp1s0f0 
 50:  206892049          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI 524288-edge      enp1s0f0-tx-0
 51:          3  134202632          0          0          0          0          0          0          0          0          0          0   PCI-MSI 524289-edge      enp1s0f0-rx-1
 52:          2          0  130895851          0          0          0          0          0          0          0          0          0   PCI-MSI 524290-edge      enp1s0f0-rx-2
 53:          2          0          0  126258675          0          0          0          0          0          0          0          0   PCI-MSI 524291-edge      enp1s0f0-rx-3
 54:          2          0          0          0  132045015          0          0          0          0          0          0          0   PCI-MSI 524292-edge      enp1s0f0-rx-4
acct0 ~ # 

только у BCM5720 драйвер tg3 а у BCM5709 bnx2.

Однако это еще не все.

На Танюхино хуйвам, вечером в ЧНН один из маршрутизаторов сказал свое жесткое хуйвам всем нам, зависнув в час пик, после перезагрузки повторил это снова через пару минут, контрольный так сказать😊 В пятницу вечером, перед корпоративом - знает сцуко когда говорить😊

Оставшиеся 2, практически на пределе, но тянут нагрузку, rtt изредко дергается ms на 10-20, но потерь я пока не фиксирую, так что вроде все нормально с этим. А всего то задействовали 4 дополнительные очереди.

Учитывая что их таких 2 полностью идентичных, и до вчерашней замены сетевых проблем небыло приходит логичный вывод что одна из тех бродкомов полудохлая и проблемы из за нее.

Так что, продолжение следует😊

Comments on this page

2017-12-21 Networking-Blog

Blog

Продолжаем мультилогию про беды, которые судя по всему не то что по одной не приходят, а и по 2-3 тоже, валят пачками😊

Вобщем беда четвертая:

Итак, в свете вот этого берем мы "новый сервир" почему в кавычках? да потому что берем мы в срочном порядке что есть, а есть у нас супермикра 1u с двумя Xeon X5670 @ 2.93GHz, образца 2010 года... с двумя планками памяти по 8Гб.

То что памяти 16ГБ нам дофени - нату хватит, а вот то что она одноканальная при таком раскладе, вместо трехканальной нам уже совсем не до фени, ибо это роутер+NAT, этим двум задачам латентность и пропускная способность памяти критична наверное как никаким другим. и это опять полбеды.

Нам Нужно 5 интерфейсов 2 ввех 2 вниз и 1 для слива netflow и out of band управления.

Но это 1u, в котором есть 2 набортных интерфейса, впринципе подходящих под задачу, умеют до 8 очередей, и выставляют 6 без проблем.

В рейзер можно вставить еще 1 сетевую. засунули туда двухпортовый броадком NetXtreme II BCM5709, тоже умеющий до 8 очередей, и тоже походу последний😊

Итого 4 интерфейса...

И, netflow девать некуда😊 Есть рейзер в который можно воткнуть 2 сетевых, но он уже кудато воткнут и выключить это просто так нельзя, тоесть нада ждать темной ночи когда нагрузка минимальна, комуто оставаца, отключать, вытаскивать, включать, а у нас же горит уже😊

Ну хули делать, я его слепила из того что было, зато есть неплохие шансы потом написать как то что я слепила меня полюбило😊

Будем лить инбандом, теряя по дороге кал netflow и управление в случае каких нибудь проблем или перегрузок.

Типовая конфигурация соотвественно тоже попизде пошла, как у нас водица, этоже не интересно, 2 раза одной и той же дорогой ходить, а потом спустя время нам это аукнеца - тоже развлеченье хоть какое, ато не интересно же когда все работает😊

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

Попутно выяснил еще 1 прикол - наш netflow коллектор по дефолту способен принимать netflow с любой точки сети, не только нашей, а глобальной😊 Тоесть он открыт всему миру😊 ну а что, удобной - я вот начал лить инбандом - даже делать с ним ниче не пришлось😊

Comments on this page

2017-12-20 Networking-Blog

Беда как говорица не приходит одна

Вдобавок в вот этому узрел вдруг всплеск очереди на почтовом сервере, примерно вот такой:

megaprovider ~ # mailq|grep psv@icf.bofh.ru|wc -l
4667
megaprovider ~ #

А там консервный завод в сторону яхи хотмейлов итд.

Все оказалось просто, акаунт дохлый, чувак им не пользуется уже хер знает скока, и ктото решил проявить свою гениальность и влепить на акаунт пароль 12345, ведь никто же не подумает что в интернете могут быть дебилы с таким паролем😊 А наши любимые боты не дремлют, взяли и попробовали, и у них получилось😊

Но блять и это еще не все!!!

Пришла и третья беда, вечером позвонили и сообщили что на NAT'ах чтото все очень-очень плохо, softirq грузит процы в сотку.

Посмотрел - с части интерфейсов прерывания действительно ушатывают некоторые ядра, траффик вырос гдето в 3 раза с тех пор как их поставили. NAT тоже поменялся - привернули лимит трансляций per IP, и стали натить в пул адресов а не в 1, а это же все тоже не бесплатно в плане ресурсов CPU.

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

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

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

Начал смотреть что можно сделать прям сейчас, оказалось что softirq по цене нихрена не одинаков в случае NAT'а, он же в softirq обрабатывается. Входящие на NAT из вне пакеты требуют значительно больше ресурсов для обработки нежели приходящие со стороны серых подсетей.

Прерывания были размазаны поровну исходя из количества сетеух, очередей на них и количества процессоров. Тоесть там впринципе 4 нагруженных интерфейса в бондинге, 2 ввех 2 вниз, и 12 процов, соответственно по 3 irq на интерфейс. Такая схема хорошо работает на чисто маршрутизаторах, там прерывания равноценны. Но не при наличии NAT'а. Некоторые из прерываний с интерфейсов смотрящих вверх грузили свои CPU в полку.

Так же понятно то что как бы чем меньше очередей на интерфейсе тем больший траффик в каждую конкретную очередь влетит, тем больше нада ресурсов чтоп отработать прерывание от этой очереди. Ну и размазываца траффик по ним он будет менее равномерно скорее всего.

Так и получалось - 1 очередь перегружена, 2 других сильно не догружены.

Но чтото сделать с этим нада же

Решил увеличить количество irq и очередей соответственно тоже, но оказалось что BCM5720 больше 4 не умеют, до этого выставлено было 3, но тем не менее полегчало, процентов на 20-30.

Но тоже не без факапа - сервер наебнулся при изменении количества очередей на лету, ну точнее не то чтоп наебнулся совсем, драйвер выдал какой то splat экрана на 4 частично в хексе, после чего линки на интерфейсах начали то падать то поднимаца, видимо под нагрузкой чтото у него там не срослось. Рассматривать мне его было некогда поэтому выход 1 - перезагрузка.

Перегрузил, второй NAT сервир как то пережил нагрузку с дикими тормозами пока первый не загрузица, на втором ситуация повторилась, пришлось тоже перегрузить.

Ну и как итог - сегодня будем готовить третий, иначе говоря как всегда - пока не наебнеца хуй кто зашевелица, несмотря на то что инженер потом позвонил сказал что знал что оно не справляется уже давно.

Comments on this page

2017-12-19 Networking-Blog

Хакнули комутатор cisco

Все почемуто относяца ко всяким комутаторам и маршрутизаторам как к железке, которая типа целиком вся в железе и софта там нет, и поэтому она не ломаеца иначе как физически, и вообще не поколебима и нерушима😊 Только вот это нихрена не так, везде есть софт, и даже в железе тоже есть ошибки допущенные при проэктировании.

Ну чтож, вот и нас петя клюнул в одно место, пока правда не сильно больно😊 Так - фигня - на полшишечки😊

Древнючий Cisco catalyst C3550:

srv-core-gw uptime is 17 weeks, 4 days, 8 hours, 43 minutes
System returned to ROM by power-on
System restarted at 04:35:49 GMT Fri Aug 18 2017
System image file is "flash:/c3550-ipservicesk9-mz.122-44.SE6/c3550-ipservicesk9-mz.122-44.SE6.bin"

srv-core-gw#who
    Line       User       Host(s)              Idle       Location
   1 vty 0                idle                    17w2d 201.172.42.43
   2 vty 1                idle                 13:03:24 10.32.75.177
   3 vty 2                idle                 01:16:16 10.32.75.177
   4 vty 3                idle                     4w1d 184.6.246.208
   5 vty 4                idle                 13:02:52 10.32.75.177
*  6 vty 5                idle                 00:00:00 10.32.75.177

  Interface      User        Mode                     Idle     Peer Address

srv-core-gw#

вобщем все что не 10.32.75.177 это не наши😊

при этом:

ip access-list standard TELNET-ACCESS
 permit xxx.xxx.xxx.xxx 0.0.0.31
 permit 10.32.75.176 0.0.0.15
!

line vty 0 4
 password 7 абракадабра
 login
 transport input telnet
line vty 5 15
 access-class TELNET-ACCESS in
 password 7 издесьабракадабра
 login
 transport input telnet
!

Тоесть ктото попросту проебал АКЛ на line vty, и так он работает почти с самого старта, аптайм 17 weeks, 4 days, у 201.172.42.43 idle 17 недель 2 дня😊 Чего быть не может с дефолтным таймаутом, Ну или же ios откудато украли сразу со встроенным трояном😊 Или просто какаято уязвимость, и ACL может быть вообще ни причем, этого мы уже наверное никогда не узнаем.

На работе это никак не сказывается, комутирует, маршрутизирует, поэтому всем похуй на это судя по всему, никто бы вообще не заметил никогда не полезь я туда его перенастраивать.

Ну или можно предположить что пароль ушол, но тут возникает ряд других вопросов:

  1. каму мы нах нужны?
  2. почему ничего не сделали?

В sh log тоже ниче подозрительного, хотя все комманды логгируюца, что опять таки намекает на какой то бэкдор/троян.

В ручную при таком раскладе никто не будет ебаца с каким то отдельно утекшим паролем и единичным комутатором. При единичном целенаправленном взломе всегда есть мотив, заработать/спиздить/насолить итд, иначе он не возможен, потому что как правило это дорого обходица, поэтому еслип ктото из окружения/сотрудников/бывших преследовал бы одну из подобных целей то навероное он бы ее уже давно достиг и это не осталось бы незамеченным.

При автоматизировнных взломах напротив - цели вывести из строя то что взломали нет, есть цель использовать то что взломали в своих целях в том числе - чаще всего для построения ботнета - взломанная единица присоединяеца к остальному милиону ботов и делает что им скажут, при этом взломанная единица в идеале выполняет свои основные функции как ни в чем не бывало, ведь иначе когда чтото перестанет работать это обязательно заметят, даже если троян будет всячески маскировать свое присутствие (отказ коммутатора коммутировать не замаскируеш😊 и примут меры, а так всем хорошо - и хакерам и лохам которых поимели😊

Поэтому скорее всего это автоматизированный взлом, просто куча роботов автоматом ищет уязвимые железки (и циско не исключение в их длиннющем спике) и хакает дабы потом использовать для рассылки спама или еще чего либо на чем можно заработать. Так же как и с ssh на серверах.

Хотя с другой строны хз на что может быть способен бекдор на комутаторе, анализировать траффик на самом комутаторе не выйдет, этож древняя циска, и там процессор чуть мощьнее чем в калькуляторе ситизен, но зато там есть средства типа PBR которые работают тупо в железе и поэтому на wire speed, и вот ими уже возможно, можно к примеру выделить нужный траффик и развернуть его куда нада и там уже анализировать чем нить мощьным, и к примеру таким образом воровать акаунты/пароли/кредитки и прочую дрочь юзеров и админов, чей траффик через него ходит и на него.

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

Так что, не проебывайте аклы, и сверяйте crc с кошкодомом когда вливаете краденный иос😊 Следите за обновлениями и секюрити фиксами. И даже это на 100% ничего не гарантирует.

Comments on this page

2017-12-13 Web-Blog

Blog

Динамическая генерация robots.txt и sitemap.xml для мультидоменных сайтов

Вобщем в свете предыдущего поста я продолжил причесывать свой новый сайт, а учитывая что это вики то тут вполный рост встает вопрос с поисковиками и robots.txt, и вот почему:

Этож wikiблять!!! тут у каждой страницы хуеватьма ревизий, и ссылки на каждую из них, куча перекресных ссылок итд, тоесть невьебенная такая куча мала как из миксера и все это индексируется поисковиками. Да я ебал как они в этом всем разбираюца😊 но тем не менее стараюца, но, не всегда правильно, поэтому лучше помочь, и вики помогают, говорят nofollow в meta там где индексировать не нада, но лучше помочь еще вдобавок - дав пинка в нужном направлении, тоесть запретив в robots.txt индексацию того что им не нада, дабы они не тратили лишнее время лазя по nofollow линкам, впринципе тут все просто.

Но блять я случайно пока ковырял модули вики набрел на один из них, точнее два, герерирующих sitemap, мне стало интересно что ето такое и я прочитал - оказывается еще один новомодный инструмент воздействия на роботов, ну и я решил - а чеп не заюзать и его до кучи - хуже то не будет... КАК Я БЛЯТЬ ОШИБАЛСЯ!!! 😊

но все по порядку - я радостно докинул модуль в вики - проверил генерит ли она етот sitemap - генерит, и, уже замахнулся вписать его в robots.txt но по не знанию как это сделать - обратился к документации, а там блять написано что относительную сцылку низзя нихуя - тока полную с именем домена, а у меня хуеватьма доменов и поддоменов - вот такой вот неожиданный ебаныйврот. кто эту хуйню придумал и зачем бошку ампутировать нада, нах она ему.

Но, тем не менее взялся так взялся - нада сделать же, ну выход очевиден - генерировать robots.txt динамически при запросе и подставлять там нужный домен - гавновапрос!!!

Сказано - Зделано:

#!/usr/bin/perl.
$| = 1;.

$server_name=$ENV{'SERVER_NAME'} || "megaprovider.ru";
$req_scheme=$ENV{'REQUEST_SCHEME'} || "http";

print "Content-type: text/plain\n\n";
print "Sitemap: $req_scheme://$server_name/sitemap.xml\n\n";
print <<'EOF';
User-agent: *.
Disallow: /?action=admin
Disallow: /?action=edit
Disallow: /?action=new
Disallow: /?action=history
Disallow: /?action=browse;diff=
Disallow: /?action=rc
Disallow: /?action=rss
Disallow: /?search=
Disallow: /?RecentChanges
Disallow: /?Comments_on_
Disallow: /?action=password
Disallow: /?search=
Crawl-delay: 1
EOF

условие по поводу servername на случай если вдруг кто придет сильно кривой и/или по http 1.0 без host хедера и тогда SERVER_NAME может быть не известно, но лучше туда всетаки выплюнуть чтото вменяемое чем http:///sitemap.xml, поэтому если SERVER_NAME пустое то подставляем туда один из доменов.

У меня Nginx, как этот скрипт к нему привернуть здесь почтишто в самом конце, к другим серверами готовых решений у меня нет но думаю у большинства должен быть какой то путь сделать аналогично.

Вобщем влепил я скрипт, проверил - работает - заебись, сижу смотрю че там поисковики творят, запрашивают ли мой sitemap али нет...

А творят они там хуйню 😊

Гугл и яндекс запросили, и скачали, остальные кравлеры и спайдеры воздержались и не запрашивали его, а дальше началась хуйня:

Хуйня с яндексом:

по какой то причине, хуяндекс начал запрашивать урлы каких ваще быть не может но шаблонно совпадающих с теми что есть, тоесть к примеру вот эта страница имеет адрес megaprovider.ru/?2017-12-13_Web-Blog, хуяндекс же запрашивал megaprovider.ru/0/?2017-12-13_Web-Blog, и так через рас иногда через 2, потом тоже самое но правильно, ну и тд.

Ну я поржал - яндек хуяндекс - даже бота нормально своего написать не могут😊 Но тут спустя гдето сутки гугол начал делать так же!!! А я поперхнулся и перестал ржать, что меня несколько огорчило нада сказать.

это меня озадачило - я начал капать глубже и все проверять, натравил несколько валидаторов, в том числе и самого яндекса - все сказали все заебись у тебя с sitemap и robots.txt, я в непонятках ваще, перерыл всю хуню котороую авторы этого sitemap гордо именуют стандартом - нихуя не нашол, даже зацепки никакой, в гугле тоже тишина - ниче подобного ниукого небыло, я блять уже все проверил, и кодировку, и файл, ПОБАЙТНО в хекс редакторе прочитал на соотвествие кодироке, а там блять UTF!!! ну хедер в хмлине немного староват был - поправил, вобщем БЛЯТЬ!!! - ВСЕ НИШТЯК и все по фэншую, тоесть по этому говностандарту. У меня схема frontend->backend из двух серверов - уже на какой то чудесный глюк в них начал думать, но, вовремя попробовал убрать этот sitemap - и все стало заебись через день-два, перестали они лазать по таким ссылкам.

Ну что за ебаныйврот?

Думал думал, положил хуй на это стандарт, зарылся в гугель - и не нашол нигде упоминания чтоп у кого то было нечто подобное зато нашол тьму страшилок типа низзя его класть не вкорень ато все что выше каюк - не проиндексируется или sitemap не заюзается, на другой домен тоже низзя ну итд, но ниче по делу- ваще тупик!!! И тут я начал искать другое - ну не могуж я блять быть первый кто генерит sitemap динамически и не в файл на диске а сразу по запросу выплевывая в клиента - ну да - дохуя всяких плагинов ко всяким вордпрессам и прочей хрени, генерят динамически так же и robots.txt и sitemap и все хуйню, но вот что характерно - нигде я не нашол чтоп ссылка на sitemap была типа динамической, У всег или сразу генерируется по запросу /sitemap.xml или какойнить реврайт чтоп при запросе sitemap.xml по факту запрос шол куда нада. А у меня она вида site/?action=sitemap, ну я ее так и отдавал в robots.txt, и думаю - ну неужели в этом херня - извратился и переделал - чтоп была доступна сразу по site/sitemap.xml.

И блять хуйня прошла кажись

Маловато еще времени прошло но вроде гугл с яндексом угомонились с этими кривыми ссылками, сижу жду дальше чтоп уж наверняка😊 И главное ведь не написано нигде.

Так что люди - не ставьте динамические ссылки на sitemap.xml.

  1. upd: mail.ru начал забирать sitemap чего раньше не делал.

Comments on this page

2017-12-09

Современное сайтостроение или как я блять себе CMS выбирал😊

Предисловие и предыстория

Сайтеков у меня было много, почему было? Потому что с периодическими поломками серверов за 20 лет и соответственно переездами на другие чтото гдето терялось, чтото забывалось переносица, на чтото просто забивалось, в итоге получилась тьма заглушек и нихрена полезного. Поэтому в мозге последние лет 7-10 была мысля - что нада завести какуюнить CMC, которая мне бы нравилась, ато попыток было много, а толку мало, потому что чтото постоянно не нравилось или приходило непотребное состояние как форк движка debian-administration.org который досих пор торчит на tula.bofh.ru но обновить его не рельно, как и чтото оттуда выдернуть и перенести, работает на убой вобщем😊

И вот чтото просидев ночь обновляя софт на почтовом сервире и как следствие проспав на работу (но зато хоть выспался) и обнаружив пятницу в 22 с чем то часа решил опять провентилировать сей вопрос😊

Так что же мне нравица?

  1. - perl
  2. - никаких баз данных.
  3. - чтоп работал на nginx/lighttpd.
  4. - желательно попроще.

и вот почему:

Почему perl?

Perl потому что пхп нахуй😊 ну вот блять скока там дыр? сколько изменений не совместимых взад? и сколько дебилов на нем пишут из за низкого порога вхождения? сколько лет эта дрочь написанная этими дебилами проработает прежде чем ее сломают? сколько лет эта дрочь написанная этими дебилами проработает прежде чем выйдет версия интерпретатора XXX написанная другими дебилами в которой уберут нужную моей CMS фичу X по причине какой нить там концептуальной дырки или заменят на фичу Y потому что она типа круче и моя CMS опять отвалица? Корпоративный сцайт наш с каждым обновлением дебиана на новый стабл наебываеца, нахуй мне такое счастье, у меня все наебываца и без этого.

питоны-хуены туда же куда и пых, сами написали и сами же теперь с двойки никак соскочить не могут хотя уже 3.6 на дворе, да и табуляция, какой дебил придумал я хуйзнает.

че еще остаеца? руби,хуюби да хер ево знает че ето ваще, и че с ними будет через 5-10 лет? Ктому же на одном из моих сцайтов у меня была вика на перле, и заебись работала, пока блять не вышел второй апачь в котором mod_perl не перепахали так что сходу завести ее я там не осилил, но осилил потом, но сцуко было уже поздно - все заглохло.

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

А еще я сам пишу на перле, и тоже все работает десятки лет, без всякий ой интерпретатор обновился фсе сломалось.

поэтому perl, написанное на нем работает дестилетиями на автопилоте вообще и похер на обновления - не помню чтоп ченить сломалось хоть рас.

Дальше базы данных.

Ну какие блять нахуй скуэли для моего сраного сайта? яж блять не ебаныйгугол, амазон там какойнить или алиэкспресс на худой конец. между тем:

megaprovider ~ # equery s dev-db/mariadb
 * dev-db/mariadb-10.1.26-r1
         Total files : 395
         Total size  : 70.17 MiB
megaprovider ~ #

и это блять только ебаный клиент!!! нихуя не сервер, 70 мегабайт!!! карл!!!

db2 ~ # equery s dev-db/mariadb
 * dev-db/mariadb-10.1.26
         Total files : 744
         Total size  : 158.46 MiB
db2 ~ # 

а вот это блять СЕРВИР!!!

я как вспомню в молодости фокспро на комбайновом заводе на трешке с парой мегабайт памяти обслуживающей ВЕСЬ ЕТОТ ЕБАНЫЙ ЗАВОД так ме хуева становица. и нахуй это все? чтоп сгенерить страничку в сотню килобайт? да я ебал!!! поэтому никаких баз данных.

чтоп работал на nginx/lighttpd

Ну, апачь эта сука монстр, большой и не поворотливый, типа как sql, тока апачь😊 зато все может😊 тока накой мне все это? мне нужны простейшие вещи - fastcgi и выплюнуть ответ от него, но сцуко быстро-много, а монстры так не могут поэтому nginx/lighttpd. Ну и плюс вообще - при таких блять размерах кодовых баз типа апача там или mysql/mariadb ошиок там естестевнно тоже дохера, так что чем проще тем надежней.

желательно попроще.

Ну тоесть безовсякого там гавна типа жабаскриптов и прочей дрочи на нем написанной типа jquery/руби на рельсах и прочей хуеты чтоп небыло опять мучительно больно когда здоровенные куски гавна называемые браузерами вдруг обновились и чтото там в js нахуй отвалилось, и хуйваще разбереш че потому что там ваще постоянно чтото в отвале и это нормальная блять работа считается, типа < милиона ворнингов в секунду значит все заебись, или блять в хроме меньше милиона ворнингов в секунду - значит все заебись а в ff как хотищ так и ебись, или наоборот - похер с какой стороны на яйца смореть.

Ну и

Обдумав все это, секунды за 0.03, вбил я в гугол 'CMS perl' и нашол какой то сцайт, с невьебенным списком, CMS, и там было в том числе на чем они написаны, к моему удивлению там даже была сортировка по начем написаны - отсортировал по начем написаны😊 И осталось их сцуко две из всего этого невьебенного списка: webgui и twiki, и начал я их смотреть😊

webgui

Сразу насторожило что готовых примеров конфигов для nginx нет, гугол выдает тока nginx в качестве фронтэнда перед апачем на котором ета webgui пашет, к lighttpd есно тоже нихрена. по ссылке source install на их сайте 404😊 Зато блять куча надписей в стиле Rich User Interface, Powerful API, Personalization, Easy To Install, изи то поверфул ето, в даунлоаде есть блять образ вмвари с етой херней - ваще ахуеть, внатуре ДАУНлоад😊 на этом фоне мое нытье по поводу размера sql клиента ваще ничто😊 В итоге зато нашлась у них онлайн дема, зашол туда, и ахуел от админского интерфейса - милион пунктиков в меню которые хер знает че означают, по етой херне нада курсы открывать как ею пользоваца, многолетние.

вобщем вердикт - нахуй.

twiki

Вроде бы вообще все красиво если почитать - на перле, вместо базы стандартная RCS (Revision Control System), нашолся пример как ее запустить под lighttpd, потыкавшись завел и под nginx, и тут - опять хрен поймеш, настолько запутанный интерфейс что не понятно что куда и для чего ваще нужно и как вообще оно работать должно, показывает херню какуюто дефолтную и что с этим делать не ясно, вдобавок нарвался на глюки с регистрацией юзверей, пропадало поле ввода пароля при смене кодировки в настройках, вобщем пока я экспериментировал нечаянно посмотрел на размер архива - сука 20 мегабайт!!! 20 мегабайт Карл!!! проебался с нею часа 4 наверное зря тока.

вердикт - ну ие нах.

И чтож блять делать?

Вспомнил тот самый аквариумный компьютер - там же какаято вики стояла - ну думал - нада попробовать ее допилить, а как называется забыл, пошол искать, долго рылся во всяком хламе коего у меня самосвал, и на работе еще 4, но нашол, дернул оттуда флешку, подмонтировал, и обнаружил что это некая хрень с названием cwiki.pl😊 1 файл, ВСЕГО 1 Карл, размером 176294 байт, никакой базы, все в текстовых файлах, но конечно малость примитивно по своим возможностям но что поделать, внутри в хедере обнаружилось следующее:

# cwick version cassiopeia (25 September, 2003)
# Copyright (c) 2003 Lee Jenkins
# includes features by Rudi Bruchez
# Based on UseModWiki version 0.92 (April 21, 2001)
# Copyright (C) 2000-2001 Clifford A. Adams
#    <caadams@frontiernet.net> or <usemod@usemod.com>
# Based on the GPLed AtisWiki 0.3  (C) 1998 Markus Denker
#    <marcus@ira.uka.de>
# ...which was based on
#    the LGPLed CVWiki CVS-patches (C) 1997 Peter Merel
#    and The Original WikiWikiWeb  (C) Ward Cunningham
#        <ward@c2.com> (code reused with permission)
# Email and ThinLine options by Jim Mahoney <mahoney@marlboro.edu>

2003 год😊 базируется на какой то UseModWiki, которая судя по всему в свою очередь базируется на движке WikiWikiWeb - прародительнице концепции вики как таковой. Вбил в гугол, и неожиданно нашол ее описание в википедии, что обрадовало - не хухрымухры😊 Там же нашолся линк и на ее сцайт где неожиданно обнаружилось что оно сцуко живое и развивается😊 Радости моей небыло пределу😊 вот оно, счастие то😊

Гит клонирован, nginx есть, lighttpd есть, вбил в гугол конфиг от них, и гдето случайно набрел на толи форк толи ответвление какое хз, зовется oddmuse.org. В отличии от usemod есть куча расширений модулями и поддержка utf-8 которая хромает в usemod. Туь уровень моей счастливости многократно увеличился, хоть utf я ваще не люблю - нахуй он нужен, но рас есть пусть будет, и я переключился на колупание этой oddmuse.

Дальше впринципе дело техники - кое какие корявые примеры конфигов есть как для nginx так и для lighttpd, у меня nginx по дефолту - кое как удалось взлететь со всем этим минут за 15 чтоп хоть посмотреть в живую и потыкать, а там отшлифуеца. Очень понравились модули - просто тупо копируеш в директорию и она сама их цепляет. И их там кстати овер 200 штук. Так же более-менее все сразу понятно как с этим работать и что для чего. и никаких блять сотен мегобайт, баз, перделок, свистелок и прочей хуеты.

Конфигурация nginx на данный момент:

        server {
                listen 10.32.75.177;
                server_name srv;
                root /var/www/localhost;
                index /cgi-bin/index.pl;
#               fastcgi_index /cgi-bin/index.pl;
                access_log /var/log/nginx/srv.access_log main;
                error_log /var/log/nginx/srv.error_log info;

                location = /favicon.ico {
                    return 204;
                    access_log     off;
                    log_not_found  off;
                }
                
                location = /ad_replace/null.gif {
                    empty_gif;
                }
                
                location /static/ {
                    root /var/www/localhost/htdocs;
                }
                
                location /htdocs/data/ {
                    access_log off;
                    deny all;
                }
                
                location ~ ^/cgi-bin/index.pl {
                    #gzip           off;
                    root           /var/www/localhost;
                    fastcgi_pass   unix:/run/fcgiwrap-wiki.sock-1;
                    fastcgi_keep_conn on;
                    include        fastcgi_params;
                    fastcgi_param  QUERY_STRING       $query_string;
                    fastcgi_param  REQUEST_METHOD     $request_method;
                    fastcgi_param  CONTENT_TYPE       $content_type;
                    fastcgi_param  CONTENT_LENGTH     $content_length;

                    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
                    fastcgi_param  REQUEST_URI        $request_uri;
                    fastcgi_param  DOCUMENT_URI       $document_uri;
                    fastcgi_param  DOCUMENT_ROOT      $document_root;
                    fastcgi_param  SERVER_PROTOCOL    $server_protocol;

                    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
                    fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

                    fastcgi_param  REMOTE_ADDR        $remote_addr;
                    fastcgi_param  REMOTE_PORT        $remote_port;
                    fastcgi_param  SERVER_ADDR        $server_addr;
                    fastcgi_param  SERVER_PORT        $server_port;
                    # According to RFC3875 (https://tools.ietf.org/html/rfc3875#section-4.1.14) in SERVER_NAME
                    # we should put actual hostname user came to. For nginx it is in $host
                    # This will allow to run multihost instances
                    fastcgi_param  SERVER_NAME        $host;
                }
        }

Частично накопипасшена с просторов интернету и потому кривовато но пока надоело с ним ковыряца - с самой вики интереснее, 200 модулей как никак😊 В конфиге самой вики нада выставить $UsePathInfo = 0; иначе с такой конфигурацией не заработает. Сама вика лежит в /var/www/localhost/cgi-bin/index.pl, запускается через fcgiwrap. Данные пишет в /var/www/localhost/htdocs/data/, конфиг ее там же, в static статика, лого там, css ну итд.

вобщем вердикт - У меня появился очередной сайтег, и Вы на него смотрите😊

Посмотрим сколько проживет😊

Comments on this page