Внешний вид координаторов HW1000
Внешний вид координаторов HW1000
Категория: Железо Теги: ViPNet , СКЗИ Опубликовано: 29 ноября 2021

Экспорт списка клиентов из координатора ViPNet HW1000

Компания Infotecs не предусмотрела возможность вытащить список клиентов с данными о них из своих координаторов ViPNet Coordinator HW1000 и HW2000. Я придумал способ и сейчас им с вами поделюсь.

Все, у кого есть такое средство криптографической защиты информации, должны знать как управлять данным программно-аппаратным комплексом при помощи Putty, так как множество настроек можно сделать только подключив Монитор и клавиатуру к нему или подключившись по SSH.

И так, открываем Putty и до подключения необходимо указать настройки логирования. Открываем вкладку Logging и в Session output ставим All session output. Возможно при использовании Printable output будет меньше мусора в логе, не пробовал. Нажимаем на кнопку Browse и указываем куда сохранить лог. Имя файла оставьте по умолчанию "putty.log".

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

Пишем команду:

iplir show config

и листаем конфиг до самого конца при помощи кнопки PageDown.

Для закрытия режима чтения конфига нажимаем кнопку Q на английской раскладке. И потом закрываем терминал - exit.

Теперь советую установить Notepad++, один из самых популярных текстовых редакторов в мире.

Файл putty.log открываем при помощи Notepad++. Открываем вкладку кодировки \ кодировки \ кириллица \ KOI8-R. Потом опять открываем вкладку кодировки Преобразовать в UTF-8. 

Теперь нужно очистить конфиг от мусора. В Notepad++ есть функция поиска с заменой - Поиск \ Замена. Можно выделить мусор (он будет повторяться) и нажать CTRL+ F и перейти во вкладку Замена. Также поставьте галочку Зациклить поиск, а остальные три наоборот снимите. И можно нажать кнопку Заменить все.

Я далее покажу свой скрипт, но необходимо установить Python, он бесплатен, я использовал версию 3.8.10.

Теперь сам скрипт:

# -*- coding: utf-8 -*-

filename = 'putty.log'

f = open(filename, 'r', encoding='utf-8')

d = open('1.csv', 'w', encoding='utf-8')
starttxt = 'name ;ip ;firewallip ;virtualip ;version ;tunnel \n'

upN = 0 #количество строк
sCh = 0 #счетчик - текушая строка

for l in f: #считаем количество строк в документе
    upN += 1
    
f.close()    
    
f = open(filename, 'r', encoding='utf-8')

piska = []

d.write(starttxt)
h = ''
slovar = {}
for line in f: #анализиуем текстовый файл
    if '[adapter]' in line:
        break
    sCh += 1
    if '[id]' in line:
	    slovar = {}
    line = line.replace("\n", "")
    # if 'id=' in line:
    #     if not 'proxyid' in line:
    #         line = line.replace("id= ", "")
    #         slovar['id'] = line
    if 'name=' in line:
        line = line.replace("name= ", "")
        slovar['name'] = line
    if 'ip=' in line:
        if not 'virtualip' in line:
            if not 'accessip' in line:
                if not 'accessiplist' in line:
                    if not 'firewallip' in line:
                        line = line.replace("ip= ", "")
                        slovar['ip'] = line
    if 'tunnel=' in line:
        line = line.replace("tunnel= ", "")
        try:
            slovar['tunnel'] = line + ', ' + slovar['tunnel']
        except:
            slovar['tunnel'] = line    
    if 'firewallip=' in line:
        line = line.replace("firewallip= ", "")
        slovar['firewallip'] = line
    if 'virtualip=' in line:
        line = line.replace("virtualip= ", "")
        slovar['virtualip'] = line    
    if 'version=' in line:
        line = line.replace("version= ", "")
        slovar['version'] = line  
        try:
            if slovar['tunnel'] == None:
                slovar['tunnel'] = 'Пусто'
        except:
            slovar['tunnel'] = 'Пусто'
        try:
            if slovar['firewallip'] == None:
                slovar['firewallip'] = 'Пусто'
        except:
            slovar['firewallip'] = 'Пусто'
        try:
            if slovar['version'] == None:
                slovar['version'] = 'Пусто'
        except:
            slovar['version'] = 'Пусто'
        try:
            if slovar['virtualip'] == None:
                slovar['virtualip'] = 'Пусто'
        except:
            slovar['virtualip'] = 'Пусто'
    if not slovar == None:
        piska.append(slovar)
    x = (sCh / upN ) * 100
    print('Анализирую конфиг: ' + str(int(x)) + '%')
    
dubli = []  
sCh = 0
print('Записываю данные в файл')  
for stroka in piska: #записываем данные в CSV
    sCh += 1
    x = (sCh / upN ) * 100
    print('Записываю данные в файл: ' + str(int(x)) + '%')
    try:
        StrokaName = stroka['name']
    except:
        continue
    
    try:
        Strokafirewallip = stroka['firewallip']
    except:
        Strokafirewallip = 'Пусто'
    
    try:
        Strokavirtualip = stroka['virtualip']
    except:
        Strokavirtualip = 'Пусто'
        
    try:
        Strokaversion = stroka['version']
    except:
        Strokaversion = 'Пусто'
        
    try:
        Strokatunnel = stroka['tunnel']
    except:
        Strokatunnel = 'Пусто'
    
    if not StrokaName in dubli:
        g = StrokaName + ';' + stroka['ip'] 
        g = g + ';' + Strokafirewallip
        g = g + ';' + Strokavirtualip
        g = g + ';' + Strokaversion 
        g = g + ';' + Strokatunnel + '\n'
        d.write(g)
        dubli.append(StrokaName)

    

d.close()
f.close()

print('Я закончил!')

Данный скрипт можно при помощи Notepad++ или обычного блокнота сохранить в script.py, имя может быть любым, главное, чтобы сохранилось расширение py.

На выходе будет 1.csv, который будет сохранен в папке со скриптом. Это еще не готовый продукт.

Открываем Microsoft Excel, далее пишу по памяти, вкладка данные и там из текста или импорт из текста. Он определит всё правильно по умолчанию, только нужно проконтролировать, чтобы стояла галочка с фиксированными разделителями или просто с разделителя, и выбираем в качестве разделителя ; (точка с запятой).

И всё, там будет таблица со всеми клиентами, включая координаторы. В ней будут поля:

  • name (имя);
  • ip;
  • firewallip;
  • virtualip;
  • version (версия ViPNet Client);
  • tunnel.

Вы сможете узнать реальный и виртуальный IP, при кривых настройках некоторых координаторов реальный IP может проскальзывать через firewallip. Туннели тоже могут быть полезны, как и версия ViPNet.

Алексей Черемных
2554