Несколько дней назад разработчики проекта Xfce выпустили выпуск основной версии эмулятора терминала Xfceтерминал 1.0.0. Новая версия подготовил новый сопровождающий который возобновил разработку после того, как проект вышел из эксплуатации в 2020 году.
Запуск также он примечателен изменением схемы нумерации версий. В рамках ветки 1.1.х будут формироваться экспериментальные версии, из которых будет сформирована стабильная версия 1.2.0. В случае значительных изменений, таких как миграция на GTK4, или после постепенного достижения нумерации 1.9.x, планируется ветка 2.0.
Xonsh: кроссплатформенная командная строка и язык оболочки
В последние дни я просматривал Интернет в поисках полезной информации, связанной с Скрипты оболочки. Чтобы обновить код небольшого удобного программного инструмента, который я создал чуть более десяти лет назад. Приложение, которое в то время называлось Пост-установка Linux — сценарий двухсотлетия (LPI-SB), и был создан только с Командные строки на основе Bash. И посреди этих поисков я наткнулся на интересную утилиту или программу под названием «Хонш».
Для тех, кто никогда не слышал об этом приложении, стоит ожидать, что это отличный инструмент для терминальное программное обеспечение предлагая язык оболочки y un
Кроссплатформенная командная строка который работает с Питон.
Близится кожаная свадьба Роскомнадзора с Телеграмом, 16 апреля 2018 года начался крестовый поход, ставший фактически символом уничтожения интернета в России, хотя в глобальной войне, начавшейся в 2012 году, он был всего лишь ярким эпизодом.
Ковровые блокировки в исполнении РКН стали причиной появления на свет множества различных сервисов, помогающих пользователям сети выживать под бомбежками. Одним из них стал antifilter.download, позволяющий получать списки находящихся под блокировками IP-адресов. Далее пользователи сервиса могли использовать полученную информацию по своему усмотрению. Вариант усмотрений был описан в статье Настройка BGP для обхода блокировок, версия 3, без VPS, которая стала достаточно популярной в сети и породила несколько сотен пользователей сервиса.
Однако «Tempora mutantur et nos mutamur in illis». За прошедшие три года сервис пережил Alpharacks-gate, похоронивший вместе с собой практически все донаты, упирание в технические ограничения как следствие роста количества пользователей, упирание в те же ограничения как следствие взрывного роста количества ip-адресов в списке РКН… Да что только не пережил. Каждое из этих изменений приводило к небольшому устареванию предыдущей статьи и когда неделю назад один из хабраюзеров предложил мне поправить ее под текущие реалии, я понял, что проще родить нового, чем отмыть этого написать новую версию, заодно и ответив на часто задаваемые вопросы. Результат — ниже.
Зачем это всё
Выполнив описанные ниже действия на своем маршрутизаторе Mikrotik, вы сможете автоматически получать через уже имеющийся у вас VPN доступ к ресурсам, ip-адреса которых занесены в «Единый реестр доменных имен, указателей страниц сайтов в сети «Интернет» и сетевых адресов, позволяющих идентифицировать сайты в сети «Интернет», содержащие информацию, распространение которой в Российской Федерации запрещено».
Мы используем протокол BGP для доставки списка IP-префиксов из «Единого реестра» на ваш маршрутизатор и дальнейшего перенаправления трафика к этим префиксам в VPN-туннель. Здесь и далее под общим термином IP подразумевается IPv4, IPv6-адреса сервисом не обрабатываются.
Если ваш маршрутизатор не Mikrotik, но умеет протокол BGP, вы, скорее всего, сможете использовать этот сервис, адаптировав настройки под своё оборудование. Вариант для Keenetic, например, приведен в полезных ссылках в конце статьи.
Что нужно для использования
Маршрутизатор Mikrotik
подключенный к интернету
с VPN куда-то в зону, свободную от блокировок, и использующим протокол, создающий интерфейс (практически любой вариант, кроме чистого IPSEC — в примере используется GRE). В целом тема настройки VPN — отдельная и широкая, а поскольку я ни с одним таким сервисом не аффилирован, описывать на примере кого-либо из них не буду. Будем считать, что VPN у вас есть и работает.
Как настроить
Команды, приведенные в цитатах, необходимо выполнять в окне терминала Mikrotik. В целом никто не запрещает настраивать это всё и в Winbox, но разбирать, какие параметры в какое поле Winbox вводить, вам придется самостоятельно.
Предварительные ласки
Проверяем наш VPN. Крайне важно, чтобы он работал еще до внедрения сервиса. Наиболее простым способом проверки будет посещение любого сайта, который показывает ваш внешний IP-адрес (например, 2ip.ru), с включенным и выключенным VPN и фиксированием факта, что отображаемый ip-адрес меняется.
Тут у нас лежит первая и частая засада. Очень часто люди с неэкспертной квалификацией настраивают подключение к VPN по шаблону из интернета с использованием routing mark, особенно когда параллельно используют multiWAN схему. В принципе, ничто не запрещает использовать BGP-префиксы и в такой конфигурации, но ее нужно тщательно продумывать и подстраивать под текущие настройки, что в статье «в общем» не описать. Так что в дальнейшем подразумевается, что вы используете только классическую маршрутизацию по префиксам.
Если у вас сильно зажаты правила файрвола, возможно вам потребуется создать отдельное правило для выпуска трафика BGP с маршрутизатора.
На место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.
Укрепи и направь
Прописываем маршрут до сервиса antifilter.download через ваш VPN. Это действие нам поможет от случая, когда где-то на пути какой-то из провайдеров фильтрует BGP (на удивление, таких в России достаточно много).
На место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.
Также очень полезно иметь маршрут до VPN-сервера, жестко указывающий в вашего провайдера, но если у вас работает VPN — вероятно, такой маршрут у вас уже прописан.
Для работы VPN обычно используют маршрут по умолчанию, указывающий в VPN-туннель — после активации сервиса в этом маршруте смысла нет и его нужно удалить или задизаблить.
Первой командой мы создаем процесс BGP на вашем устройстве. В ней:
64512 — 16-битный номер автономной системы. Заменяем на любой по вашему желанию, кроме ASN сервиса (65432). В нашем конкретном случае нам не важно, какой там будет указан номер в диапазоне от 1 до 65534, но если делать все правильно — RFC6996 говорит нам, что для частного использования выделен диапазон 64512-65543.
81.117.103.94 — router ID (32 бита) в формате IPv4-адреса. В общем случае нам, опять же, не важно, какой там будет указан ID, но чтобы уменьшить вероятность пересечения с другим пользователем — лучше использовать ваш текущий внешний IP-адрес (посмотрев его на том же 2ip.ru). При его изменении менять router ID совершенно не обязательно.
Второй командой мы создаем BGP соединение с сервисом antifilter.download. В ней ничего менять не надо.
Третьей командой мы указываем, что для всех маршрутов, полученных от сервиса, нужно установить в качестве next-hop интерфейс нашего VPN. В ней на место gre-tunnel1 нужно подставить имя вашего интерфейса VPN-туннеля.
… и обоюдный оргазм
Если всё настроено правильно — через несколько десятков секунд, в течение которых процессор маршрутизатора будет на 100% загружен обработкой списка полученных префиксов, все заработает и трафик до полученных IP-адресов будет отправляться в VPN.
То, что пиринг поднялся, можно посмотреть по пути Routing — BGP — Peers в Winbox:
State должен быть Established, а в поле Count — отличное от нуля количество полученных префиксов.
Также характерным признаком того, что префиксы получены, является следующая картинка по пути IP — Routes в Winbox:
По клику где указано можно раскрыть весь список полученных префиксов и увидеть что-то вроде:
Важно, чтобы в поле Gateway было указано имя вашего интерфейса VPN и слово reachable (Distance при этом у вас будет другим, это нормально).
Если что-то не работает — проверьте прежде всего доступность сервиса. Сервер откликается на пинг, так что команда ping antifilter.download вполне себе покажет, все ли хорошо со связностью. Если пинг проходит — проверьте соответствие IP-адреса в пинге 45.154.73.71, потому что вы вполне можете читать эту статью в момент, когда сервис уже куда-то мигрировал.
Далее перепроверьте настройки и прочитайте Q&A ниже. А потом спросите в комментариях здесь или на канале MikrotikRus, там я тоже иногда поддерживаю решение, да и кроме меня там очень много грамотных людей.
А поговорить? (Q&A)
Решение перекрывает не все проблемы с блокировками
Конечно нет. Нужно понимать, что поскольку действие (блокировка) лежит фактически на 7 уровне модели ISO/OSI, то и противодействие (обход блокировки) наиболее эффективно работает на том же уровне модели. Сервис же предоставляет возможность борьбы на 3 уровне модели, что автоматически означает неидеальное совпадение. Если хочется более точного варианта — плагин для браузера, автоматически отправляющий некоторые сайты через прокси-сервер (например, SwitchyOmega для Chrome), будет работать гораздо лучше.
Я всё настроил, а мой любимый ресурс все равно блокируется. При этом подходящего префикса для его адреса в списке нет
Вероятно, РКН внес другой IP-адрес ресурса в реестр. Список IP-адресов генерируется полностью автоматически и не может редактироваться со стороны сервиса под каждый отдельный кейс вручную. Самое простое решение — прописать до любимого ресурса статический маршрут в VPN на маршрутизаторе.
Я всё настроил, а мой любимый ресурс все равно блокируется. При этом подходящий префикс для его адреса в списке есть, но nslookup выдает другой адрес из сети моего провайдера
Вероятно, ваш оператор связи использует многоуровневую систему блокировки контента, в том числе перехватывающую DNS-запросы с соответствующей коррекцией ответа. В этом случае вам может помочь перенаправление DNS в VPN или более интеллектуальные способы решения, описанные в частности в статье Переводим на DoH домашнюю сеть.
После включения сервиса в VPN отправляется трафик на IP-адреса, отсутствующие в реестре. Дефолт в VPN я отключить не забыл
Вероятно, в реестре есть IP-адрес из той же IP-подсети /24. По BGP сервис отдает только суммаризованные вверх префиксы /24 (т.е. даже если в реестре есть только адрес 1.2.3.4 — вы получите префикс 1.2.3.0/24, перекрывающий весь диапазон от 1.2.3.0 до 1.2.3.255). Вы всегда можете исправить эту ситуацию для себя и конкретных адресов, прописав маршрут на них через провайдера в вашем роутере статически (статика по умолчанию побеждает динамику).
Раньше сервис можно было настроить для получения отдельных IP-адресов (по /32). Как получать их сейчас?
К сожалению, сервис банально уперся в проблему масштабирования. После появления нескольких сотен пользователей и заполнения реестра в отдельные моменты более чем 2 миллионами префиксов схождение BGP-процесса сервиса могло занимать десятки минут, со всеми вытекающими в виде разрыва сессий по таймауту. Many Bothans died to… Многие оптимизации были сделаны в попытках решить эту проблему, включая миграцию с VPS на выделенный сервер, разделения на фронт- и бэкенды и т.п., но кардинально проблема была решена только отказом от раздачи по BGP списка отдельных IP-адресов.
Если вам необходим список отдельных адресов, вы можете получать их с сайта по HTTPS и далее внедрять в свое решение, например, как описано в статье Настройка BGP для обхода блокировок, или «Как я перестал бояться и полюбил РКН». Мало того, с сайта доступно гораздо больше разных списков, в том числе и в формате Mikrotik Address List, что позволяет более гибко использовать решение.
РКН замедляет Twitter, решение может помочь?
По сути — нет, потому что все эти замедления не отражаются в реестре (хотя законность такого действия спорна, но who cares). Для замедления используются ресурсы расставленных у операторов связи ТСПУ (DPI от компании RDP.RU), управление которыми идет централизованно и закрыто от постороннего взгляда. И высока вероятность, что в недалеком будущем вся фильтрация уйдет в эту сторону и реестр перестанет быть источником данных для нас.
Мысль о развитии кастомных списков «Вот эти IP-адреса надо сделать доступными для обхода замедления» есть, но для бесплатного пет-проджекта нахрапом это требует чересчур много постоянных инвестиций. Если удастся придумать форму, в которой я смогу тратить на этот сервис разумное количество собственных сил и средств — обязательно реализую и опишу. Кстати, если у кого-то есть идеи, как это сделать, пишите в комментариях, обсудим. Ибо одна голова — хорошо, а две — мутация.
У меня есть вопрос, ответа на который нет в Q&A
Задайте его в комментариях к статье. Постараюсь ответить на все там же, а если вопрос будет интересен большому числу читателей — добавлю в Q&A.
Заключение
Предполагаю, что реестр как источник IP-префиксов для обхода блокировок исчерпает себя в начале-середине 2022 года, поэтому вряд ли эта статья потребует новой версии, скорее просто уйдет в архив как неработающее решение.
Мечтаю, впрочем, что это и подобные решения станут иметь исключительно историческую ценность и интернет будет тем, чем был раньше — транспортом для информации вне политики. Но эти мечты вряд ли сбудутся.
Так что, как обычно, буду рад, если статья кому-то поможет или, что еще лучше, сподвигнет более глубоко изучать сетевые технологии. Потому что в грамотности — наша сила.
Полезные ссылки
Прежде всего статья Настройка BGP для обхода блокировок, или «Как я перестал бояться и полюбил РКН» — она была наиболее полной и подробно описывающей логику решения. Если вам хочется более глубоко погрузиться в концепцию — эта статья практически идеальна (разве что сейчас уже имеет смысл внедрять это на bird v2, с соответствующей коррекцией конфигураций решения). И еще более полезны комментарии к ней.
Если вам интересно более глубоко понять, что такое и с чем едят BGP в частности и сетевые технологии вообще — не могу не порекомендовать «Сети для самых маленьких» от проекта LinkMeUp
Если вам хочется решение на Address List — NeoBeZ опубликовал короткий скрипт для выгрузки нужного с сервиса. Не забудьте, что потом по этому листу нужно реализовать набор правил для перенаправления трафика.
Для роутеров Keenetic есть решение от Александра Рыжова. Оно, конечно, базируется на старой версии сервиса, но легко корректируется под новую.
Конфиг для микротика с 7й прошивкой:
/routing bgp template
add as="ВАША ВЫДУМАННАЯ AS БЕЗ СКОБОК" disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m multihop=yes name=antifilter routing-table=main
/routing bgp connection
add disabled=no hold-time=4m input.filter=bgp_in .ignore-as-path-len=yes keepalive-time=1m local.address= "ВАШ ВНУТРЕННИЙ ИП БЕЗ СКОБОК" .role=ebgp multihop=yes name=antifilter_bgp remote.address=45.154.73.71/32 .as=65432 router-id="ВАШ ВНЕШНИЙ ИП БЕЗ СКОБОК" routing-table=main templates=antifilter
/routing filter rule
add chain=bgp_in disabled=no rule="set gw *9; accept;" <<<===Вот тут по поводу *9 я не уверен. У емня вместо *9 название VPN интерфейса, но в конфиге именно так.
Java предоставляет концепцию методов, которые помогают нам в управлении временем посредством повторного использования кода. Если мы говорим о пользовательских методах, мы должны создать/написать их один раз и можем использовать их снова и снова. В Java метод — это не что иное, как набор инструкций, который вступает в действие только тогда, когда кто-то его вызывает.
В этой статье мы собираемся изучить следующие основные концепции определяемых пользователем методов Java:
Что такое Java-метод
Синтаксис метода
Как создать метод
Как вызвать метод
Итак, начнем!
Что такое метод в Java
Метод, также известный как функция, представляет собой блок кода/инструкции, который может принимать или не принимать входные данные в качестве параметров/аргументов и возвращает некоторый результат. Указанный блок кода будет выполняться только тогда, когда кто-то вызывает/вызывает его. В java метод должен быть создан/объявлен внутри класса.
Синтаксис метода Java
Ниже будет синтаксис объявления метода:
publicstaticvoid firstFunction(){
statement(s);}
Здесь, в приведенном выше фрагменте кода, public — это модификатор/описатель доступа, static — ключевое слово, void — тип возвращаемого значения, а firstFunction() — имя определяемого пользователем метода.
Java предлагает несколько модификаторов доступа, таких как default, private, public и protected. Эти модификаторы определяют тип доступа к функции, как указано ниже:
Модификатор доступа public определяет, что функция доступна для всех классов/подклассов.
Модификатор доступа protected указывает, что метод доступен только внутри определенного пакета.
Модификатор доступа private определяет, что функция доступна только тем классам, где она указана
Модификатор доступа default определяет, что функция доступна для классов того же пакета.
Java имеет широкий спектр ключевых слов, которые имеют некоторые специальные значения и используются для определенных целей, например, ключевое слово static определяет, что функция может получить доступ к статическим данным.
Тип возвращаемого значения определяет тип данных, которые будут возвращены функцией; например, void используется, когда тип данных не возвращается.
Как создать метод в Java
В Java метод можно создать, указав его имя, и мы должны следовать соглашению об именах в верблюжьем регистре.
Для более глубокого понимания давайте рассмотрим пример, который позволит вам понять, как создать пользовательский метод Java:
Пример
В этом примере мы собираемся вычислить куб введенного пользователем числа.
publicclass MethodExample{staticvoid findCube(){int number, cube;
Scanner scan =new Scanner(System.in);System.out.print("Enter a Number: ");
number = scan.nextInt();
cube = number * number * number;System.out.println("Cube of "+ number +" is : "+ cube);}
У нас есть класс «MethodExample», и внутри класса мы создали метод findCube(). Затем мы использовали встроенный класс Scanner, чтобы получить данные, вводимые пользователем. После этого у нас есть переменная «cube», в которой будет храниться куб числа.
Как вызвать метод в Java
Как только создание метода завершено, мы можем вызвать его, указав имя метода, за которым следует (), как мы сделали в следующем фрагменте кода:
Для лучшего понимания рассмотрим полный фрагмент кода и его вывод:
Использование класса сканера помогает нам получать ввод от пользователя, и когда мы запускаем код, пользователь вводит число «3», и, следовательно, мы получаем куб этого числа, т.е. «27». Он показывает уместность пользовательского метода.
Заключение
Метод, также известный как функция, представляет собой блок кода/инструкции, который может принимать или не принимать входные данные в качестве параметров/аргументов и возвращает некоторый результат. Более того, указанный блок кода будет выполняться только тогда, когда кто-то вызывает/вызывает его. В java метод можно создать, указав модификатор доступа, тип возвращаемого значения, за которым следует определяемое пользователем имя метода. И чтобы вызвать метод, нам нужно указать имя метода, за которым следуют маленькие скобки (). В этой статье представлен подробный обзор того, что такое метод и как вызывать метод в Java, а для более глубокого понимания в нем приводится пример вместе с описательным снимком экрана.
Redis — это бесплатная размещаемая в памяти база данных с открытым исходным кодом, широко используемая в качестве механизма кэширования или брокера сообщений.
Хотя по умолчанию он очень универсален и обширен, он позволяет расширять функциональные возможности с помощью встроенного интерпретатора Lua. Это означает, что вы можете писать сценарии на Lua для выполнения дополнительных операций с вашей базой данных Redis.
Требования
Чтобы лучше следовать этой статьи, мы рекомендуем установить в вашей системе последнюю версию сервера Redis.
Базовые знания Redis полезны для понимания команд, показанных в этой статье.
Команда Redis EVAL
Чтобы запускать команды Lua в Redis, вам нужно использовать команду EVAL. Команда указывает Redis выполнять код как сценарий Lua на стороне сервера.
Пример показан ниже:
127.0.0.1:6379> EVAL "redis.call('SET', KEYS[1], ARGV[1])" 1 key value
В приведенном выше примере мы начинаем с команды EVAL, за которой следует сценарий Lua. Скрипт использует функцию redis.call. Затем мы передаем команду для запуска, ключ и значение в качестве аргументов. Это похоже на запуск значений ключа SET.
Обратите внимание, что KEYS и ARGV обозначают аргументы скрипта. В этом случае мы указываем количество ключей как 1.
Разбор аргументов выполняется через ARGV, который содержит таблицу аргументов. В нашем случае мы передаем значение ключа.
Затем мы можем получить доступ к ключам, начиная с индекса 1.
Примечание
Рекомендуется указывать все ключи, используемые в сценарии, в разделе KEYS, а все остальные аргументы — в разделе ARGV.
Мы можем получить значение ключа с помощью команды get:
Чтобы удалить все загруженные скрипты, выполните команду:
127.0.0.1:6379> SCRIPT FLUSH
OK
Приведенная выше команда должна очистить кеш скрипта.
Заключение
В этой статье описываются самые основные команды, которые можно использовать при работе со сценариями LUA в Redis. Ознакомьтесь с документацией по Lua, чтобы узнать больше.
Объявлено о запуске новая версия бесплатная платформа для развертывания децентрализованных социальных сетей «Мастодонт 3.5», версия, в которой выделены некоторые важные изменения, такие как редакция публикаций, улучшения для модераторов и прочее.
Тем, кто не знаком с Мастодонтом, следует знать, что это бесплатная платформа для развертывания децентрализованных социальных сетей, который позволяет вам создавать услуги на ваших собственных объектах, которые не контролируются отдельными поставщиками.