-@node Сценарии
-@section Сценарии использования
-
-@menu
-* Доступность почтового сервера время от времени: UsecaseMailRU
-* Легковесная и быстрая замена POP3/IMAP4: UsecasePOPRU
-* Ненадёжный/дорогой канал связи: UsecaseUnreliableRU
-* Медленная/дорогая связь для больших объёмов данных, плохой QoS: UsecaseQoSRU
-* Экстремальные наземные окружающие условия, нет связи: UsecaseNoLinkRU
-* Односторонняя широковещательная связь: UsecaseBroadcastRU
-* Спутниковые каналы связи: UsecaseSatelliteLinksRU
-* Частные, изолированные MitM/Sybil-устойчивые сети: UsecaseF2FRU
-* Высоко защищённые изолированные компьютеры с воздушным зазором: UsecaseAirgapRU
-* Обход сетевой цензуры, здоровье: UsecaseCensorRU
-* Разведка, шпионаж, тайная агентура: UsecaseSpyRU
-* Дешёвая ночная связь: UsecaseCallerRU
-* Мультивещательная flooding рассылка: UsecaseMulticastRU
-@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} (взятого
-из конфигурационного файла), послать все связанные с ним исходящие
-пакеты и получить от него. Все прерванные передачи будут автоматически
-возобновлены.
-
-А наличие возможности @ref{MCD, multicast обнаружения} участников сети в
-IPv6 сетях позволяет вообще не возиться с заданием сетевых адресов.
-
-@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
-
-@node UsecaseMulticastRU
-@subsection Мультивещательная flooding рассылка
-
-Необходимо разослать одно и то же почтовое сообщение или файл многим
-участникам? Например обновления какой либо программы, списка участников
-сети или доступных файлов? Но при этом вы не соединены лично с каждым из
-них:
-
-@verbatim
- A-------->E---->F A <-> B C E
- / \ |\ ^ C <-> H J
- / \ | \ | E <-> D F G
-v v v \v D <-> G
-B C D---->G J <-> K
- / \ ^ / K <-> D G
- / \ | /
- v v v /
- H J<->K<-
-@end verbatim
-
-В NNCP есть особые @ref{Multicast, мультивещательные} форматы пакетов
-позволяющие организовывать эффективную передачу одно единственного
-пакета сразу нескольким получателям (flooding алгоритм). @strong{A}
-отправляет пакет трём получателям. @strong{C} в свою очередь отсылает
-ещё двум, а @strong{E} трём. Некоторые участники сети получат несколько
-копий одного и того же пакета, как например @strong{D}, @strong{J},
-@strong{G}, @strong{F}, но копии будут просто проигнорированы. Если
-@strong{B} отошлёт пакет единственному ему известному @strong{A}, то
-этот пакет распространится по всей сети подписантов широковещательной
-зоны и дальше.
-
-Более того, мультивещательные пакеты зашифрованы и для прочтения требуют
-знание ключей. Но это не мешает их обрабатывать для дальнейшей пересылки!
-Кроме того, совершенно не обязательно знать ключи отправителя. Таким
-образом можно создать эхоконференцию для передачи файлов или команд
-(например доставки почтовых сообщений).
-
-Создаём ключи для мультивещательной зоны:
-
-@example
-$ nncp-cfgnew -area filelists -nocomments
-areas: @{
- filelists: @{
- id: TOU5TKOW4JBIZJBX63D4776C72FMWDAUAUSZNJX4DFOITVYQ5ZQA
- pub: DSHL5O6BK2R3QKJAIJ7BC4UIGE73EC2LJPOV3VTS44KYOTUQYZLA
- prv: AYD5FAA4GDDSAD5N65NJLLFS6TG2NSPQ46KAQO5U722JLVG34SOQ
- @}
-@}
-@end example
-
-и отправляем ключевую пару всем кто может и хочет читать данную зону.
-Посредникам, готовым участвовать в переотправке пакетов подписантам, но
-которым не стоит "читать" пакеты, достаточно отправить только
-идентификатор зоны. Например @strong{A} добавляет себе в конфигурацию:
-
-@example
-areas: @{
- filelists: @{
- id: TOU...
- pub: DSH...
- prv: AYD...
- subs: ["B", "C", "E"]
- incoming: /home/A/areas/filelists
- @}
-@end example
-
-а @strong{E}, являющимся (как было решено) просто посредником:
-
-@example
-areas: @{
- filelists: @{
- id: TOU...
- subs: ["D", "F", "G"]
- @}
-@end example
-
-После распространения знания о @code{filelists} мультивещательной зоне
-можно обмениваться @ref{FreqIndex, списками файлов}:
-
-@example
-$ nncp-file tree-of-A-20210715.txt.zst area:filelists:
-$ nncp-toss -node self
-@end example