@node Сценарии @section Сценарии использования @menu * Доступность почтового сервера время от времени: UsecaseMailRU. * Легковесная и быстрая замена POP3/IMAP4: UsecasePOPRU. * Ненадёжный/дорогой канал связи: UsecaseUnreliableRU. * Медленная/дорогая связь для больших объёмов данных, плохой QoS: UsecaseQoSRU. * Экстремальные наземные окружающие условия, нет связи: UsecaseNoLinkRU. * Односторонняя широковещательная связь: UsecaseBroadcastRU. * Спутниковые каналы связи: UsecaseSatelliteLinksRU. * Частные, изолированные MitM/Sybil-устойчивые сети: UsecaseF2FRU. * Высоко защищённые изолированные компьютеры с воздушным зазором: UsecaseAirgapRU. * Обход сетевой цензуры, здоровье: UsecaseCensorRU. * Разведка, шпионаж, тайная агентура: UsecaseSpyRU. * Дешёвая ночная связь: UsecaseCallerRU. @end menu @node UsecaseMailRU @subsection Доступность почтового сервера время от времени Представьте, что у вас есть собственный @url{http://www.postfix.org/, Postfix}/@url{http://www.exim.org/, Exim} SMTP сервер подключённый к Интернету. Но вы читаете и пишете почтовые сообщения на своём ноутбуке, который подключается к нему лишь время от времени. Как опустошить очередь из ожидающих сообщений когда ноутбук подключён? Одна из возможностей это войти на сервер и сделать что-то типа @command{postqueue -f}, но по умолчанию у вас есть только несколько дней на это, плюс отправитель будет получать уведомления о том, что его сообщение всё ещё не доставлено. Кроме того, вы должны использовать безопасный канал связи (SSH, VPN, итд). Другая возможность это использовать POP3/IMAP4 сервер, но это слишком переусложнённо и громоздко для такой простой задачи. Не вариант. @url{https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF), KISS}! Просто скажите вашим обоим Postfix/Exim-ам (на сервере и ноутбуке) отправлять сообщения через NNCP (@ref{nncp-exec}) на заданный узел. Более подробно читайте для Postfix @ref{Postfix, здесь}, а для Exim @ref{Exim, здесь}. Вся почта будет сохранятся в NNCP @ref{Spool, спуле}, который после обмена данных и распаковки вызовет локальный @command{sendmail} для доставки почты, как-будто это произошло на этой же машине. @node UsecasePOPRU @subsection Легковесная и быстрая замена POP3/IMAP4 @ref{nncp-daemon} может быть соединён с @ref{nncp-caller} длительное время -- он создаёт TCP соединение на многие часы. Когда SMTP сервер получает письмо, то вызывает @ref{nncp-exec} для создания исходящего зашифрованного пакета. Демон ежесекундно проверяет исходящую директорию и сразу же посылает оповещение о недоставленных пакетах противоположной стороне, которая сразу же их может скачать. Всего несколько дюжин байт оповещают о входящих пакетах, дюжины байт начинающие доставку этих пакетов. Почтовые пакеты сжимаются (POP3 и IMAP4, как правило, нет). У вас легковесный, сжатый, надёжный канал связи с низкими задержками для почты, с сильным шифрованием и двусторонней аутентификацией! @node UsecaseUnreliableRU @subsection Ненадёжный/дорогой канал связи Представьте, что у вас медленный модем/радио/спутниковый канал связи, который часто обрывается и вызывает timeout у TCP. Не все HTTP серверы поддерживают возобновляемые скачивания. SMTP вообще не поддерживает продолжение оборванного приёма и тяжёлые сообщения становится очень проблематично получить. Более того, каждый обрыв может приводить к отсылке данных с самого начала, что не всегда по карману. Просто отправьте вашу @ref{nncp-exec, почту} и @ref{nncp-file, файлы} через NNCP. Вы сможете использовать или offline методы доставки -- читайте о них в следующем разделе, либо использовать поставляемый NNCP @ref{nncp-daemon, TCP демон}. Команды: @example $ nncp-file file_i_want_to_send bob: $ nncp-file another_file bob:movie.avi @end example добавят в очередь отправки два файла для узла @emph{bob}. Выстрелил-и-забыл! Теперь это работа демона (или offline передачи) доставить частями эти файлы до удалённой системы когда она будет доступна. @node UsecaseQoSRU @subsection Медленная/дорогая связь для больших объёмов данных, плохой QoS Представьте, что относительно дешёвый 2 TiB переносной жёсткий диск вы отдаёте кому-нибудь утром каждый день (и забираете назад вечером). Это равносильно 185 мегабитному качественному однонаправленному каналу связи. Как насчёт большего количества и бОльших жёстких дисков? Этот метод обмена данными называется @url{https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%BE%D0%BF%D0%BF%D0%B8%D0%BD%D0%B5%D1%82, флоппинет}. NNCP поддерживает @ref{Niceness, приоритезацию трафика}: каждый пакет имеет уровень "приятности", который гарантирует что он будет обработан раньше или позднее остальных. Почти все команды имеют соответствующую опцию: @example $ nncp-file -nice FLASH myfile node:dst $ nncp-xfer -nice PRIORITY /mnt/shared $ nncp-call -nice NORMAL bob [...] @end example Огромные файлы могут быть разбиты на маленькие @ref{Chunked, части}, давая возможность передачи, по сути, любых объёмов используя накопители небольших размеров. Вы также можете использовать CD-ROM и ленточные накопители: @example $ nncp-bundle -tx bob | cdrecord -tao - $ nncp-bundle -tx bob | dd of=/dev/sa0 bs=10240 @end example @node UsecaseNoLinkRU @subsection Экстремальные наземные окружающие условия, нет связи Это, в некотором роде, вариант очень медленного канала связи. Offline методы доставки -- единственный выбор. Просто отправьте, файлы как было показано в предыдущем разделе, но используйте переносные накопители для передачи пакетов другим узлам. Представьте, что вы послали два файла узлу @emph{bob}. Вставьте USB устройство (SD гораздо предпочтительнее!) хранения, подмонтируйте и запустите @ref{nncp-xfer}: @example $ nncp-xfer -node bob /media/usbstick @end example чтобы скопировать все исходящие пакеты относящиеся к @emph{bob}. Используйте @option{-mkdir} опцию чтобы создать все необходимые директории на накопителе, если их нет (например когда запускаемся первый раз). Если вы используете один и тот же накопитель для передачи данных и к @emph{bob} и к @emph{alice}, то тогда просто не указывайте @option{-node} опцию, чтобы скопировать все доступные исходящие пакеты. @example $ nncp-xfer /media/usbstick @end example Размонтируйте и передайте накопитель Бобу и Алисе. Когда они вставят накопитель в свои компьютеры, то выполнят точно такую же команду: @example $ nncp-xfer /media/usbstick @end example чтобы найти все пакеты относящиеся к их узлу и локально скопируют для дальнейшей обработки. @command{nncp-xfer} это единственная команда используемая с переносными устройствами хранения. @node UsecaseBroadcastRU @subsection Односторонняя широковещательная связь Иногда у вас есть ёмкий, но односторонний, канал связи, например широковещательный сигнал со спутника. Вы не можете использовать online @ref{Sync, протокол синхронизации}, потому что он требует двустороннего взаимодействия. Вы можете использовать, так называемые, @ref{Bundles, пачки} и потоково отсылать их. Они -- всего-лишь последовательность @ref{Encrypted, зашифрованных пакетов}, которые вы можете принять. @example $ nncp-bundle -tx alice bob eve ... | команда для отправки широковещательной рассылки $ команда для приёма широковещательной рассылки | nncp-bundle -rx @end example Встроенная возможность определять дубляжи пакетов позволит вам переотправлять широковещательные рассылки время от времени, повышая шансы на то, что получатель примет их, регулярно слушая рассылку. @node UsecaseSatelliteLinksRU @subsection Спутниковые каналы связи Спутниковые каналы связи имеют @strong{очень} большие задержки вместе с высокими пропускными способностями. Вы можете посылать мегабиты данных в секунду, но они достигнут удалённой стороны только спустя полсекунды! Большинство протоколов обмена файлами, таких как @url{https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol, FISH}, @url{https://ru.wikipedia.org/wiki/FTP, FTP}, @url{https://ru.wikipedia.org/wiki/SCP, scp}, @url{https://en.wikipedia.org/wiki/XMODEM, XMODEM} will perform very будут работать очень плохо из-за большого количества приёмо-передач (round-trips). Каждая передача файла явно генерирует пакеты запросов и подтверждений, посылаемые поверх канала связи. Удалённая сторона ничего не будет делать пока она их не получит. Более того, не все протоколы позволяют делать дуплексную отправку данных (когда обе стороны посылают данные одновременно). @ref{Sync, Протокол синхронизации} (SP) NNCP пытается решить все эти особенности за счёт сокращения количества приёмо-передач, количества проходящих пакетов. Все списки файлов, запросов на скачивание файла группируются вместе (pipelined) в один огромный пакет. Только запросы на остановку передачи и подтверждения успешного приёма файла явно посылаются. Можно запросить чтобы SP только принимал или отправлял пакеты для нашей ноды. SP может игнорировать файлы с маленьким приоритетом. Полные списки файлов отправляются уже на этапе процедуры рукопожатия. @node UsecaseF2FRU @subsection Частные, изолированные MitM/Sybil-устойчивые сети Все Интернет соединения могут быть прослушаны и сфальсифицированы. Вы @strong{вынуждены} использовать шифрование и аутентификацию для безопасности. Но очень сложно обезопасить метаданные, которые утекают при каждой online сессии. Когда вы запускаете свой новый сверкающий программный сервер, то имейте в виду, что может существовать огромное количество поддельных узлов пытающихся произвести @url{https://en.wikipedia.org/wiki/Sybil_attack, Sybil атаку}. Открытые узел-к-узлу (peer-to-peer) сети опасны. Наиболее популярный криптографический протокол в Интернете это @url{https://ru.wikipedia.org/wiki/TLS, TLS}, который крайне сложно правильно реализовать и сконфигурировать для двусторонней аутентификации собеседников. Не все конфигурации TLS обладают свойством @url{https://ru.wikipedia.org/wiki/Perfect_forward_secrecy, совершенной прямой секретности} -- все ранее перехваченные пакеты могут быть прочтены если приватные ключи скомпрометированы. Друг-к-другу (friend-to-friend) сети, "тёмные сети" (darknet) могут нивелировать возможные риски связанные с поддельными и фиктивными узлами. Хотя они и сложнее в поддержке и требуют больше затрат на построение. @ref{nncp-daemon, TCP демон} NNCP использует @url{http://noiseprotocol.org/, Noise-IK} протокол для двусторонней аутентификации узлов и предоставляет эффективный (оба участника могут отослать полезную нагрузку сразу же в самом первом пакете) безопасный транспорт с свойством совершенной прямой секретности. @example $ nncp-daemon -bind "[::]":5400 @end example запустит TCP демон, который будет слушать входящие соединения на всех интерфейсах. @example $ nncp-call bob @end example попытается подключиться к известному TCP-адресу узла @emph{bob} (взятого из конфигурационного файла), послать все связанные с ним исходящие пакеты и получить от него. Все прерванные передачи будут автоматически возобновлены. @node UsecaseAirgapRU @subsection Высокозащищённые изолированные компьютеры с воздушным зазором Если вы сильно беспокоитесь о безопасности, то компьютер с @url{https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%B7%D0%B4%D1%83%D1%88%D0%BD%D1%8B%D0%B9_%D0%B7%D0%B0%D0%B7%D0%BE%D1%80_(%D1%81%D0%B5%D1%82%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%87%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85), воздушным зазором} может будет вашим единственным позволительным выбором. Компьютер без каких-либо модемов, проводных и беспроводных сетей. Очевидно, что единственная возможность обмениваться почтой и файлами -- использовать физически переносимые устройства хранения типа CD-ROM, жёстких дисков, SD, лент и USB накопителей (@strong{худший} вариант, из-за сложности подобных устройств). Предполагаем что у вас есть ещё один собственный узел, стоящий "до" безопасного, который делает базовые проверки полученных накопителей, возможно перезаписывая данные с USB/жёстких дисков на CD-RW. NNCP из коробки поддерживает ретрансляцию пакетов. @verbatim neigh: { bob: { [...] addrs: { lan: "[fe80::5400%igb0]:5400" } } bob-airgap: [...] via: ["bob"] } } @end verbatim Такой @ref{Configuration, конфигурационный файл} говорит что у нас есть два известных соседа: @emph{bob} и @emph{bob-airgap}. @emph{bob} доступен через online соединение, используя @emph{lan} адрес. @emph{bob-airgap} доступен путём посылки промежуточного ретранслируемого пакета через узел @emph{bob}. Любая команда типа @command{nncp-file myfile bob-airgap:} автоматически создаст инкапсулированный пакет: один непосредственно для целевой точки, а другой несущий его для промежуточного узла. Имейте в виду, что узел-ретранслятор ничего не знает о внутреннем пакете, кроме его полного размера и приоритета. Все промежуточные пакеты тоже зашифрованы: используя хорошо известную технологию @url{https://ru.wikipedia.org/wiki/%D0%9B%D1%83%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F, луковой маршрутизации}. @emph{bob} не может прочитать пакеты @emph{bob-airgap}. @node UsecaseCensorRU @subsection Обход сетевой цензуры, здоровье Это тоже подвид плохого канала связи. Некоторые правительства склонны к запрету @strong{любого} вида личного (приватного) общения между людьми, разрешая только доставку развлекательного контента и доступ к популярным социальным сетям (которые уже вовсю наводнены рекламой, локально исполняемым @url{https://www.gnu.org/philosophy/free-sw.ru.html, проприетарным} JavaScript кодом (для слежкой за действиями пользователя, сбором данных), бесстыдно и бессовестно эксплуатируя базовые потребности человека в общении). Это их естественное желание. Но никто вас не заставляет насильно подчиняться огромным корпорациям типа Apple, Google или Microsoft. Ваш выбор это создавать изолированные друг-к-другу сети с кучами безобидного контента и приватными сообщениями. Только хищники тихо наблюдают за своими жертвами в мире млекопитающих -- слежка и чувство что вы жертва, сделавшая что-то плохое, вредит вашему здоровью. @node UsecaseSpyRU @subsection Разведка, шпионаж, тайная агентура Эти ребята знают насколько небезопасен Интернет, несовместим с понятием приватности. Им необходим быстрый сброс и забор данных. Нет возможности провести несколько итераций приёмо-передач (round-trips) -- только сбросить данные, выстрелить и забыть. Опять же, это может быть переносной накопитель и/или @url{https://en.wikipedia.org/wiki/USB_dead_drop, USB тайник} (dead drop), @url{https://en.wikipedia.org/wiki/PirateBox, PirateBox}ы, @url{https://en.wikipedia.org/wiki/Short-range_agent_communications, связь малой дальности (SRAC)}. Короткоживущие сети малой дальности типа Bluetooth и WiFi могут быть и довольно быстрыми, позволяя быстро "выстреливать" порциями исходящих пакетов. Очень важное свойство -- компрометация этих тайников или накопителей не должна быть ни фатальна, ни даже опасна. Пакеты посылаемые через сети или обмениваемые через устройства -- @ref{Encrypted, зашифрованы} по принципу точка-точка (но, к сожалению, без совершенной прямой секретности). Никаких имён файлов, получателей почтовых сообщений не видно. Общение узлов между собой происходит в, так называемой, @ref{Spool, спул} области: директории содержащей только необработанные зашифрованные пакеты. После передачи пакета вы всё равно не сможете его прочитать: необходимо запустить другую фазу: @ref{nncp-toss, распаковку}, которая использует ваши приватные криптографические ключи. То есть, даже если вы потеряете свой компьютер, устройства хранения и тому прочее -- это не так плохо, потому что вы не носите с собой приватные ключи (ведь так?), вы не "распаковываете" эти пакеты сразу же на том же самом устройстве. Распаковка (чтение этих зашифрованных пакетов с извлечением переданных файлов и почтовых сообщений) может и должна бы быть произведена на отдельном компьютере (@ref{nncp-cfgmin} команда может помочь с созданием конфигурационного файла без приватных ключей для этой цели). Если вы действительно хотите взять с собой приватные ключи, то @ref{nncp-cfgenc} команда способна зашифровать ваш конфигурационный файл. Парольная фраза вами введённая усиливается функцией нагружающей и центральный процессор и память. @node UsecaseCallerRU @subsection Дешёвая ночная связь Стоимость Интернет/телефонного трафика может варьироваться, в зависимости от времени дня. Ночные звонки/соединения могут быть дешевле в два раза. Вы хотите посылать ваши файлы в это время, но позволять изредка проходить высокоприоритетной почте в любое время. А также вы хотите проходить любому трафику когда узел доступен через ЛВС (LAN). Вы легко можете настроить ваши предпочтения в @ref{Call, настройках звонков} для @ref{nncp-caller} команды, используемой при online связи. @verbatim neigh: { [...] some-node: { [...] addrs: { lan: "[fe80::be5f:f4ff:fedd:2752%igb0]:5400" wan: "some-node.com:5400" } calls: [ { cron: "*/1 * * * *" addr: lan nice: MAX onlinedeadline: 3600 }, { cron: "*/10 * * * *" addr: wan nice: PRIORITY xx: rx }, { cron: "*/1 0-7 * * *" addr: wan nice: BULK onlinedeadline: 3600 maxonlinetime: 3600 }, ] } } @end verbatim