Реагируем на вандализм кабеля быстро, повсеместно и без физических ловушек

    Привет.

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

    image

    Для тех, кому лень читать. Как это работает: мониторим падения сессий на радиусе, группируем по коммутаторам, тестим линию, шлем уведомление.

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

    Оборудование в компании на 99% состоит из D-link, поэтому SNMP MIB приведены для этого вендора. Некоторые из них RFC и должны подходить и к другим производителям.

    Немного истории о том, из чего всё это вытекло.

    Все началось весной 2018. На группу техподдержки(ТП) возросла нагрузка. Помимо отработки звонков абонентов, ТП также координировала монтажников при подключении новых абонентов, а также при выезде на восстановление и дебаг уже существующих клиентов. Нужно было немного разгрузить ТП и дать некие инструменты в руки монтажникам. Было решено сочинить мессенджерного «бота», который на вход принимал бы логин/договор абонента и монтажник прямо в полях мог бы сам произвести минимальный дебаг.

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

    Теперь немного кода и перейдем к сути поста.

    И так, что же может потребоваться монтажнику в полях:

    1. Тест кабеля конечно же
    2. Просмотр ошибок на порту
    3. Просмотр статус порта
    4. Посмотреть, есть ли МАК-адреса на порту. (вдруг абонент включил кабель в LAN порт вместо WAN)
    5. IPTV подписки
    6. Посмотреть логи авторизаций
    7. Баланс, статус

    Взаимодействовать с коммутаторами будем по SNMP, и кое-где по telnet.

    В качестве веб-фреймворка использовал Bottle.

    И так,

    импортируем нужные либы
    #!/usr/bin/python
    # -*- coding: utf_8 -*-
     
    from bottle import route, run, template, auth_basic, request, error
    from lib import crm, snmp, gis, billing
    import time
    


    Добавляем лист с API ключами и декораторы для проверки, не будем же мы отдавать данные всем подряд).

    код
    apikeys = ['RANDOM_KEY1', 'RANDOM_KEY2']
    
    api_error = '{"error":"apikey invalid"}'
    host_down_error = '{"error":"host down"}'
    
    
    def apikey_checker(fn):
        def wrapper(*args, **kwargs):
            if not check_apikey():
                return api_error
            return fn(*args, **kwargs)
        return wrapper
    
    def check_apikey():
        return 'apikey' in request.query and request.query['apikey'] in apikeys
    


    Ну и собственно пара функций для взаимодействия с оборудованием.

    код
    @route('/port_status/<ip>/<port>')
    @apikey_checker
    def get_port_status(ip=' ', port=' '):
        return snmp.port_status(ip, port)
    
    @route('/cable_test/<ip>/<port>')
    @apikey_checker
    def get_cable_test(ip, port):
        return snmp.cable_test(ip, port)
    


    Внутри snmp либы у нас словарь с расшифровкой возвращаемых SNMP статусов пары на порту.

    Словарь статусов

    pair_status = {
        '0': 'ok',
        '1': 'open',
        '2': 'short',
        '3': 'open-short',
        '4': 'crosstalk',
        '5': 'unknown',
        '6': 'count',
        '7': 'no-cable',
        '8': 'other'
    }
    


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

    Скрытый текст
    pair_result = {
        'pairs': {
            1: {
                'status': '-',
                'length': '-'
            },
            2: {
                'status': '-',
                'length': '-'
            },
            3: {
                'status': '-',
                'length': '-'
            },
            4: {
                'status': '-',
                'length': '-'
            },
        }
    }
    


    Функция

    теста кабеля
    def cable_test(ip, port):
    
        if not check_ip(ip):  # чекаем не прислали ли нам ерунду вместо IP
            return {'error': "IP %s invalid" % (ip)}
    
        host_status = check_host(ip)  # чекаем доступен ли свитч по управлению
        if host_status['status'] == 'down':
            return {'error': u"Свитч недоступен"}
    
        result = copy.deepcopy(pair_result)
    
        # не тестим кабель, если порт UP, т.к. есть оборудование которое теряет
        # линк на порту при тестировании.
        if port_status(ip, port)['status'] == 'down':
            try:
    
                mib = '.1.3.6.1.4.1.171.12.58.1.1.1.12.%s' % str(
                    port)  # миб инициализации тестирования на порту
    
                # запускаем тест и ждем секунду пока он завершится
                snmp_int_set(ip, mib, 1)
                time.sleep(1)
    
                # забираем результаты измерений
                result['pairs'][1]['status'] = pair_status[
                    snmp_get(ip, '.1.3.6.1.4.1.171.12.58.1.1.1.4.%s' % str(port))]
                result['pairs'][2]['status'] = pair_status[
                    snmp_get(ip, '.1.3.6.1.4.1.171.12.58.1.1.1.5.%s' % str(port))]
                result['pairs'][3]['status'] = pair_status[
                    snmp_get(ip, '.1.3.6.1.4.1.171.12.58.1.1.1.6.%s' % str(port))]
                result['pairs'][4]['status'] = pair_status[
                    snmp_get(ip, '.1.3.6.1.4.1.171.12.58.1.1.1.7.%s' % str(port))]
    
                result['pairs'][1]['length'] = snmp_get(
                    ip, '.1.3.6.1.4.1.171.12.58.1.1.1.8.%s' % str(port))
                result['pairs'][2]['length'] = snmp_get(
                    ip, '.1.3.6.1.4.1.171.12.58.1.1.1.9.%s' % str(port))
                result['pairs'][3]['length'] = snmp_get(
                    ip, '.1.3.6.1.4.1.171.12.58.1.1.1.10.%s' % str(port))
                result['pairs'][4]['length'] = snmp_get(
                    ip, '.1.3.6.1.4.1.171.12.58.1.1.1.11.%s' % str(port))
    
                return result
            except Exception as e:
                print(e)
                return {'error': u'Возникла ошибка при тестировании кабеля'}
        else:
            return {'error': u'Порт не готов к тестированию. Возможно порт Link UP.'}
    


    фунция вернёт

    результат
    {
        "pairs": {
            "1": {
                "status": "other",
                "length": "0"
            },
            "2": {
                "status": "open",
                "length": "4"
            },
            "3": {
                "status": "open",
                "length": "4"
            },
            "4": {
                "status": "other",
                "length": "0"
            }
        }
    }
    


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

    Вот так примерно стал выглядеть бот

    image

    Теперь к сути поста.

    До реализации дебаг сервера использовалась технология аналогичная описанной в посте habr.com/post/188730. Петля на порту с включенным SNMP трапом. При падении «самолинка» на порту в мониторинг падало сообщение об этом.

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

    Однако, таких физических ловушек было примерно только на 10% коммутаторов, а этого оказалось мало.

    Позже придумали мониторить радиус. И это позволило увеличить процент покрытия мониторингом до 100%. И вот тут уже все разнится от инфраструктуры провайдера.

    Периодически смотрим, сколько упало клиентских сессий с того или иного коммутатора. Сделать это легко, если на коммутаторах включены circuit_id, который имеет вид

    D4:CA:6D:0A:66:C9::192.168.20.86::20

    Тут у нас MAC абонента, IP коммутатора, номер порта абонента. Т.е. всё что нужно для дебага.
    Группируем завершенные сессии по IP коммутатора, если таких сессий больше некоторого количества (у нас установлен триггер на 2 сессии в минуту), то скрипт обращается к дебаг серверу и тестит порты упавших сессий. Если порты всё также лежат и на них открыты или закорочены пары кабеля, и длинна хотя бы на двух портах одинакова (+- 2 метра), а именно так выглядит обрез кабеля глазами свитча, то считаем ситуацию подозрительной и отправляем сообщение оператору.

    Конечно будут ложные срабатывания, когда моргнёт свет в доме, или просто совпадет что абоненты выключат кабель одновременно и длина будет одинакова, но это тот случай, как говорится, когда лучше перебдеть. Кроме того можно сделать ограничение по длине (реагировать только на короткие длины), количеству одновременных падений и пр.

    Вот реальное сообщение о подозрительном событии.

    image

    И результаты отработки таких сообщений

    image

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

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

    Так скрипт стал показывать неплохие результаты и за 4 месяца работы было успешно отработано ВОХР, полицией, и самими сотрудниками провайдера более 10 случаев вандализма. Поэтому я и решил поделиться концептом такого мониторинга.

    Сейчас скрипт мониторит около 15000 коммутаторов без каких-либо физических «ловушек» и SNMP трапов.

    Всем удачи в новом году!

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 48

    • UFO just landed and posted this here
        0
        Fluke не покажет баланс и статус абонента, логи авторизаций, ошибки на порту и пр.)
        Сигнализация стала побочкой от основной задачи.
        • UFO just landed and posted this here
            0
            Ну вот почему бы не дать возможность монтажнику увидеть логи из которых он бы увидел что проблема в привязке к маку. И звонок в ТП бы не потребовался. Можно было бы сразу лезть в дебри ЛК)
            • UFO just landed and posted this here
        0
        Прочитал начало и сначала подумал про обычные телефонные кабели. В этом случае охранять кабели, которые периодически могут вырезать, можно аппаратно с помощью какого-нибудь «Сигнал-20» (охранно-пожарная сигнализация). Жертвуем одной парой и на дальнем конце в шкафу делаем КЗ или устанавливаем резистор (нужно ориентироваться на документацию прибора).
          0
          Добавил в начало поста, что речь об Ethernet.
          Касаемо жертвования одной пары, я ссылаюсь на статью, где аналогичный подход.У нас он тоже используется. Порт заворачивают сам на себя, и мониторят его линк. Сложность в том, что эта петля физическая, ее нужно сделать, и она уменьшает портовую емкость.
          +4
          > работы было успешно отработано ВОХР, полицией, и самими сотрудниками провайдера более 10 случаев вандализма

          А как выглядит отработка вандализма сотрудниками провайдера? По закону, пока они не уверены что наступила угроза их здоровью и жизни, они не имеют права задерживать вандалов и вообще трогать их руками, максимум — вынести строгое словесное порицание.
            +3
            Злоумышленик, подскальзываясь, падает на свой кулак пару раз и ждёт приезда силовиков
            Да основная задача как либо задержать их, хоть заблокировав выходы с чердака, так было не раз. Идти в открытую конфронтацию естественно опасно. Силовики всё равно приедут, т.к. проишествие им уже сдали.
            Нередки случаи, когда монтажники работали в паре домов от проблемного. И конечно они могли быть на месте уже через минуту две, у ВОХРа и полиции такой скорости пока нет.
              +4
              По закону, пока они не уверены что наступила угроза их здоровью и жизни, они не имеют права задерживать вандалов

              19. Право на задержание лица, совершившего преступление, имеют не только уполномоченные на то представители власти, но и иные лица, в том числе пострадавшие от преступления, или ставшие его непосредственными очевидцами, или лица, которым стало достоверно известно о его совершении. Положения статьи 38 УК РФ могут быть применены в отношении указанных лиц в случае причинения ими вреда при задержании лица, совершившего преступление.

              ППВС №19 от 27.09.2012
                +3
                Статья 38 УК РФ:

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

                Суровые монтажники. Я бы не стал рисковать уголовной статьёй, защищая оборудование работодателя, тем более если туда уже едет полиция. Пойди угадай, как пойдёт борьба и что суд потом сочтёт «явно чрезмерным, не вызываемым обстановкой вредом».
                  +1
                  Ну и правильно. Люди как волки, лишь бы кого загрызть. Вам не нужно задерживать нарушителей — достаточно просто их сфотографировать, при желании проследить, куда они пытаются скрыться, а потом пусть полиция их задерживает. Граждане этим заниматься не должны.
                    +3
                    > Граждане этим заниматься не должны.

                    Зависит от законодательства и правоприменитильной практики в стране. У нас действительно не стоит, вот я и удивляюсь, что монтажники так рискуют.
                      0
                      В любом случае, тут размер ущерба копеечный, максимум несколько тысяч долларов, нельзя из-за таких денег бить людей, пусть уходят. Главное, чтобы наказание было неотвратимым.

                      Ну и конечно, все работы в здании должны согласовываться, а за работы без согласования должен быть очень здоровый штраф или даже уголовный срок за повторные нарушения.
                        0
                        Ну, заблокировать выходы с чердака или подвала может быть и не особо рисковано.
                          0
                          Потом один из них засвидетельствует, как второй кричал «дяденьки, вызовите скорую, мне плохо, я задыхаюсь». И вуаля, появляется чрезмерный вред.

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


                  Нельзя.
                  Пришьют разжигание или возбуждение…
                    +5
                    К социальной группе «воры»
                    0
                    Мне тоже интересно. Как ВОХР и прочие сотрудники провайдера вообще в дом попали. Кто их туда пустил?
                    +3
                    А интересно, какое было наказание за повреждение кабелей? Крупные 6-значные штрафы + компенсация убытков?
                      +3
                      Обычно всё заканчивается сотнями часов общественных работ. Или штраф тысяч в пять). Реально, и всё.
                      Реже дают срок, но это тем, кто ранее уже был судим.
                      Ещё реже мировое в суде, если подозреваемые оплачивают требования компании.

                      Если задержали при попытке хищения, а кабель уже обрезать успели, нельзя предъявить ущерб, так как это ПОПЫТКА хищения, а не оно само.)
                        0
                        «УК РФ Статья 215.2. Приведение в негодность объектов жизнеобеспечения
                        1. Разрушение, повреждение или приведение иным способом в негодное для эксплуатации состояние объектов энергетики, электросвязи,… наказываются штрафом в размере от ста тысяч до пятисот тысяч рублей или в размере заработной платы или иного дохода осужденного за период от одного года до трех лет, либо обязательными работами на срок до четырехсот восьмидесяти часов, либо исправительными работами на срок до двух лет, либо принудительными работами на срок до трех лет, либо лишением свободы на тот же срок.»
                        ?
                          +1
                          «объектов жизнеобеспечения». давно интернет стал жизненно необходимым на уровне закона? в Европе — да, стал.
                            0
                            Он просто попал в категорию «электросвязь», а она давно «объект жизнеобеспечения».
                              –2
                              у вас проблема с логикой. не каждая «электросвязь» попадает в «объект жизнеобеспечения». по вашему, разбить управляемую со смартфона лампочку — тоже статья 215.2?
                                +2
                                Каждая, лицензии на что, на интернет?
                                Все что в хате это абонентские устройства и их можно, тем более самому абоненту.
                                По IP сейчас и радио и ТВ и телефон.
                              –7
                              Т.е. если горе-монтажники, понабранные по объявлениям наворотили соплей и дырок в твоём подъезде, и эти сопли срезаешь к чёртовой бабушке, так ещё и виноват будешь? (Я сейчас про косорукий монтаж, а не качественный, где используются кабель-каналы и всё по ГОСТ-ам)
                                +3
                                вы даже не смогли ответить под тем комментарием под которым хотели.
                                  –8
                                  Зато вы восстановили справедливость. Возьмите с полки пирожок.
                                  0
                                  Начнем с того, что подъезд не ваш личный (если только вы не владелец здания и богатей).
                                    +1
                                    Не спорю, подъезд, собственность коллективная. А значит, было бы неплохо, например, спросить соседей. В моём случае сосед провёл себе интернет с телевидением через мою дверь. Кабель был приколочен к стене гвоздями на скобы. Спустя пару дней, это безобразие свисало на дверь. Я человек не конфликтный, прикрепил кабель к стене спустя пару дней, как меня эти сопли достали. Но всё же, подобные сопли подъезд не украшают. И это стало нормой. Мы с этим живём.
                                    К сожалению человека можно вывести из деревни, а деревню из человека — увы нет.
                                +1
                                Оперирую информацией от нач.отдела подключений, неоднократно посещавшего судебные заседания.
                                0
                                Все равно, как мне кажется, не с юридической, а с человеческой точки зрения, нужно возмещать ущерб на восстановление сети и потери, в т.ч. репутационные.
                              +9

                              Без физических ловушек… Сперва представил капканы

                                0

                                Что на самом деле подразумевается под «физической ловушкой»?

                                  +2
                                  Замкнутые пары на кабеле(петля), и snmp трап на падение линка.
                                    –1
                                    (петля)


                                    Ловчая, ака силок.
                                  0
                                  … потом подумал и добавил до кучи минно-взрывные и электрифицированные заграждения?
                                    +1
                                    А я подумал, что оно как-то током бьёт.
                                    –10

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

                                      +12
                                      Ох, три раза ваш комментарий перечитывал. Экстра-скилл по обесцениванию. Типа, похвалил, но так, что обидно.
                                        –2
                                        Извините, если обидел чем. Такой цели перед собой не ставил
                                      +1
                                      А чем вы кабели тестируете в автоматическом режиме?
                                        0
                                        Длину кабеля?
                                        В коммутаторах длинк которые в основном стоят на доступе у операторов (легендарный 3526) это штатный функционал свича
                                          0
                                          Наверно спрашивают о софте. Коммутатор то умеет тестить, но не будешь же руками всё это делать. Может вообще есть промышленное решение какое то)

                                          легендарный 3526

                                          у нас большая часть 3200 и 3200-28, я бы их назвал легендарными)
                                        0

                                        А кто помнит кабель ТЗГ? Свинцовый такой, герметичный?)))

                                          0
                                          2019 на носу. Проблема решится, если тащить каждому абоненту оптику и в сумме выйдет дешевле, чем городить цепочки программа-монтажник-полиция. В конце концов электрики в своё время озаботились аналогичной проблемой и получили целую серию антивандальных кабелей — ни для кого же не секрет, что кабель, в основном, воруют ради цветмета. Разделение кабеля и оболочки производят отжигом. В антивандальных кабелях во время отжига оболочка сплавляется с металлом без возможности разделения физическими способами. Дешево и практично.
                                            0
                                            На моей памяти у нас кабель срезали чтобы так косу вырезать и унести на цветмет было штук 10 эпизодов за 10+ лет. Ящики вскрывали чтобы коммутатор унести куда чаще.
                                            В основном вся история порезов была связана либо с конкурентами (когда эрзац-команда соседнего оператора в пятницу вечером режет абонентов) либо с банальной ленью монтажников — лень тащить свой кабель/не пройти забитую шахту — отрежу чужой кабель, воспользуюсь им.
                                            Хотя не знаю как на родине ТС, а в ДС2 эти МАСШТАБНЫЕ кабельные войны уже давным давно как канули в лету. Не в последнюю очередь это связано с тем что и конкуренции как таковой не осталось

                                          Only users with full accounts can post comments. Log in, please.