@node Сценарии использования @section Сценарии использования @menu * Доступность почтового сервера время от времени: UsecaseMailRU. * Легковесная и быстрая замена POP3/IMAP4: UsecasePOPRU. * Ненадёжный/дорогой канал связи: UsecaseUnreliableRU. * Медленная/дорогая связь для больших объёмов данных, плохой QoS: UsecaseQoSRU. * Экстремальные наземные окружающие условия, нет связи: UsecaseNoLinkRU. * Частные, изолированные MitM/Sybil-устойчивые сети: UsecaseF2FRU. * Высоко защищённые изолированные компьютеры с воздушным зазором: UsecaseAirgapRU. * Обход сетевой цензуры, здоровье: UsecaseCensorRU. * Разведка, шпионаж, тайная агентура: UsecaseSpyRU. @end menu @node UsecaseMailRU @subsection Доступность почтового сервера время от времени Представьте, что у вас есть собственный @url{http://www.postfix.org/, Postfix} 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-ам (на сервере и ноутбуке) отправлять сообщения через NNCP (@ref{nncp-mail}) на заданный узел. Это делается аналогично тому как с UUCP, и описано в @url{http://www.postfix.org/UUCP_README.html, документации Postfix}. Читайте @ref{Postfix, здесь} для более подробной информации. Вся почта будет сохранятся в NNCP @ref{Spool, спуле}, который после обмена данных и распаковки вызовет локальный @command{sendmail} для доставки почты, как-будто это произошло на этой же машине. @node UsecasePOPRU @subsection Легковесная и быстрая замена POP3/IMAP4 @ref{nncp-daemon} может быть соединён с @ref{nncp-caller} длительное время -- он создаёт TCP соединение на многие часы. Когда SMTP сервер получает письмо, то вызывает @ref{nncp-mail} для создания исходящего зашифрованного пакета. Демон ежесекундно проверяет исходящую директорию и сразу же посылает оповещение о недоставленных пакетах противоположной стороне, которая сразу же их может скачать. Всего несколько дюжин байт оповещают о входящих пакетах, дюжины байт начинающие доставку этих пакетов. Почтовые пакеты сжимаются (POP3 и IMAP4, как правило, нет). У вас легковесный, сжатый, надёжный канал связи с низкими задержками для почты, с сильным шифрованием и двусторонней аутентификацией! @node UsecaseUnreliableRU @subsection Ненадёжный/дорогой канал связи Представьте, что у вас медленный модем/радио/спутниковый канал связи, который часто обрывается и вызывает timeout у TCP. Не все HTTP серверы поддерживают возобновляемые скачивания. SMTP вообще не поддерживает продолжение оборванного приёма и тяжёлые сообщения становится очень проблематично получить. Более того, каждый обрыв может приводить к отсылке данных с самого начала, что не всегда по карману. Просто отправьте вашу @ref{nncp-mail, почту} и @ref{nncp-file, файлы} через NNCP. Вы сможете использовать или offline методы доставки -- читайте о них в следующем разделе, либо использовать поставляемый NNCP @ref{nncp-daemon, TCP демон}. Команды: @verbatim % nncp-file file_i_want_to_send bob: % nncp-file another_file bob:movie.avi @end verbatim добавят в очередь отправки два файла для узла @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, приоритезацию трафика}: каждый пакет имеет уровень "приятности", который гарантирует что он будет обработан раньше или позднее остальных. Почти все команды имеют соответствующую опцию: @verbatim % nncp-file -nice 32 myfile node:dst % nncp-xfer -nice 192 /mnt/shared % nncp-call -nice 224 bob [...] @end verbatim Огромные файлы могут быть разбиты на маленькие @ref{Chunked, части}, давая возможность передачи, по сути, любых объёмов используя накопители небольших размеров. @node UsecaseNoLinkRU @subsection Экстремальные наземные окружающие условия, нет связи Это, в некотором роде, вариант очень медленного канала связи. Offline методы доставки -- единственный выбор. Просто отправьте, файлы как было показано в предыдущем разделе, но используйте переносные накопители для передачи пакетов другим узлам. Представьте, что вы послали два файла узлу @emph{bob}. Вставьте USB устройство хранения, подмонтируйте и запустите @ref{nncp-xfer}: @verbatim % nncp-xfer -node bob /media/usbstick @end verbatim чтобы скопировать все исходящие пакеты относящиеся к @emph{bob}. Используйте @option{-mkdir} опцию чтобы создать все необходимые директории на накопителе, если их нет (например когда запускаемся первый раз). Если вы используете один и тот же накопитель для передачи данных и к @emph{bob} и к @emph{alice}, то тогда просто не указывайте @option{-node} опцию, чтобы скопировать все доступные исходящие пакеты. @verbatim % nncp-xfer /media/usbstick @end verbatim Размонтируйте и передайте накопитель Бобу и Алисе. Когда они вставят накопитель в свои компьютеры, то выполнят точно такую же команду: @verbatim % nncp-xfer /media/usbstick @end verbatim чтобы найти все пакеты относящиеся к их узлу и локально скопируют для дальнейшей обработки. @command{nncp-xfer} это единственная команда используемая с переносными устройствами хранения. @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} протокол для двусторонней аутентификации узлов и предоставляет эффективный (оба участника могут отослать полезную нагрузку сразу же в самом первом пакете) безопасный транспорт с свойством совершенной прямой секретности. @verbatim % nncp-daemon -bind [::]:5400 @end verbatim запустит TCP демон, который будет слушать входящие соединения на всех интерфейсах. @verbatim % nncp-call bob @end verbatim попытается подключиться к известному 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, жёстких дисков, лент и USB накопителей (худший вариант, из-за сложности подобных устройств). Предполагаем что у вас есть ещё один собственный узел, стоящий "до" безопасного, который делает базовые проверки полученных накопителей, возможно перезаписывая данные с 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 trip) -- только сбросить данные, выстрелить и забыть. Опять же, это может быть переносной накопитель и/или @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} команда может помочь с созданием конфигурационного файла без приватных ключей для этой цели).