From 47f22031c8ac43a395c1c1587ba14906c8b3115f Mon Sep 17 00:00:00 2001 From: postscriptum Date: Sun, 22 Mar 2026 05:53:38 +0200 Subject: [PATCH] add `psocks-my-vision-of-filtering-out-proxy.gmi` --- ...st-experience-with-tun2proxy-socks-hub.gmi | 3 +- public/uk/index.gmi | 1 + public/uk/my-public-pac-files-asset.gmi | 5 ++- ...socks-my-vision-of-filtering-out-proxy.gmi | 31 ++++++++++++++++++ .../psocks-totals-json-api.png | Bin 0 -> 22394 bytes 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 public/uk/psocks-my-vision-of-filtering-out-proxy.gmi create mode 100644 public/uk/psocks-my-vision-of-filtering-out-proxy/psocks-totals-json-api.png diff --git a/public/uk/first-experience-with-tun2proxy-socks-hub.gmi b/public/uk/first-experience-with-tun2proxy-socks-hub.gmi index a846c0b..271aabf 100644 --- a/public/uk/first-experience-with-tun2proxy-socks-hub.gmi +++ b/public/uk/first-experience-with-tun2proxy-socks-hub.gmi @@ -16,4 +16,5 @@ UPD. згодом знайшов приклад проксі SOCKS5 зі ~160 р На базі цього крейту, можна легко зробити свою реалізацію - думаю докинути якийсь веб-інтерфейс (наприклад, Rocket) щоб додавати нові домени прямо в пам'ять, без ребуту сервера а також виводити там статистику. -UPD2. вже почав робити свою реалізацію (codeberg.org/postscriptum/psocks) щоправда якість коду як і мій настрій. \ No newline at end of file +UPD2. вже почав робити свою реалізацію: +=> psocks-my-vision-of-filtering-out-proxy.gmi psocks: моє бачення фільтруючого проксі \ No newline at end of file diff --git a/public/uk/index.gmi b/public/uk/index.gmi index c4f168e..d31e305 100644 --- a/public/uk/index.gmi +++ b/public/uk/index.gmi @@ -16,6 +16,7 @@ ### Нотатки +=> psocks-my-vision-of-filtering-out-proxy.gmi 2026-03-22 psocks: моє бачення фільтруючого проксі => first-experience-with-tun2proxy-socks-hub.gmi 2026-03-21 ШІт досвід з tun2proxy/socks-hub => my-public-pac-files-asset.gmi 2026-03-21 Зробив собі "білий список" засобами PAC => ytsub-tui-alternative-to-freetube.gmi 2026-03-20 ytsub: TUI-альтернатива FreeTube diff --git a/public/uk/my-public-pac-files-asset.gmi b/public/uk/my-public-pac-files-asset.gmi index 25e8671..9846abd 100644 --- a/public/uk/my-public-pac-files-asset.gmi +++ b/public/uk/my-public-pac-files-asset.gmi @@ -7,4 +7,7 @@ Чого я пишу, бо хотів поділитись своїм набором PAC: => https://codeberg.org/postscriptum/pac -Виклав в паблік бо хочу мати можливість забирати його з будь якого місця з будь якого компа. Сайтів по білому списку не так багато, бо ніде не шастаю. А як згадаю, то доповню. \ No newline at end of file +Виклав в паблік бо хочу мати можливість забирати його з будь якого місця з будь якого компа. Сайтів по білому списку не так багато, бо ніде не шастаю. А як згадаю, то доповню. + +UPD. Згодом таки зібрався мотивацією і зробив програмне рішення на базі SOCKS5: +=> psocks-my-vision-of-filtering-out-proxy.gmi psocks: моє бачення фільтруючого проксі \ No newline at end of file diff --git a/public/uk/psocks-my-vision-of-filtering-out-proxy.gmi b/public/uk/psocks-my-vision-of-filtering-out-proxy.gmi new file mode 100644 index 0000000..c783eb2 --- /dev/null +++ b/public/uk/psocks-my-vision-of-filtering-out-proxy.gmi @@ -0,0 +1,31 @@ +# psocks: моє бачення фільтруючого проксі + +Після невеличкої передісторії + +=> first-experience-with-tun2proxy-socks-hub.gmi ШІт досвід з tun2proxy/socks-hub +=> my-public-pac-files-asset.gmi Зробив собі "білий список" засобами PAC +=> crab-hole-as-pi-hole-alternative-in-rust.gmi Crab-hole DNS як 100% програмна альтернатива Pi-hole +=> pi-hole-manual-install-on-fedora-linux.gmi Ручне встановлення Pi-hole DNS на прикладі Fedora / Linux +=> rust-crates-mirroring-with-kellnr.gmi Організація локального дзеркала залежностей Cargo з Kellnr + +в пошуках рішення для блокування паразитних конектів що палять мою приватність і їдять батарею SSH тунелюванням того сміття, погравшись день-другий з білими списками PAC, виявив для себе юзабельність такої концепції: сайти реально працюють. + +Наприклад, для Youtube - достатньо додати 2 технічні домени `.ytimg.com` і `.googlevideo.com` а для Github - лише `.githubusercontent.com`. Тобто Веб цілком можна сьорфити, враховуючи, що 99% трафіку не полишає соціальні мережі та платформи типу Stackoverflow, да і то, я останнім часом не вилажу з Duck.ai. + +Коротше вирішив таки заморочитись і зробити собі софтинку саме під свої задачі: тупо локальний проксі SOCKS, з файлами білих списків. Ніяких більше там складних синтаксисів налаштування - для них я піду на перевірений privoxy з ACL. Чому я ще вирішив написати велосипед, бо ніде не бачу чогось схожого до pi-hole, щоб можна було смакувати фільтровану статистику і робити на її основі висновки. + +За одно, я вирішив зробити засобами JSON/API й можливість оновлювати списки "на льоту" без ребуту серверу проксі і перезавантаження реєстрів. Тут головне дійсно мати можливість швиденько розблокувати собі потрібний ресурс прямо в браузері. А статистика вже як бонус, зараз там не густо: + +=> psocks-my-vision-of-filtering-out-proxy/psocks-totals-json-api.png Вигляд головної сторінки JSON/API (скріншот) + +Згодом планую розширити до звіту по доменам, хоча не знаю чи продуктивність сервера того варта... + +* я ще спочатку хотів зробити саме HTTP проксі з рандомайзером заголовків, але провтикав специфіку тунелювання HTTPs, тому протокол обрано саме SOCKS5. +* будувати ланцюги проксі засобами цього сервера я не планую, натомість буду пускати окремими процесами, а коли мені знадобляться складні правила, використовуватиму сторонні маршрутні проксі типу proxychains або знову таки, PAC файл. +* за якість коду не ручаюсь, бо працював швидко, щоб отримати результат; я поки не дуже орієнтуюсь в `tokio` і асинхронному програмуванні зокрема, але у якості бази було використано офіційний приклад (github.com/dizda/fast-socks5/blob/master/examples/server.rs) - з прикладу я не випилював імплементацію UDP, бо ще не визначився. + +І так, над назвою довго не думав, знайомтесь: +=> https://codeberg.org/postscriptum/psocks + +Також, списки для нього: +=> https://codeberg.org/postscriptum/psocks-list \ No newline at end of file diff --git a/public/uk/psocks-my-vision-of-filtering-out-proxy/psocks-totals-json-api.png b/public/uk/psocks-my-vision-of-filtering-out-proxy/psocks-totals-json-api.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1073c6a28530a4db3fb5f869b1687c95861484 GIT binary patch literal 22394 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 literal 0 HcmV?d00001