базар-квазар
Подключение Riseup VPN в Windows XP

Приходится кое-где сидеть на старой машине с XP (хорошо, не с 2000), а безопасно посидеть в интернете хочется. Так что от склероза, и мало ли кому надо будет. Аналогичным образом можно подключить на XP и VPN от calyx.net
1. Необходимо установить OpenVPN для Windows XP:
Скачать с официального сайта:
— Версия x86 (32-разрядная)
— Версия x64 (64-разрядная)
Копии, на случай, если с официального сайта пропадет:
— Версия x86 (32-разрядная)
— Версия x64 (64-разрядная)
2. Далее, качаем конфиги:
Для Riseup:
— C Mega.nz
— C Google.Drive
Для Calyx:
— C Mega.nz
— C Google.Drive
3. Конфиги необходимо распаковать в каталог для файлов конфигурации OpenVPN (C:\Program Files\OpenVPN\config
)
Получение ключей для VPN сделано обычным BAT-файлом, без проверок fingerprint’а сертификата провайдера, а в wget
, которым все и выкачивается, указан ключ --no-check-certificate
, так что все это дело не сильно секурно.
1. Скачиваем архив с GitHub
На всякий случай копия на Google.Drive и Mega.nz
2. Распаковываем архив в отдельный каталог, пусть будет C:\GetKeys
3. Запускаем командную строку (Пуск —> Выполнить и вводим cmd
)
4. Переходим в каталог:
С:
cd \GetKeys
5. Запускаем получение ключей.
Для Riseup:
getkeys.bat riseup.net
Для Calyx, соответственно:
getkeys.bat calyx.net
После того, как батник отработает, в C:\GetKeys
образуется подкаталог data
с подкаталогами провайдеров. Из C:\GetKeys\data\riseup.net
надо скопировать в C:\Program Files\OpenVPN\config
файлы cacert.pem
и openvpn.pem
для Riseup VPN, а для Calyx из C:\GetKeys\data\calyx.net
те же файлы, переименовав их, соответственно как cacert_calyx.pem
и openvpn_calyx.pem
. Или можете отредактировать конфиг calyx-net.ovpn
и задать там любые желательные имена.
Теперь можно запускать OpenVPN GUI, выбирать, щелкнув по иконке в трее, нужный конфиг, и соединяться.
До соединения:
Riseup:
Получение ключей и сертификатов для Riseup VPN и calyx.net в Windows.

Без использования клиента Riseup или Bitmask для Calyx.
Наскриптил тут утилитку, которая выкачивает ключи для Riseup VPN копия, а заодно уж и для calyx копия под Windows. Изначально писалось для XP, т.к. оказалось, что официальный клиент Riseup в XP не работает, а Calyx вообще использует Bitmask, которого для винды не предвидится.
Моя утилита тоже, как оказалось, не всегда работает в XP, но для XP я таки придумал, как выгрузить ключи и подключиться к Riseup, но об этом в другой раз.
Так что получилась такая утилита, чтобы подключаться к Riseup и Calyx не качая официального клиента. Пусть уж будет.
1. Ставим OpenVPN
2. Качаем виндоконфиги:
Для Riseup:
— C Mega.nz
— C Google.Drive
Для Calyx:
— C Mega.nz
— C Google.Drive
3. Распаковываем конфиги в каталог конфигов OpenVPN (Обычно C:\Users\<имя_пользователя>\OpenVPN\config\
).
4. Качаем утилиту отсюда и распаковываем в отдельный каталог. Она портабельная, никакой установки не надо.
5. Запускаем.
6. Выбираем в выпадающем списке провайдера.
7. Жмем на кнопку «Получить ключ пользователя» Если данных и сертификата провайдера нет, то программа сначала получит данные провайдера, а потом пользователя. Если данные провайдера есть, то обновится только пользовательский ключ.
Если в дальнейшем надо будет принудительно обновить данные провайдера, жмем кнопку «Обновить данные провайдера«
Примечание: Если надо добавить нового провайдера, то дописываем адрес без http://, https:// и www в файл providers.txt
в подкаталоге data
, по адресу на строку.
Должно получиться как на скриншоте:

8. Жмем кнопку «Сохранить ключи…» и сохраняем их в каталог с конфигами OpenVPN. Имена ключей для Riseup оставляем без изменений, а для Calyx сохраняем как cacert_calyx.pem
и openvpn_calyx.pem
. Или можете отредактировать конфиг calyx-net.ovpn
и задать там любые желательные имена.
Полезные фишки в BAT/CMD файлах.
exit /B
Ключ /B
обязателен! Если использовать просто exit
— закроется командный интерпретатор.
Можно использовать для проверки параметров в командной строке.
if "%~1"=="" ( echo Use %0 ^<address^> echo Address must be without http://, https:// or www echo e.g. riseup.net pause exit /B )
Аналог VAR=`program`
в bash.
for /f %%i in ('program') do set "API_URI=%%i"& goto f1
:f1
Пример:
for /f %%i in ('bin\jq .api_uri %WORKDIR%/provider.json') do set "API_URI=%%i"& goto f1
:f1
Статья на Киберфоруме Копия в PDF
В BAT/CMD файле некоторые символы (перенаправления >
и <
, конвейера |
, символ &
, указание переменной %
) считаются специальными. Если символ должен быть включен в команду как символ, могут быть глюки. Перед символом нужно указать символ экранирования: ^
(крышку).
Пример:
echo Use batfile.bat ^<address^>
(выведет на экран Use batfile.bat <address>
)
Источник Копия в PDF Там есть и другие полезные штуковины.
Например, надо удалить из переменной %VAR%
все кавычки:
set VAR=%VAR:"=%
Источник Копия в PDF В источнике есть и другие примеры работы со строками.
C#, HttpWebRequest: использование самоподписанного (self-signed) сертификата.
Если попытаться соединиться с HTTPS-сервером, имеющим самоподписанный сертификат, то HttpWebRequest
сгенерирует исключение WebException
Базовое соединение закрыто: Не удалось установить доверительные отношения для защищенного канала SSL/TLS.
(The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
). Оно и понятно, HttpWebRequest
не смог проверить сертификат узла и закономерно нас послал.
Решение заключается в переопределении глобального обработчика System.Net.ServicePointManager.ServerCertificateValidationCallback
.
Внимание! Изменение ServerCertificateValidationCallback
повлияет на все соединения в программе, пока обработчик не будет установлен по умолчанию, надо не забывать это, и возвращать обработчик к стандартному значению, после того, как работа с сервером, имеющим самоподписанный сертификат, завершена.
Предположим, есть класс-обертка над HttpWebRequest
, надо его дополнить так, чтоб можно было работать с серверами с self-signed сертификатами.
Самый простой способ, но не самый безопасный. ServerCertificateValidationCallback
передается делегат, который всегда возвращает true
. Добавляем в класс функцию:
public void EnableIgnoreCertError() { ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; }
И функцию, которая возвращает ServerCertificateValidationCallback
к значению по умолчанию:
public void DisableIgnoreCertError() { ServicePointManager.ServerCertificateValidationCallback = null; }
Начали работать с сервером — вызвали первую, закончили — вызвали вторую.
Немного более сложный, но более безопасный способ. Необходимо заранее либо иметь сам сертификат, либо знать его хэш. В следующем примере будем проверять как раз хэш SHA1 сертификата.
1. Подключим в References’ах System.Security.Cryptography.
2. Подключим необходимые пространства имен:
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
3. Заведем в классе поле, куда из вызывающей программы будем передавать заранее известный хэш сертификата:
public string CertHashString { get; set; }
4. Заведем две функции, для включения и выключения самостоятельной проверки сертификата:
public void EnableValidateCert() { ServicePointManager.ServerCertificateValidationCallback = ValidateCert; } public void DisableValidateCert() { ServicePointManager.ServerCertificateValidationCallback = null; }
В первой функции вместо делегата, возвращающего true
, указываем нашу функцию проверки.
Функция проверки сертификата обязательно должна иметь следующий заголовок:
bool FunctionName (object, X509Certificate, X509Chain, SslPolicyErrors)
, т.е., например:
private bool ValidateCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
В функции:
1. Проверяем наличие ошибок SSL, если их нет, значит сертификат уже был опознан:
if (sslPolicyErrors == SslPolicyErrors.None) { return true; }
2. Если известный хэш сертификата не был передан вызывающей программой, значит и проверять нечего:
if (string.IsNullOrEmpty(CertHashString)) { return false; }
3. Получаем хэш сертификата сервера в виде строки:
string hashstring = cert.GetCertHashString();
4. Если хэши полученного и известного сертификата совпадают — все ок, возвращаем true
, иначе false
.
if (hashstring == CertHashString) { return true; } return false;
Функция целиком:
private bool ValidateCert(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { //все и так хорошо if (sslPolicyErrors == SslPolicyErrors.None) { return true; } //не передан хэш сертификата //значит и проверять нечего if (string.IsNullOrEmpty(CertHashString)) { return false; } //получаем хэш сертификата сервера в виде строки string hashstring = cert.GetCertHashString(); //если хэши полученного и известного //сертификата совпадают - все ок. if (hashstring == CertHashString) { return true; } return false; }
C#, получение хэша (fingerprint) сертификата X509.
Понадобилось проверить сертификат X509 на целостность и подлинность. Поставщик сертификата отдельно передает его fingerprint и алгоритм хэширования по которому тот вычисляется.
Судя по документации от MS, получить fingerprint, он же хэш, можно функцией GetCertHashString()
(или GetCertHash()
в виде массива байт) класса X509Certificate2
, однако, в .NET 2.0 отсутствует перегрузка функции GetCertHashString(HashAlgorithmName)
, которая позволяет выбрать алгоритм хеширования (GetCertHashString()
возвращает хэш SHA1). Потому сделаем руками, благо ничего сложного в этом нет.
1. Подключаем в References System.Security.Cryptography
2. Подключаем необходимые пространства имен в классе:
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
3. Загружать сертификат будем из файла, потому проверяем его наличие:
if (!File.Exists(CertFile)) { Console.WriteLine("File not found."); return null; }
4. Загружаем сертификат (создаем экземпляр класса X509Certificate2
). Если вдруг файл сертификата поврежден, то конструктор X509Certificate2
вызовет Exception Требуемый объект не найден.
Поэтому конструктор надо обернуть в try...catch
:
try { X509 = new X509Certificate2(CertFile); } catch (Exception ex) { Console.WriteLine(ex.Message); return null; }
5. Получаем загруженный сертификат в виде массива байт:
byte[] cert = X509.GetRawCertData();
6. Создаем объект HashAlgorithm
, который и займется вычислением хэша/fingerprint’а. Я завел в функции входную переменную AlgName
, куда записывается строка с названием алгоритма, что бы иметь возможность выбора алгоритма хэширования если что:
HashAlgorithm alg = null; switch (AlgName.ToUpperInvariant()) { case "MD5": alg = MD5.Create(); break; case "SHA1": alg = SHA1.Create(); break; case "SHA256": alg = SHA256.Create(); break; case "SHA384": alg = SHA384.Create(); break; case "SHA512": alg = SHA512.Create(); break; default: { Console.WriteLine("Unknow algorithm."); return null; } }
7. Получаем хэш в виде массива байт:
byte[] hash = alg.ComputeHash(cert);
8. Преобразуем массив байт в строку шестнадцатеричных чисел:
string hex = BitConverter.ToString(hash).ToLowerInvariant(). Replace("-", "");
ToLowerInvariant()
преобразует буквы в строке, полученной BitConverter
в строчные, а Replace("-", "")
удаляет разделители (-
) между значениями байтов, которые BitConverter
вставляет в строку.
C#, парсинг и прочая работа с JSON. В том числе и в .NET 2.0
Понадобилось достать несколько значений из JSON-файла, искал, чем это сделать и нашел просто офигенную библиотеку Json.NET. Это не просто парсер, это целый набор инструментов: парсер, сериализаторы, десериализаторы, конвертеры. Кроме банального вытаскивания значений, можно формировать JSON, конвертировать его в XML и XML в JSON, обращаться к объектам JSON через запрос SelectToken
или LINQ. А можно и просто вытащить нужное значение, обращаясь к полям JSON, используя встроенные функции объектов.
Несомненный плюс библиотеки в том, что даже в последней версии она поддерживает .NET Framework 2.0 Правда нельзя будет использовать синтаксис LINQ, но и без него инструментов хватает.
С помощью JObject
и JToken
1. Подключаем библиотеку для своего Framework’а через References и в исходнике:
using Newtonsoft.Json.Linq;
2. Загружаем JSON в переменную, например из файла.
3. Парсим JSON в JObject
:
JObject JSONObj = JObject.Parse(JSONBuf);
JObject.Parse
может вызвать exception, если есть синтаксические ошибки в JSON, так что лучше поместить его в try...catch
:
public static JObject ParseJSON(string JSONBuf) { JObject JSONObj = null; try { JSONObj = JObject.Parse(JSONBuf); } catch (Exception ex) { Console.WriteLine("ERROR: " + ex.Message); return null; } return JSONObj; }
Пример реакции на ошибку синтаксиса:
Invalid character after parsing property name. Expected ':' but got: {. Path description.languages', line 15, position 9.
4. Далее, можно вытащить значение поля JSON в объект JToken
помощью функции JSONObj.GetValue(FieldName);
, если поле со значением находится сразу в корне JSON, как, например, api_uri
в этом примере, то JToken
можно сразу преобразовать в строку с помощью функции .ToString
:
JToken tok = JSONObj.GetValue("api_uri");
tok.ToString();
Однако, если поле отсутствует, то это вызовет exception:
В экземпляре объекта не задана ссылка на объект.
Этого можно избежать, отловив исключение в try...catch
, либо проверив наличие поля функцией JObject.ContainsKey("имя_поля")
перед вызовом GetValue
, либо воспользовавшись функцией TryGetValue
вместо GetValue
Примеры кода на PasteBin
Тестовый проект
Если же нужное значение находится где-то глубоко в недрах JSON, то необходимо воспользоваться функцией JObject.SelectToken()
Пример в официальной документации Копия
Как я уже говорил, инструмент очень мощный, так что лучше начать с изучения официальной документации
OpenVPN для Windows XP.

Последняя поддерживающая Windows XP версия OpenVPN это 2.3.18.
— Версия x86 (32-разрядная)
— Версия x64 (64-разрядная)
Mozilla Firefox для Windows XP

Чтоб не пролюбилось, мало ли с официального сайта пропадет, а понадобится:
C#, поиск файла по маске.
Или небольшая заметка про странный глюк (на самом деле фичу) MS и кривофикс к ней.
Словил странный баг при поиске файлов по маске, функцией Directory.GetFiles();
Оказалось, что при задании маски вида *.htm
, в выборке окажутся все файлы с расширением, длина которого больше трех совпадающих символов, т.е. и *.htm
и *.html
и *.htmепрст
, и т.д. Срабатывает это для файлов с расширениями размером три символа и больше.
Т.е. на *.ph
оно найдет только файлы с расширением ph
, а на *.a
— только файлы с расширением a
Этот баг распространяется только на последнее расширение. Если в имени файла есть конструкция типа *.tmp.php
, например admin.tmp.php
, то при задании маски *.php
расширение tmp
будет, слава Ктулху, проигнорировано.
Оказалось, что это не баг, а фича, и об этом прямо написано в MSDN:
Не знаю, как создатели DOS смогли заговнять и испортить самую простую операцию, которая работала у них, как минимум, с 1989 года, но факт. Заговняли.
В общем, я теряюсь в догадках.
Это, конечно же, довольно коряво. Наверное, можно было бы решить с помощью регулярных выражений, но я поступил следующим образом:
1. Создал функцию, которая будет вытаскивать однозначное расширение и из заданной маски, и из поданного на вход файла:
private string GetExtension(string FileName) { FileName = FileName.Replace('*', '_'); FileName = FileName.Replace('?', '-'); FileInfo fi = new FileInfo(FileName); return fi.Extension; }
Замены Replace(...)
тут для того, чтобы класс FileInfo
не выпал в Exeption, если ему подать что-то вида *.html
, т.к. FileInfo
не принимает имен с недопустимыми символами, к которым относятся и маски подстановки. В определении расширений класс FileInfo
такого глюка не имеет, и отличает file.html
от file.htm
. И тоже не признает двойные расширения, учитывая только последнее.
2. В функции, где будем вызывать поиск файлов, вызываем, собственно, функцию поиска:
string[] files = Directory.GetFiles(Path, Mask, SearchOptions);
3. Получаем расширение маски:
string MaskExt = GetExtension(Mask);
4. Далее обрабатываем выходной массив. Например, тут я добавлял его в List<string>
с именем FoundFiles
. Мне надо было искать файлы по маскам, и нужно было, чтоб *.htm
и, например, *.html
различались.
Например, я просто сравнивал расширение от маски файла с расширением от имени файла, и если оно совпадало — добавлял в результирующий список FoundFiles
:
string FileExt = GetExtension(filename); if (FileExt == MaskExt) { FoundFiles.Add(filename); }
Или относительно полностью:
string MaskExt = GetExtension(Mask); //[...] string[] files = Directory.GetFiles(Path, Mask, SearchOptions); foreach (string filename in files) { string FileExt = GetExtension(filename); if (FileExt == MaskExt) { FoundCtr++; FoundFiles.Add(filename); } }
Пакетный конвертер (перекодировщик) текстовых файлов v 0.0.2b
Изначально писалось для товарищей в 2016 г., поскольку почему-то все пакетные конвертеры/перекодировщики текстовых файлов были исключительно платными, во всяком случае на тот момент и под Windows.
— Пакетная перекодировка текстовых файлов
— Создание полного дерева каталогов для перекодированных файлов
— Доступен расширенный список кодировок (все кодировки, поддерживаемые .NET Framework)
— Добавлена возможность сохранять изменения в целевой каталог (перезаписывать файлы)
— Программа по умолчанию работает в портативном режиме, настройки хранятся в каталоге с программой.
— Изменен формат файла настроек на XML
Windows XP/7/8/10
.NET Framework 2.0.
256 Мб ОП
/help
— эта помощь
/np
— отключение портативного режима
(настройки программы хранятся в C:\Users\<пользователь>\AppData\Local\BatchTextConverter\)
D. Larin
Chang Min Ho
PunkArr[]

Главный экран
Начали блокировать доступ к VPN-провайдерам.
С удивлением узнал, что vpnbook.com заблокирован.

А перед этим Firefox еще и заругался на подмененный сертификат. Так что и сертификаты подменить пытаются. Самое прикольное, что соединение с vpnbook не блокируется. Только без доступа к сайту пароль не обновить. Придется потом думать, как это сделать через Tor.
Dialog — псевдографический оконный интерфейс в bash-скриптах
Оказывается, в bash-скриптах можно организовать псевдографический оконный интерфейс с помощью команды dialog. Не буду тут подробно про нее расписывать, потом покажу ее использование на реальном проекте, а пока заметка от склероза.
Забавные утилиты под DOS
CALENDER.EXE
— Универсальный календарь на любой год.
Я проверял с 0001 г. н.э до 6666 г. н.э.

Read more…
CLOCK.EXE
— большие красивые часы на весь экран
(с будильником), есть защита от копирования
Но вроде она снята. Есличо, запустить с параметром
/Hide
и ввести пароль polkol

HELP401.EXE
— Небольшая утилита для помощи в Pascal
— Таблица предела переменных
— Цветовая палитра (подбор цвета текста на фоне)
— Работа с файлами баз данных (разрезать или
слить файл)
— Нумерация строк текстового файла
— Кодировка текстового файла
(сдвигает все символы в тексте на какое-то
число байт)
— Кодировка по заданному коду
(делает то же самое, только по заданному
коду)
-Таблица ASCII


Read more…
PEREVOD.EXE
— Конвертер из WIN 1251 в DOS 866 и
обратно.

TIMER.EXE
, TIMER401.EXE
— предыдущая версия часов.
Как-то можно менять название организации
(сохраняется в экзешнике), но как — я не разобрался.
Имеется защита от копирования, по умолчанию неактивна.
Чтобы активировать надо запустить часы с параметром
install (без слэшей и строчными буквами) и ввести
любое слово
Чтобы деактивировать — то же самое, но ввести
пароль Кононов
(фамилия разработчика).

Установка и настройка I2P в Slackware Linux

I2P это такая скрытая пиринговая сеть, подробнее можно узнать в Википедии или на официальном сайте. В отличии от TOR, она обеспечивает не анонимный доступ в Интернет, а доступ к собственным ресурсам (сайтам, файлообменникам и т.д.), скрытым из обычной сети. Гейты в «большой» Интернет в ней есть, но они кривые, косые и пользоваться ими не рекомендуется. Расскажу, как ее установить и настроить на Slackware, заодно разрешив пользователям из локальной сети также получать к ней доступ.
Клиент сети написан на Java, потому ее надо сначала установить. На официальном сайте есть рекомендации о необходимой версии:
Java Runtime Version 7 or higher. (Oracle, OpenJDK, or IcedTea Java Version 7 or 8 recommended.
Сама установка довольно проста:
1. Идем, например сюда
2. Скачиваем jdk-8u162-i586-2gds.txz
3. Устанавливаем стандартным образом:
installpkg jdk-8u162-i586-2gds.txz
4. Добавляем в автозагрузку (если вы не сделали отдельного скрипта для запуска сервера, то /etc/rc.d/rc.local
) пути к java:
echo "Add JAVA paths..."
export JAVA_HOME=/usr/lib/java
export MANPATH="${MANPATH}:${JAVA_HOME}/man"
export PATH="${PATH}:${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin"
5. Перезагружаем машину.
6. Вводим в консоли команду java
без параметров. Если все было сделано правильно, то вы должны увидеть вывод краткой справки по параметрам java.
Понятно, что операции с пользователями надо делать под root
или с sudo
.
1. Создаем отдельную группу для I2P:
groupadd i2pgrp
2. Создаем интерактивного (пока, потом мы вырубим ему всю интерактивность) пользователя, например i2psrv
:
useradd -g i2pgrp -m -d /home/i2psrv -s /bin/bash i2psrv
где:
-g i2pgrp
— группа пользователя (i2pgrp
)
-m
— создать домашний каталог
-d /home/i2psrv
— путь к домашнему каталогу (/home/i2psrv
)
-s /bin/bash
— установить пользователю оболочку, в данном случае фиктивную (/bin/bash
)
i2psrv
— имя пользователя
3. Задаем ему пароль:
passwd i2psrv
В интерактивном режиме повторяем пароль 2 раза, о сложности можно не беспокоиться — все равно потом отключим.
1. Скачиваем установщик для Linux с официального сайта
2. Копируем в директорию пользователя (/home/i2psrv
) и меняем владельца файла:
chown i2psrv:i2pgrp i2pinstall_0.9.44.jar
3. Логинимся под новым пользователем.
4. Запускаем установку (через консоль):
java -jar i2pinstall_0.9.44.jar -console
5. Приводят возможность выбрать язык:
Select your language
0 [x] eng
1 [ ] bra
2 [ ] cat
3 [ ] ces
...
Оставляем английский (нажимая ENTER).
6. Далее предлагают продолжить установку:
Нажимаем 1 [ENTER]
7. Опять лицензия и всякая хрень:
Нажимаем 1 [ENTER]
8. Выбор пути для установки. Поскольку устанавливаем в каталоге нового пользователя, пусть так и делает — нажимаем [ENTER]
9. Далее нажимаем O
и [ENTER] (в прошлых версиях было меньше гемора и подтверждений, а сейчас словно анкету в ментовку работать заполняешь 🙂
10. Еще раз предлагают подтвердить, что все ОК (1 и [ENTER])
11. Наконец, тебе говорят, что все ОК:
====================
Installation started
Framework: 5.1.3-84aaf (IzPack)
Platform: linux,version=4.4.14-smp,arch=x86,symbolicName=null,javaVersion=1.8.0_232
[ Starting to unpack ]
[ Processing package: Base (1/1) ]
[ Unpacking finished ]
Installation finished
On most systems, I2P can be started with:
/home/i2psrv/i2p/i2prouter start
If I2P does not start, please try:
/home/i2psrv/i2p/runplain.sh
12. Тебе говорят, что все совсем ОК:
Installation was successful
Application installed on /home/i2psrv/i2p
[ Writing the uninstaller data ... ]
[ Console installation done ]
Если вы намерены использовать I2P только на локальном компьютере, этот шаг можно пропустить.
1. Идем в файл /home/i2psrv/i2p/i2ptunnel.config
, предварительно его куда-нибудь скопировав, и меняем в нем все 127.0.0.1
на адрес нашего компьютера в локальной сети (например на 192.168.0.20
, см. адрес вашего компьютера), таким образом все сервисы I2P будут доступны с любой машины в локальной сети.
2. В том же файле смотрим порты, если где-то у нас какой-то порт для чего-то занят, например на том же порту уже висит HTTP или TOR-proxy, смело меняем порт.
I2P — порядочный сервис, и сам умеет переключать пользователя, под которым запускается. Некоторые даже рекомендуют завести двух пользователей, одного для запуска, другого для установки I2P, но мы, ради экономии времени, делать этого не будем — и запуск и установка будут под одним пользователем. Тем не менее, необходимо отредактировать скрипт i2prouter
(в /home/ip2srv/i2p
):
1. Ищем строку, содержащую RUN_AS_USER=
2. Раскомментируем ее (удаляем #
в начале строки).
3. Дописываем после знака =
имя пользователя (в этом примере «i2psrv"
).
Отслеживание статуса соединения с сетью I2P, ошибки и основные настройки доступны через Web-интерфейс, который запускается на локальной машине на порту 7657
, но если физического доступа к той машине, на которой установлен I2P нет (или лень), то можно управлять ей и с любого компьютера локальной сети.
Внимание! Это не очень одобряется официальными инструкциями. По идее можно сделать безопасный SSL-туннель, как это описывалось в одной из старых инструкций. Но я опишу самый простой вариант, просто поменяю конфиг.
Заходим в clients.config
(/home/i2psrv/i2p
), предварительно сделав бэкап.
И опять меняем 127.0.0.1
на 192.168.0.20
, т.е. меняем адрес машины, по которому должна появиться консоль.
Далее меняем clientApp.4.startOnLoad=true
на clientApp.4.startOnLoad=false
, т.к. на сервере нет смысла открывать панель управления после старта I2P.
Дальнейшая настройка под катом
Переходим по адресу http://i2p-projekt.i2p

I2P довольно медленная сеть и работает с некоторыми перебоями, так что если вместо сайта вы увидите надпись «Сайт недоступен. Возможно, сайт отключен, сеть перегружена или ваш маршрутизатор недостаточно интегрирован с другими пирами. Вы можете повторить операцию.«, то действительно, скорее всего, операцию нужно повторить.
На самом деле интерактивный доступ к системе для пользователя i2psrv
был нужен только на этапе установки сервиса I2P, и я оставлял его до конца настройки на случай, если I2P понадобится переустановить. Теперь консоль пользователю i2psrv
более не нужна. Отключаем:
Редактируем (под root
‘ом) файл /etc/passwd
.
Находим в этом файле строку, начинающуюся с имени пользователя (i2psrv
) и в конце строки меняем /bin/bash
на /bin/false
.
Сохраняем файл.
Остались нераскрытыми темы подписок (как добавлять I2P-сайты неизвестные вашему маршрутизатору I2P), интересные I2P-сайты, другие сервисы I2P, кроме WWW. Может быть когда-нибудь вернусь к этому вопросу, а пока рекомендую детально ознакомиться с документацией на сайте https://geti2p.net/, http://i2p-projekt.i2p и в консоли I2P.
Настройка времени через консоль Linux
Делается с помощью команды
date --set "<строка>"
Например:
date --set "Dec 12 5:08:00 2019"
Сохранение:
hwclock -w
Эту команду надо выполнить после установки времени командой date
.
Просмотр времени и даты — команда date
без параметров.
Пример вывода:
Wed Dec 18 16:53:28 AKST 2019
Источник, копия статьи в PDF, там еще есть и другие способы настройки.
Словарик компьютерного слэнга.
Офигенная штука, сделана еще в то время, когда Луркморья не было даже в проекте. Интерактивный словарик компьютерного и фидошного сленга.
Не буду расписывать, просто оставлю скриншоты и ссылку на скачивание.
Основной словарик:

На самом деле словарик очень прикольный и сделан по всем канонам демосцены. Меню, которое вы можете видеть слева — «глазками» смотрит за курсором мыши. В комплекте есть заставка (заскриншотить не получилось).
Словарик смайликов:

Словарик сокращений (акронимов):

Помощь:

About:

Установка и настройка tor-ноды
1. Загружаем исходники tor отсюда я взял версию 0.4.2.4-rc посвежее.
2. Собираем пакет:
— Распаковываем из архива каталог tor-0.4.2.4-rc
со всеми подкаталогами
— Переходим в этот каталог и выполняем последовательно:
./configure
make
checkinstall
checkinstall
нас спросит, какой пакет хотим создать (Slackware [S], RPM [R] or Debian [D]?
), отвечаем s
, далее вводим описание пакета, например tor и нажимаем два раза ENTER, после чего подтверждаем, что все верно (нажав ENTER еще раз) и checkinstall
создаст пакет.
3. Можно сразу его установить:
installpkg tor-0.4.2.4-rc-i386-1.tgz
Негоже запускать tor под обычным пользователем, а тем более под root
‘ом, потому создадим для него отдельного пользователя. Пользователь будет неинтерактивный, т.е. войти в систему с терминала он не сможет.
1. Добавляем группу, например torgroup
:
groupadd torgroup
2. Смотрим файл /etc/shells
и проверяем, чтоб в файле была строка /bin/false
, если ее нет — смело дописываем.
3. Создаем пользователя с именем, например, torusr
:
useradd -g torgroup -m -d /home/torusr -s /bin/false torusr
где:
-g torgroup
— группа пользователя (torgroup
)
-m
— создать домашний каталог
-d /home/torusr
— путь к домашнему каталогу (/home/torusr
)
-s /bin/false
— установить пользователю оболочку, в данном случае фиктивную (/bin/false
)
torusr
— имя пользователя
4. Создаем каталог для данных tor:
cd /home/torusr
mkdir .tordata
и изменяем владельца созданного каталога на torusr
chown torusr:torgroup .tordata
В каталоге /home/torusr
создаем файл torrc
и записываем в него следующие строки:
SocksPort 9050
— порт на localhost
, где будет висеть tor, и принимать на него запросы. Проще говоря, это порт прокси-сервера, который надо будет прописать, чтоб соединиться с сетью tor с локальной машины. Порт 9050 является портом по умолчанию, и назначается на localhost (127.0.0.1), если строки SocksPort
будут отсутствовать в конфигурации.
SocksPort 192.168.0.20:9660
— то же самое, только внутри локальной сети. Клиенты из локальной сети должны будут подключаться по адресу 192.168.0.20
и порту 9666
, чтобы использовать сеть tor.
Tor организует только SOCKS5 прокси, как быть с браузерами, которым нужен HTTP, рассмотрим далее.
SocksPolicy accept 192.168.0.0/24
SocksPolicy accept 127.0.0.1
SocksPolicy reject *
Принимать запросы только из локальной сети и localhost’а.
Log notice file /home/torusr/notices.log
— файл, куда будет писаться лог tor’а
RunAsDaemon 1
— запуск tor в режиме демона.
DataDirectory /home/torusr/.tordata
— путь для данных tor
ORPort 9001
— порт, используемый для пересылки пакетов с других узлов.
DirPort 9030
— порт, используемый для сервиса каталогов, т.е узел будет позволять получать информацию о других узлах tor, а не только транслировать трафик.
Конечно, стоило бы облегчить жизнь пользователям, сидящим за сетевыми экранами и пустить трафик по портам 80 (8080) или 443, но я пока не стал. Впрочем, если вам будет надо — смотрите статью на Хабре (копия)
RelayBandwidthRate 1000 MB
— ограничение пропускной способности. Чем больше, тем лучше. Но настраивайте эти числа под свой канал, чтоб не загадить его трафиком tor совсем.
RelayBandwidthBurst 2000 MB
Nickname PersonalChaosRelay
— имя вашего релея (ноды) в базе tor. Можете придумать любое, но советую сначала проверить придуманное имя здесь, введя его в поиске. Если ничего не найдется, проздрабляю, ваш релей будет уникальным.
ExitPolicy reject *:*
— запрет использовать tor-ноду в качестве выходной. Для ГОРФ параметр строго обязательный.
ExitPolicy reject6 *:*
Примечание: в /usr/local/etc/tor
находится файл torrc.sample
с подробным описанием конфигурации.
Пример файла конфигурации на PasteBin
Устанавливаем файлу правильного владельца:
chown torusr:torgroup torrc
Запуск осуществляется следующей командой:
sudo -u torusr tor -f /home/torusr/torrc
Если помещать запуск в автозагрузку, то желательно указать полный путь к файлу tor
:
sudo -u torusr /usr/local/bin/tor -f /home/torusr/torrc
Запуск в отдельном network namespace (копия):
ip netns exec provns sudo -u torusr /usr/local/bin/tor -f /home/torusr/torrc
provns
— имя network namespace
Минут через 15-20 после запуска можно заглянуть в /home/torusr/notices.log
, если в последних строках файла написано что-то типа:
Self-testing indicates your ORPort is reachable from the outside. Excellent. Publishing server descriptor.
Tor has successfully opened a circuit. Looks like client functionality is working.
Self-testing indicates your DirPort is reachable from the outside. Excellent.
Performing bandwidth self-test...done.
значит порты ORPort и DirPort доступны извне, и нода нормально функционирует.
Если же в логе что-то типа:
Your server (x.x.x.x:9001) has not managed to confirm that its ORPort is reachable. Relays do not publish descriptors until their ORPort and DirPort are reachable. Please check your firewalls, ports, address, /etc/hosts file, etc.
Your server (x.x.x.x:9030) has not managed to confirm that its DirPort is reachable. Relays do not publish descriptors until their ORPort and DirPort are reachable. Please check your firewalls, ports, address, /etc/hosts file, etc.
значит порты недоступны из интернета (закрыты фаерволлом, нужно сделать проброс портов на роутере, порты закрыты провайдером) и нода не появится в списке нод и не будет принимать соединения.
В режиме клиента все будет работать, т.е. клиенты из локальной сети смогут ей пользоваться для выхода в сеть tor
Если все в порядке, то через несколько часов нода появится в базе данных, и можно будет проверить ее наличие здесь введя в поисковой строке на странице Nickname, который указали в конфиге.
Network namespaces или несколько виртуальных сетевых карт (интерфейсов) с разными IP на одной машине.
С одной физической сетевой картой.
Например мы хотим организовать следующую схему:
1. После запуска сервер устанавливает соединение с VPN-провайдером, и весь трафик идет через VPN.
2. Некоторым программам VPN не нужен, пусть это например будут TOR, I2P (у них и так шифрование, плюс им бы желательно скорость работы повыше, а напрямую соединяться быстрее, чем через VPN). Плюс, например, мы хотим ходить на некоторые сайты в обход VPN, либо иметь возможность запускать в обход VPN какие-либо трафикоемкие программы, например торрент-клиент. Ну пусть еще будет отдельный локальный сервис, например FTP, также висящий на отдельном IP.

Как.
В Linux есть замечательный механизм network namespaces, который на одной машине позволяет создать несколько изолированных друг от друга сетевых подсистем, почти как сеть в виртуальной машине. Не бойтесь, все делается на уровне ядра, потому тормозов, характерных для виртуальных машин не будет. И пусть слово «изолированных» вас тоже не пугает, когда надо — изолированных, а когда надо — мы их свяжем.
Поскольку в процессе нам придется поднимать/опускать физические и виртуальные сетевые карты, настоятельно советую отключить Network Manager, а основную сеть настроить вручную. С включенным Network Manager может ничего не получиться, т.к. он в самый ответственный момент влезет и напоганит в конфигурации.
Как на Slackware отключить Network Manager и настроить сеть вручную (копия)
Конфигурация namespace’ов производится с помощью iproute2.
1. Создаем новый неймспейс с именем provns
:
ip netns add provns
2. Создаем две связанных между собой виртуальных сетевых карты (интерфейса)
ip link add veth0 type veth peer name veth1
3. Поднимаем интерфейс veth0
:
ifconfig veth0 0.0.0.0 up
4. Ассоциируем вторую виртуальную карту с созданным нэймспейсом:
ip link set veth1 netns provns
Получился один дополнительный namespace, связанный с основным виртуальными сетевыми интерфейсами veth0
и veth1
.

Теперь надо связать виртуальный интерфейс veth0
с физической сетевой картой (интерфейсом) eth0
. Сделать это можно разными способами, например, присвоить интерфейсам разные IP-адреса из разных подсетей и сделать маскарадинг с помощью IPTABLES, а можно воспользоваться мостами.
Мост — специальное сетевое устройство (в данном случае не физическое, а логическое) позволяющее связать два (и более) сетевых интерфейса на канальном уровне, как в маршрутизаторе.
Подробнее про мосты:
— Linux Bridge
— Виртуальные сетевые устройства в Linux: Linux Bridge
— 10 примеров команды brctl в Linux для сетевого Ethernet моста
— Эти статьи в PDF
Итак:
5. Отключаем физический интерфейс eth0
:
ifconfig eth0 down
6. Включаем его, но IP-адрес не присваиваем (IP-адрес будет присвоен мосту):
ifconfig eth0 0.0.0.0 up
7. Создаем мост br0
:
brctl addbr br0
8. Соединяем (добавляем интерфейсы к мосту) eth0
и veth0
:
brctl addif br0 eth0 veth0
9. Поднимаем (включаем) мост, присваивая ему IP-адрес и маску подсети:
ifconfig br0 192.168.0.15 netmask 255.255.255.0 up
Получилось как на схеме:

10. Устанавливаем маршрут по умолчанию в основном namespace:
ip route add default via 192.168.0.1 dev br0 src 192.168.0.15
Далее конфигурируем namespace:
Выполнение любых команд в указанном namespace производится командой
ip netns exec <имя_namespace> <команда> [параметры_команды]
Например, если мы хотим выполнить ifconfig
в namespace с именем provns
, то команда будет:
ip netns exec provns ifconfig
11. Поднимаем (включаем) сетевой интерфейс veth1
внутри нэймспейса provns
, и присваиваем ему адрес 192.168.0.20
:
ip netns exec provns ifconfig veth1 192.168.0.20 netmask 255.255.255.0
12. Прописываем внутри нэймспейса маршрут по умолчанию:
ip netns exec provns ip route add default via 192.168.0.1 dev veth1 src 192.168.0.20
13. Поднимаем внутри namespace’а loopback-интерфейс:
ip netns exec provns ifconfig lo 127.0.0.1
Справочники по ассемблеру (assembler) для DOS
ASM-HELP — интерактивный справочник по Assembler (DOS)
TECHHELP — интерактивный справочник по прерываниям и структурам данных DOS/BIOS
NG — интерактивный резидентный справочник (вылезает по Shift-F1)
Базы данных:
ASSEMBLER (ENG) — ассемблер
BIOS (ENG) — прерывания BIOS
TC (RUS) — краткая справка по Turbo C
PASCAL (RUS) — справка по Turbo Pascal