• Сложная маршрутизация на linux роутере. Как правильно готовить policy based routing?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    По поводу этого лучше всего начать с LARTC HOWTO.

    Если кратко, маршрутищация в iproute2 устроена так. Есть несколько таблиц маршрутизации, из которых 3 есть всегда (local, main, default), но можно создать ещё. По правилам (команда ip rule) перебираются таблицы, подходящие под условия, в соответствии с приоритетами (preference, первое число в выводе команды). И в каждой таблице есть свои маршруты. Таблицу local изменять нельзя и перед ней ничего маршрутизировать нельзя (это можно обойти через nat в PREROUTING, но это уже другой вопрос).

    Самый простой вариант - это source routing. Впервые мне это понадобилось, когда я подключил дома второго провайдера с внешним IP, и мне потребовалось отвечать с обоих внешних адресов со всего интернета. Делается так:

    1. В /etc/iproute/rt_tables описываем псевдонимы для новых таблиц (необязательно - можно использовать числовые идентификаторы - но так удобнее). Например, 10 - isp1, 20 - isp2.

    2. Задаём правила, которые приведут к выбору таблицы в зависимости от source address:

    ip rule add pref 10 from IP1 lookup isp1
    ip rule add pref 20 from IP2 lookup isp2

    3. В каждую таблицу добавим маршрут default через нужного оператора:

    ip route add default via GATEWAY1 table isp1
    ip route add default via GATEWAY2 table isp2

    4. В таблице main (которая используется по умолчанию, если не указать таблицу в команде явно) описываем маршрут "по умолчанию" - через того оператора, через которого будет идти исходящий трафик (не ответный на входящий), в данном случае пусть будет isp1:

    ip route add default via GATEWAY1

    Всё это иногда можно в той или иной степени засунуть в конфиги сети (зависит от дистрибутива Linux весьма существенно), а иногда приходится делать скриптами, в том числе, возможно, вызываемыми через hook системы инициализации сети (я, например, обновлял маршрутизацию через postup-хук dhcp-клиента и из скрипта, который поднимал pptp-vpn).

    В дальнейшем всё это обросло кучей других особенностей, например, ip rule fwmark по меткам, которые ставилилсиь в iptables по connmark и иногда другим условиям, но это уже следующий уровень сложности и более специфичне задачи. И LARTC HOWTO почитать всё равно рекомендую, ибо там основа основ и все гуру по нему учились.
    Ответ написан
    3 комментария
  • Почему Python не видит библиотеку?

    @Everything_is_bad
    import SpeechRecognition
    вот откуда ты взял этот код? Сам придумал? Открой доки SpeechRecognition и почитай как его использовать. И это надо делать сразу, перед тем как бежать сюда
    Ответ написан
    Комментировать
  • Как правильно разбить csv файл?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Прочитать файл построчно, разбить каждую строку по разделителю, условным оператором проверить, что первый элемент начинается с "example", в истинном блоке записать строку в один файл, в ложном в другой. Либо примерно то же, но с помощью спискового включения с группировкой.
    Ответ написан
    Комментировать
  • Как найти проблему в локальной сети?

    @Gansterito
    Нужно начать со структурирования сети:
    1) Убрать гирлянды, каждый коммутатор должен быть включен в один центральный "агрегатор", лучше L3.
    2) Сегментировать L2 домены с помощью VLAN.
    3) Настроить механизмы Loopback detection/Storm control и пр.
    4) Настроить DHCP Snooping/IP Source Guard и пр. для ограничения статических IP.
    5) Мониторинг: опрос всех устройств по SNMP, сбор логов по SYSLOG.
    Ответ написан
    Комментировать
  • Почему VS Code не распознает, что функция вернет tuple?

    Vindicar
    @Vindicar
    RTFM!
    Потому что оба оверлоада неразличимы - они ОБА показывают один аргумент типа bool.
    И да, а если аргумент не указан, что вернёт функция? Из твоего кода это неясно вообще, так как у тебя два противоречащих варианта.
    Тебе надо что-то типа...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[False] = False) -> str:
        ...
    @overload
    @classmethod
    def get_mac_address(cls, with_gateway: typing.Literal[True]) -> tuple[str, str]:
        ...
    @classmethod
    def get_mac_address(cls, with_gateway: bool = False) -> typing.Union[str, tuple[str, str]]:
        ...
    Ответ написан
    3 комментария
  • Где у меня дыра в SMTP?

    ValdikSS
    @ValdikSS
    Запустите mailq и посмотрите, что за письма и от кого у вас в очереди. Далее смотрите заголовки в самих файлах писем, в них будет IP-адрес источника.

    Если источник 127.0.0.1, то могу предположить, что у вас на этом сервере установлен некий прокси (HTTP/SOCKS), разрешающий доступ в локальную сеть, и письма отправляют через прокси, а postfix считает их локальными и не требует аутентификации — это довольно типичная мисконфигурация.

    Если прокси нет, быть может, у вас включена маршрутизация общая, маршрутизация в localhost (net.ipv4.conf.*.route_localnet), в таком случае соседи по датацентру также могут маршрутизировать вам трафик в 127.0.0.1 (это нетипичная и редкая конфигурация, но иногда такое может встречаться [1], [2]).
    Ответ написан
    2 комментария
  • Как настроить проброс ARP пакетов (ARP-proxy) через OpenVPN туннель Mikrotik-Mikrotik?

    @agpecam
    Мы не знаем достоверно как "обнюхиваются" приложение и телевизор. Broadcast-arp - это может быть просто следствием пробы определенных портов. Ок, если предположить, что приложение ищет в сети устройства определенного производителя по первым 3 октетам MAC, то значит оно сканирует все IP подсети, к которой подключено. Иных способов, кроме ARP запрос who has IP... для получения MAC протокол ARP не предполагает. В этом случае, во-первых, у вас телевизор в другой подсети, а во-вторых ARP-proxy на такой запрос ответит своим MAC, а не MAC телевизора с закономерными последствиями. Если ищет перебором IP : some port и в приложении нет возможности задать не свою подсеть - результат тот же.
    Вам по сути нужно поместить сети офисов в один L2 сегмент, т. е. на микротиках сделать OpenVPN mode: ethernet, внести tap интерфейсы в bridge локальной сети и дать понять приложению, что удаленная сеть находится с ним в одном L2 сегменте, например, с помощью DHCP option 121, т. е. переделать всю сеть ради телевизора. Оно вам надо?
    Ответ написан
    1 комментарий
  • Как настроить webhook для бота aiogram 3 и nginx?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Код на python использует polling, причём тут вебхуки? Для вебхуков надо web app сделать, который их принимает. Вот в документации пример: https://docs.aiogram.dev/en/latest/dispatcher/webh... и там же есть образец настройки nginx.
    Ответ написан
    Комментировать
  • Стоит ли идти на практику в компанию?

    Wispik
    @Wispik
    Почему часто ставится вопрос или то или то? Почему нельзя совмещать? Никто не мешает ходить на практику, а в свободное время делать свой пет проект (условно по тем же выходным). Тем более пет проект - это не фултайм работа, а хобби.
    Плюсы практики это общение с людьми, которые умеют писать код. И как ответили выше уйти можно всегда
    Ответ написан
    Комментировать
  • Стоит ли идти на практику в компанию?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Если это официальный найм с записью в трудовой, то идти не задумываясь. Сейчас тысячи обладателей вышки месяцами дерутся за вакансии, готовые работать даже бесплатно ради получения первой записи в трудовую.
    Ответ написан
    Комментировать
  • Стоит ли идти на практику в компанию?

    Maksim_64
    @Maksim_64
    Data Analyst
    Совместить плюсы первого и второго варианта. Идти на стажировку и развиваться самому. Улучшением текущих и получением новых навыков, занимаются и уже работающие опытные специалисты, а у тебя все еще впереди. Зовут в какую то компанию иди, уйти можно всегда, плохо когда никуда не зовут.
    Ответ написан
    Комментировать
  • Как ввести несколько строк в стандартный ввод python?

    Vindicar
    @Vindicar
    RTFM!
    Стандартный ввод - это файл, и его технически можно "прочитать до конца". Пример:
    import sys
    for line in sys.stdin:
        print('Got', repr(line))
    print('Done')

    Запусти как обычно, введи несколько строк, а потом в терминале (если под виндой) нажми Ctrl-Z, затем Enter.
    Это пошлёт сигнал "конец файла", и дальнейшие попытки ввода через input() будут не успешными.

    Также можешь записать строки в текстовик, и запустить файл с перенаправлением ввода:
    python3 main.py < data.txt
    Тогда скрипт тоже получит сигнал о конце ввода, когда файл закончится.
    Ответ написан
    1 комментарий
  • Почему при запросе фотокарточки из БД с помощью телеграмм-бота возникает ошибка?

    @Everything_is_bad
    peck69 просит вас как эксперта ответить на вопрос
    тебе еще вчера же ответили, используй FSInputFile, а не InputFile, даже в доки потыкали.
    Ответ написан
    Комментировать
  • Где найти гайд по deeplink aiogram3?

    lk13s
    @lk13s
    Ответ написан
    Комментировать
  • Как останавливать зависящие контейнеры от контейнера базы данных, если бд остановится/крашнится?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Поле depends_on определяет только последовательность запуска и удаления сервисов, к остановке отношения не имеет.
    Искомое вами поведение задаётся через healthcheck проверки доступности базы в backend и бэкенда во frontend... или простой docker compose -f путь/до/docker-compose.yaml stop, т.е. просто остановить все сервисы.
    Ответ написан
    Комментировать
  • Как пололучить int8 из байта?

    @rPman
    пакет struct метод unpack
    data=b'\xc8'
    struct.unpack('b', data)[0]

    data типа bytes, можно считывать из файла, открывая как бинарный файл, флаги 'rb'
    Ответ написан
    1 комментарий
  • Как написать тг бот-секундомер на питоне?

    Vindicar
    @Vindicar
    RTFM!
    В коде дикая каша - или у тебя отступы уехали чёрт знает куда. Такое не заработает.
    Начни с официальных примеров, найди среди них наиболее похожий - скажем, вот этот таймер. Разберись, как он устроен, и потихоньку модифицируй.
    Разумеется, предполагается, что ты хотя бы насколько-то знаешь питон. Если это не так - откладываешь бота и учишь язык.
    Ответ написан
    Комментировать
  • Как сделать инсталлятор mongoDB и собственного приложения одновременно?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    RTFM - MongoDB Manual / Installation / Community Edition / Install on Windows: https://www.mongodb.com/docs/manual/tutorial/insta...
    Ответ написан
    Комментировать
  • Не настраиваются разные уровни логирования в python logging?

    Vindicar
    @Vindicar
    RTFM!
    Ты задал уровень WARNING для самого логгера (не для хэндлеров), поэтому он INFO отбрасывает сходу. До хэндлеров ничего не доходит просто.
    Я бы использовал эту либу немного по-другому (пример с её гитхаба)
    t_handler = tg_logger.TgLoggerHandler(users=[...], token=TELEGRAM_TOKEN)
    t_handler.setLevel(logging.WARNING)
    logger.addHandler(t_handler)

    Так куда более похоже на обычные лог-хэндлеры, проще управлять и читать даже если с либой мало знаком.
    Ну или если очень хочется setup(), то так:
    t_handler = tg_logger.setup(logger, token=token, users=users, tg_format="<b><u>%(name)s</u> : %(levelname)s</b>\n\n<code>%(message)s</code>")
    t_handler.setLevel(logging.WARNING)


    Так что логгеру задай уровень подетальнее, INFO или даже DEBUG, а тонкую настройку делай на уровне хэндлеров.
    Ответ написан
    2 комментария