ayf Опубликовано 10 марта, 2015 · Жалоба С тем, что сайт РКНа падает. Пересоздал файл запроса и подписи. Все равно выдает вот то "некорректное значение". :( В ручном режиме все ок :( Видимо они стали проверять параметры запроса version-id. Я уже отписался - выпала одна выгрузка, поправил версию на 2.1 - всё работает, но у меня perl... Версия не в коде запроса, а в самом запросе - доппараметр. Для перла примерно так my @sendresult = $service->sendRequest $xmlreq, $xmlreqsig, "2.1" ); Не помогло :( Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
YuryD Опубликовано 10 марта, 2015 · Жалоба Не помогло :( К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 10 марта, 2015 · Жалоба У меня пока все работает без проблем, с версией 2.0. Но посмотрел логи, за последнюю неделю с десяток сбоев (таймаутов) было. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ayf Опубликовано 10 марта, 2015 · Жалоба Не помогло :( К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо. Так в ручном режиме все прекрасно прокатывает. :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
YuryD Опубликовано 10 марта, 2015 · Жалоба Не помогло :( К местным бегите, чтобы факт зафактить. Остальное в тп запретинфо. Так в ручном режиме все прекрасно прокатывает. :) Версию в запросе автоматом выбираете ? А в скрипте ? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Antares Опубликовано 10 марта, 2015 · Жалоба У меня тоже в запросе стоит 2.0, отдаёт 2.1 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ayf Опубликовано 10 марта, 2015 · Жалоба Да вроде везде поправлено... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
tramp Опубликовано 10 марта, 2015 · Жалоба У меня тоже в запросе стоит 2.0, отдаёт 2.1 Из "памятки оператору..." в запросе sendRequest: dumpFormatVersion Версия формата, в котором запрашивается выгрузка. Актуальное значение должно быть «2.0» или «2.1». Даже при указании значения «2.0» выгрузка будет выдаваться в обновленном формате «2.1», так как изменения несущественные. В случае отсутствия на входе данного параметра выгрузка будет также выдаваться в формате «2.1» Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
yegorov-p Опубликовано 10 марта, 2015 · Жалоба Да вроде везде поправлено... исходники скриптов покажите же Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
YuryD Опубликовано 11 марта, 2015 · Жалоба У меня тоже в запросе стоит 2.0, отдаёт 2.1 Из "памятки оператору..." в запросе sendRequest: dumpFormatVersion Версия формата, в котором запрашивается выгрузка. Актуальное значение должно быть «2.0» или «2.1». Даже при указании значения «2.0» выгрузка будет выдаваться в обновленном формате «2.1», так как изменения несущественные. В случае отсутствия на входе данного параметра выгрузка будет также выдаваться в формате «2.1» Ага, несущественные. версия 2.0 в запросе ./download.pl 0 LastDumpDate is not update, do not nothing версия 2.1 в запросе - выгружает. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
disappointed Опубликовано 11 марта, 2015 · Жалоба LastDumpDate is not update, do not nothing заменить на LastDumpDate is not updated, do nothing Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
tramp Опубликовано 11 марта, 2015 · Жалоба Ага, несущественные. версия 2.0 в запросе ./download.pl 0 LastDumpDate is not update, do not nothing версия 2.1 в запросе - выгружает. Только что попробовал в запросе версию 2.0: 11.03.2015 10:17:50 Register: Процесс получения выгрузки запущен. 11.03.2015 10:17:50 getLastDumpDateEx: Проверка обновления файла выгрузки на сервере... 11.03.2015 10:17:52 getLastDumpDateEx: Версии: веб-сервиса - 3.1, формата выгрузки - 2.1, памятки оператору связи - 4.2. 11.03.2015 10:17:52 getLastDumpDateEx: Есть срочное обновление выгрузки с временем внесения изменений: 10.03.2015 18:53:00. 11.03.2015 10:17:52 sendRequest: Предупреждение: формирование запроса и ЭЦП отключено. 11.03.2015 10:17:52 sendRequest: Регистрация запроса на получение выгрузки... 11.03.2015 10:17:52 sendRequest: запрос принят, код запроса: 040078..........cd1.... 11.03.2015 10:21:12 getResult: Получение выгрузки из реестра... 11.03.2015 10:21:21 getResult: Успешно. Получена выгрузка за 11.03.2015 10:00:00. Изменения для незамедлительного реагирования: 10.03.2015 18:53:00. Записей: domain=7898, ip=12933, url=8654, ip subnet=0. 11.03.2015 10:21:21 getResult: Выгрузка засчитана оператору связи: ООО "компания", ИНН: 6......9. 11.03.2015 10:21:21 Register: Процесс завершен. Все так, как обещали. Ищите косяк у себя. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
YuryD Опубликовано 11 марта, 2015 · Жалоба Все так, как обещали. Ищите косяк у себя. А я и не говорю что косяк. Реестр выгружается. Обозвал для себя это фичей. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ayf Опубликовано 11 марта, 2015 · Жалоба исходники скриптов покажите же zapret_cheker.py #!/usr/bin/env python # -*- coding: utf-8 -*- # yegorov.p@gmail.com from xml.etree.ElementTree import ElementTree from datetime import datetime from zapretinfo import ZapretInfo import time import zipfile from base64 import b64decode import argparse import os.path import logging parser = argparse.ArgumentParser(add_help=True, description='Downloads list of restricted websites') parser.add_argument("-r", "--request", action="store", required=True, type=str, help="full path to request.xml file") parser.add_argument("-s", "--signature", action="store", required=True, type=str, help="full path to digital signature file (in PKCS#7 format)") parser.add_argument("-l", "--log", action="store", required=False, type=str, default='rkn_dump.log', help="log filename") args = parser.parse_args() XML_FILE_NAME = args.request P7S_FILE_NAME = args.signature LOG_FILE_NAME = args.log logging.basicConfig(filename=LOG_FILE_NAME, filemode='a', format=u'%(asctime)s %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) logger.info('Starting script.') logger.info('Check if dump.xml already exists.') if os.path.exists('dump.xml'): logger.info('dump.xml already exists.') data = ElementTree().parse("dump.xml") dt = datetime.strptime(data.attrib['updateTime'][:19], '%Y-%m-%dT%H:%M:%S') updateTime = int(time.mktime(dt.timetuple())) logger.info('Got updateTime: %s.', updateTime) dt = datetime.strptime(data.attrib['updateTimeUrgently'][:19], '%Y-%m-%dT%H:%M:%S') updateTimeUrgently = int(time.mktime(dt.timetuple())) logger.info('Got updateTimeUrgently: %s.', updateTimeUrgently) fromFile = max(updateTime, updateTimeUrgently) logger.info('Got latest update time: %s.', fromFile) else: logger.info('dump.xml does not exist') fromFile = 0 session = ZapretInfo() logger.info('Check if dump.xml has updates since last sync.') if max(session.getLastDumpDateEx().lastDumpDate, session.getLastDumpDateEx().lastDumpDateUrgently) / 1000 <> fromFile: logger.info('dump.xml has changed.') logger.info('Sending request.') request = session.sendRequest(XML_FILE_NAME, P7S_FILE_NAME, '2.1') logger.info('Checking request status.') if request['result']: code = request['code'] logger.info('Got code %s', code) while 1: logger.info('Trying to get result...') request = session.getResult(code) if request['result']: logger.info('Got it! Saving dump.') with open('result.zip', "wb") as f: f.write(b64decode(request['registerZipArchive'])) try: logger.info('Unpacking.') zip_file = zipfile.ZipFile('result.zip', 'r') zip_file.extract('dump.xml', '') zip_file.extractall('./dumps/%s' % datetime.now().strftime("%Y-%m-%d %H-%M-%S")) zip_file.close() except zipfile.BadZipfile: logger.error('Wrong file format.') break else: if request['resultCode'] == 0: logger.info('Not ready yet. Waiting for a minute.') time.sleep(60) else: logger.error(request['resultComment'].decode('utf-8')) break else: logger.error(request['resultComment'].decode('utf-8')) else: logger.info('No updates.') logger.info('Script stopped.') zapretinfo.py #!/usr/bin/env python # -*- coding: utf-8 -*- __version__ = "0.0.9" __author__ = "yegorov.p@gmail.com" import suds from base64 import b64encode import os API_URL = "http://vigruzki.rkn.gov.ru/services/OperatorRequest/?wsdl" # API_URL = "http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl" class ZapretInfoException(RuntimeError): pass class ZapretInfo(object): def getLastDumpDateEx(self): ''' Оставлен для совместимости. Аналогичен getLastDumpDateEx, но возвращает только один параметр lastDumpDate. ''' client = suds.client.Client(API_URL) result = client.service.getLastDumpDateEx() return result def getLastDumpDate(self): ''' Метод предназначен для получения временной метки последнего обновления выгрузки из реестра, а также для получения информации о версиях веб-сервиса, памятки и текущего формата выгрузки. ''' client = suds.client.Client(API_URL) result = client.service.getLastDumpDate() return result def sendRequest(self, requestFile, signatureFile, versionNum='2.1'): ''' Метод предназначен для направления запроса на получение выгрузки из реестра. ''' if not os.path.exists(requestFile): raise ZapretInfoException('No request file') if not os.path.exists(signatureFile): raise ZapretInfoException('No signature file') with open(requestFile, "rb") as f: data = f.read() xml = b64encode(data) with open(signatureFile, "rb") as f: data = f.readlines() if '-----' in data[0]: sert = ''.join(data[1:-1]) else: sert = ''.join(data) sert = b64encode(sert) client = suds.client.Client(API_URL) result = client.service.sendRequest(xml, sert, versionNum) return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result) def getResult(self, code): ''' Метод предназначен для получения результата обработки запроса - выгрузки из реестра ''' client = suds.client.Client(API_URL) result = client.service.getResult(code) return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
yegorov-p Опубликовано 11 марта, 2015 · Жалоба ayf, если хотите, можете мне xmlку и ее подпись на yegorov.p@gmail.com отправить, так проще будет разобраться. В целом все выглядит нормально. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AdmSasha Опубликовано 12 марта, 2015 · Жалоба Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
snvoronkov Опубликовано 12 марта, 2015 · Жалоба Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ? Я уже спрашивал: всем пофигу. Для себя решил блокировать udp/timed для всего домена: :-))) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ansy Опубликовано 12 марта, 2015 (изменено) · Жалоба Что-то не пойму про blockType="domain". Это блокировка 100% по IP означает ? Ведь нигде не написано, это http имеется введу или https. Или каждую запись смотреть вручную и смотреть открывается ли по https ? Глубже, ширше, тщательней... ;) Ибо: <domain><![CDATA[site2.com]]></domain> Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена. Если данный атрибут отсутствует либо указано значение «default», то блокировка осуществляется по стандартным правилам.Если указано значение «domain», то указатели страниц сайтов (URL) для данной реестровой записи будут отсутствовать, необходимо ограничить доступ к домену целиком. Формально это означает блокировку и https, и ftp, и smtp/pop/imap, и ssh, и даже bittorent со всеми UDP... да и все виды туннелей тоже до кучи положено блокирнуть, если они поднимаются с указанием запрещенного домена. То есть фактически придется перехватывать и подменять запросы к DNS -- другого пути я не вижу. Если чуть ранее РКН разъяснял, что самостоятельно резолвить домены в URL-ах нельзя, то в случае тега domain чисто технически придется делать ровно наоборот. Причем полностью и наглухо. И насколько я понимаю, формально можно НЕ блокировать ДРУГИЕ домены даже на ЯВНО указанных в записи реестра IP-адресах, если блокируем ЯВНО ЖЕ указанный в теге записи ДОМЕН. Это технически несколько упрощает задачу НЕблокирования невинно пострадавших сайтов на том же IP -- причем без наличия DPI и раскопок до уровня конкретных URL. Очень вероятно, что здесь упущены какие-то конкретные случаи коллизий и противоречий, давайте выявлять и обсуждать. Потому что даже в тестовой выгрузке (Приложение 1 Памятки, пример XML-файла) первые же три секции нарушают формально памятку, т.к. содержат одновременно И domain, И URL. Конечно, если не имелось ввиду, что подчеркнутое выше в цитате относится не целиком к реестровой записи в тегах <content>, а только лишь к строчке <domain>, где тупо не будет указания протокола и пути до конкретной странички. Изменено 12 марта, 2015 пользователем Ansy Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AdmSasha Опубликовано 12 марта, 2015 (изменено) · Жалоба Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена. Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса. Изменено 12 марта, 2015 пользователем AdmSasha Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Rivia Опубликовано 12 марта, 2015 · Жалоба Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена. Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса. 139 ФЗ "13) сайт в сети "Интернет" - совокупность программ для электронных вычислительных машин и иной информации, содержащейся в информационной системе, доступ к которой обеспечивается через сеть "Интернет" по доменным именам и (или) по сетевым адресам, позволяющим идентифицировать сайты в сети "Интернет";" Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AdmSasha Опубликовано 12 марта, 2015 (изменено) · Жалоба Не зря номер 13) сайт в сети "Интернет" - что-то там ... позволяющим идентифицировать сайты в сети "Интернет". Честно говоря, бред это. Это не к Rivia притензия. Так возвращаясь к вопросу. Как РКН требует блокировать по доменам ? Кто должен отрезольвить домен и через какой DNS сервер (вражеским google dns серверам доверять можно ?) Как часто обновлять DNS запись? Да и не понятен механизм блокировки... Изменено 12 марта, 2015 пользователем AdmSasha Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ansy Опубликовано 12 марта, 2015 · Жалоба Мы не видим не только IP, а даже и ПРОТОКОЛА соединения -- только имя домена. Речь идет о сайтах. Сайты у нас работают по http и по https, Всё прочие это не сайты, а другие сервиса. Да ладно? Картинко ftp://dlink.ru -- навскидку, вполне себе открывается браузерами. Вполне себе сайт. Ну нет там HTML-форматирования, ну и ладно... браузер и сам умеет отрисовать каталоги. Для некоторых видов информации так даже удобнее ;) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AdmSasha Опубликовано 12 марта, 2015 · Жалоба То есть фактически придется перехватывать и подменять запросы к DNS -- другого пути я не вижу. Погодите. Так блокировка по домену это: что-то://*.domain.ru/*, я не прав ? Какой адрес резольвить ? host1.domain.ru или host2.domain.ru ? Да ладно? Это сервис FTP. Не важно, что он похож на что либо. Но как тут уже заметили, моё определение в любом случае не верное) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ansy Опубликовано 12 марта, 2015 · Жалоба Так возвращаясь к вопросу. Как РКН требует блокировать по доменам ? Кто должен отрезольвить домен и через какой DNS сервер (вражеским google dns серверам доверять можно ?) Как часто обновлять DNS запись? Да и не понятен механизм блокировки... В том и фокус, что домен из реестра НЕ НАДО РЕЗОЛВИТЬ. Можно просто дропнуть запрос на резолв, и это прокатит. Ну, по желанию, в 127.0.0.1. Или в 46.61.208.33 (это zapret-info.gov.ru). Чисто локально у себя. Никаким DNS-серверам доверять и не нужно. И обновлять не надо... localhost можно даже в коде константой увековечить ;) Механизм блокировки... ну, не знаю, сканить по Layer7 содержимое UDP-запросов на 53-й порт и подходящие тупо дропать или заворачивать на любой подконтрольный DNS с заглушкой? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
AdmSasha Опубликовано 12 марта, 2015 · Жалоба Можно просто дропнуть запрос на резолв, и это прокатит. Я плохо представляю как это возможно вообще сделать, если не свой dns сервер. Как то на SCE это делается ? И какой запрос искать hosts1.domain.ru или hosts2.domain.ru это же разные запросы. Не могу же я сказать, "iptables блокируй *.domain.ru" :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...