]> Cypherpunks.ru repositories - nncp.git/blob - doc/usecases.ru.texi
860f4013685250d155293f6c4eab4519e917bb72
[nncp.git] / doc / usecases.ru.texi
1 @node Сценарии
2 @section Сценарии использования
3
4 @menu
5 * Доступность почтового сервера время от времени: UsecaseMailRU
6 * Легковесная и быстрая замена POP3/IMAP4: UsecasePOPRU
7 * Ненадёжный/дорогой канал связи: UsecaseUnreliableRU
8 * Медленная/дорогая связь для больших объёмов данных, плохой QoS: UsecaseQoSRU
9 * Экстремальные наземные окружающие условия, нет связи: UsecaseNoLinkRU
10 * Односторонняя широковещательная связь: UsecaseBroadcastRU
11 * Спутниковые каналы связи: UsecaseSatelliteLinksRU
12 * Частные, изолированные MitM/Sybil-устойчивые сети: UsecaseF2FRU
13 * Высоко защищённые изолированные компьютеры с воздушным зазором: UsecaseAirgapRU
14 * Обход сетевой цензуры, здоровье: UsecaseCensorRU
15 * Разведка, шпионаж, тайная агентура: UsecaseSpyRU
16 * Дешёвая ночная связь: UsecaseCallerRU
17 * Мультивещательная flooding рассылка: UsecaseMulticastRU
18 @end menu
19
20 @node UsecaseMailRU
21 @subsection Доступность почтового сервера время от времени
22
23 Представьте, что у вас есть собственный @url{http://www.postfix.org/,
24 Postfix}/@url{http://www.exim.org/, Exim} SMTP сервер подключённый к
25 Интернету. Но вы читаете и пишете почтовые сообщения на своём ноутбуке,
26 который подключается к нему лишь время от времени. Как опустошить
27 очередь из ожидающих сообщений когда ноутбук подключён?
28
29 Одна из возможностей это войти на сервер и сделать что-то типа
30 @command{postqueue -f}, но по умолчанию у вас есть только несколько дней
31 на это, плюс отправитель будет получать уведомления о том, что его
32 сообщение всё ещё не доставлено. Кроме того, вы должны использовать
33 безопасный канал связи (SSH, VPN, итд).
34
35 Другая возможность это использовать POP3/IMAP4 сервер, но это слишком
36 переусложнённо и громоздко для такой простой задачи. Не вариант.
37 @url{https://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF),
38 KISS}!
39
40 Просто скажите вашим обоим Postfix/Exim-ам (на сервере и ноутбуке)
41 отправлять сообщения через NNCP (@ref{nncp-exec}) на заданный узел.
42 Более подробно читайте для Postfix @ref{Postfix, здесь}, а для Exim
43 @ref{Exim, здесь}. Вся почта будет сохранятся в NNCP @ref{Spool, спуле},
44 который после обмена данных и распаковки вызовет локальный
45 @command{sendmail} для доставки почты, как-будто это произошло на этой
46 же машине.
47
48 @node UsecasePOPRU
49 @subsection Легковесная и быстрая замена POP3/IMAP4
50
51 @ref{nncp-daemon} может быть соединён с @ref{nncp-caller} длительное
52 время -- он создаёт TCP соединение на многие часы. Когда SMTP сервер
53 получает письмо, то вызывает @ref{nncp-exec} для создания исходящего
54 зашифрованного пакета. Демон ежесекундно проверяет исходящую директорию
55 и сразу же посылает оповещение о недоставленных пакетах противоположной
56 стороне, которая сразу же их может скачать.
57
58 Всего несколько дюжин байт оповещают о входящих пакетах, дюжины байт
59 начинающие доставку этих пакетов. Почтовые пакеты сжимаются (POP3 и
60 IMAP4, как правило, нет). У вас легковесный, сжатый, надёжный канал
61 связи с низкими задержками для почты, с сильным шифрованием и
62 двусторонней аутентификацией!
63
64 @node UsecaseUnreliableRU
65 @subsection Ненадёжный/дорогой канал связи
66
67 Представьте, что у вас медленный модем/радио/спутниковый канал связи,
68 который часто обрывается и вызывает timeout у TCP. Не все HTTP серверы
69 поддерживают возобновляемые скачивания. SMTP вообще не поддерживает
70 продолжение оборванного приёма и тяжёлые сообщения становится очень
71 проблематично получить. Более того, каждый обрыв может приводить к
72 отсылке данных с самого начала, что не всегда по карману.
73
74 Просто отправьте вашу @ref{nncp-exec, почту} и @ref{nncp-file, файлы}
75 через NNCP. Вы сможете использовать или offline методы доставки --
76 читайте о них в следующем разделе, либо использовать поставляемый NNCP
77 @ref{nncp-daemon, TCP демон}.
78
79 Команды:
80
81 @example
82 $ nncp-file file_i_want_to_send bob:
83 $ nncp-file another_file bob:movie.avi
84 @end example
85
86 добавят в очередь отправки два файла для узла @emph{bob}.
87 Выстрелил-и-забыл! Теперь это работа демона (или offline передачи)
88 доставить частями эти файлы до удалённой системы когда она будет
89 доступна.
90
91 @node UsecaseQoSRU
92 @subsection Медленная/дорогая связь для больших объёмов данных, плохой QoS
93
94 Представьте, что относительно дешёвый 2 TiB переносной жёсткий диск вы
95 отдаёте кому-нибудь утром каждый день (и забираете назад вечером). Это
96 равносильно 185 мегабитному качественному однонаправленному каналу
97 связи. Как насчёт большего количества и бОльших жёстких дисков? Этот
98 метод обмена данными называется
99 @url{https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%BE%D0%BF%D0%BF%D0%B8%D0%BD%D0%B5%D1%82,
100 флоппинет}.
101
102 NNCP поддерживает @ref{Niceness, приоритезацию трафика}: каждый пакет
103 имеет уровень "приятности", который гарантирует что он будет обработан
104 раньше или позднее остальных. Почти все команды имеют соответствующую
105 опцию:
106
107 @example
108 $ nncp-file -nice FLASH myfile node:dst
109 $ nncp-xfer -nice PRIORITY /mnt/shared
110 $ nncp-call -nice NORMAL bob
111 [...]
112 @end example
113
114 Огромные файлы могут быть разбиты на маленькие @ref{Chunked, части},
115 давая возможность передачи, по сути, любых объёмов используя накопители
116 небольших размеров.
117
118 Вы также можете использовать CD-ROM и ленточные накопители:
119
120 @example
121 $ nncp-bundle -tx bob | cdrecord -tao -
122 $ nncp-bundle -tx bob | dd of=/dev/sa0 bs=10240
123 @end example
124
125 @node UsecaseNoLinkRU
126 @subsection Экстремальные наземные окружающие условия, нет связи
127
128 Это, в некотором роде, вариант очень медленного канала связи. Offline
129 методы доставки -- единственный выбор. Просто отправьте, файлы как было
130 показано в предыдущем разделе, но используйте переносные накопители для
131 передачи пакетов другим узлам.
132
133 Представьте, что вы послали два файла узлу @emph{bob}. Вставьте USB
134 устройство (SD гораздо предпочтительнее!) хранения, подмонтируйте и
135 запустите @ref{nncp-xfer}:
136
137 @example
138 $ nncp-xfer -node bob /media/usbstick
139 @end example
140
141 чтобы скопировать все исходящие пакеты относящиеся к @emph{bob}.
142 Используйте @option{-mkdir} опцию чтобы создать все необходимые
143 директории на накопителе, если их нет (например когда запускаемся первый
144 раз).
145
146 Если вы используете один и тот же накопитель для передачи данных и к
147 @emph{bob} и к @emph{alice}, то тогда просто не указывайте
148 @option{-node} опцию, чтобы скопировать все доступные исходящие пакеты.
149
150 @example
151 $ nncp-xfer /media/usbstick
152 @end example
153
154 Размонтируйте и передайте накопитель Бобу и Алисе. Когда они вставят
155 накопитель в свои компьютеры, то выполнят точно такую же команду:
156
157 @example
158 $ nncp-xfer /media/usbstick
159 @end example
160
161 чтобы найти все пакеты относящиеся к их узлу и локально скопируют для
162 дальнейшей обработки. @command{nncp-xfer} это единственная команда
163 используемая с переносными устройствами хранения.
164
165 @node UsecaseBroadcastRU
166 @subsection Односторонняя широковещательная связь
167
168 Иногда у вас есть ёмкий, но односторонний, канал связи, например
169 широковещательный сигнал со спутника. Вы не можете использовать online
170 @ref{Sync, протокол синхронизации}, потому что он требует двустороннего
171 взаимодействия.
172
173 Вы можете использовать, так называемые, @ref{Bundles, пачки} и потоково
174 отсылать их. Они -- всего-лишь последовательность @ref{Encrypted,
175 зашифрованных пакетов}, которые вы можете принять.
176
177 @example
178 $ nncp-bundle -tx alice bob eve ... | команда для отправки широковещательной рассылки
179 $ команда для приёма широковещательной рассылки | nncp-bundle -rx
180 @end example
181
182 Встроенная возможность определять дубляжи пакетов позволит вам
183 переотправлять широковещательные рассылки время от времени, повышая
184 шансы на то, что получатель примет их, регулярно слушая рассылку.
185
186 @node UsecaseSatelliteLinksRU
187 @subsection Спутниковые каналы связи
188
189 Спутниковые каналы связи имеют @strong{очень} большие задержки вместе с
190 высокими пропускными способностями. Вы можете посылать мегабиты данных в
191 секунду, но они достигнут удалённой стороны только спустя полсекунды!
192 Большинство протоколов обмена файлами, таких как
193 @url{https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol, FISH},
194 @url{https://ru.wikipedia.org/wiki/FTP, FTP},
195 @url{https://ru.wikipedia.org/wiki/SCP, scp},
196 @url{https://en.wikipedia.org/wiki/XMODEM, XMODEM} will perform very
197 будут работать очень плохо из-за большого количества приёмо-передач
198 (round-trips). Каждая передача файла явно генерирует пакеты запросов и
199 подтверждений, посылаемые поверх канала связи. Удалённая сторона ничего
200 не будет делать пока она их не получит. Более того, не все протоколы
201 позволяют делать дуплексную отправку данных (когда обе стороны посылают
202 данные одновременно).
203
204 @ref{Sync, Протокол синхронизации} (SP) NNCP пытается решить все эти
205 особенности за счёт сокращения количества приёмо-передач, количества
206 проходящих пакетов. Все списки файлов, запросов на скачивание файла
207 группируются вместе (pipelined) в один огромный пакет. Только запросы на
208 остановку передачи и подтверждения успешного приёма файла явно
209 посылаются. Можно запросить чтобы SP только принимал или отправлял
210 пакеты для нашей ноды. SP может игнорировать файлы с маленьким
211 приоритетом. Полные списки файлов отправляются уже на этапе процедуры
212 рукопожатия.
213
214 @node UsecaseF2FRU
215 @subsection Частные, изолированные MitM/Sybil-устойчивые сети
216
217 Все Интернет соединения могут быть прослушаны и сфальсифицированы. Вы
218 @strong{вынуждены} использовать шифрование и аутентификацию для
219 безопасности. Но очень сложно обезопасить метаданные, которые утекают
220 при каждой online сессии. Когда вы запускаете свой новый сверкающий
221 программный сервер, то имейте в виду, что может существовать огромное
222 количество поддельных узлов пытающихся произвести
223 @url{https://en.wikipedia.org/wiki/Sybil_attack, Sybil атаку}. Открытые
224 узел-к-узлу (peer-to-peer) сети опасны.
225
226 Наиболее популярный криптографический протокол в Интернете это
227 @url{https://ru.wikipedia.org/wiki/TLS, TLS}, который крайне сложно
228 правильно реализовать и сконфигурировать для двусторонней аутентификации
229 собеседников. Не все конфигурации TLS обладают свойством
230 @url{https://ru.wikipedia.org/wiki/Perfect_forward_secrecy, совершенной
231 прямой секретности} -- все ранее перехваченные пакеты могут быть
232 прочтены если приватные ключи скомпрометированы.
233
234 Друг-к-другу (friend-to-friend) сети, "тёмные сети" (darknet) могут
235 нивелировать возможные риски связанные с поддельными и фиктивными
236 узлами. Хотя они и сложнее в поддержке и требуют больше затрат на
237 построение.
238
239 @ref{nncp-daemon, TCP демон} NNCP использует
240 @url{http://noiseprotocol.org/, Noise-IK} протокол для двусторонней
241 аутентификации узлов и предоставляет эффективный (оба участника могут
242 отослать полезную нагрузку сразу же в самом первом пакете) безопасный
243 транспорт с свойством совершенной прямой секретности.
244
245 @example
246 $ nncp-daemon -bind "[::]":5400
247 @end example
248
249 запустит TCP демон, который будет слушать входящие соединения на всех
250 интерфейсах.
251
252 @example
253 $ nncp-call bob
254 @end example
255
256 попытается подключиться к известному TCP-адресу узла @emph{bob} (взятого
257 из конфигурационного файла), послать все связанные с ним исходящие
258 пакеты и получить от него. Все прерванные передачи будут автоматически
259 возобновлены.
260
261 А наличие возможности @ref{MCD, multicast обнаружения} участников сети в
262 IPv6 сетях позволяет вообще не возиться с заданием сетевых адресов.
263
264 @node UsecaseAirgapRU
265 @subsection Высокозащищённые изолированные компьютеры с воздушным зазором
266
267 Если вы сильно беспокоитесь о безопасности, то компьютер с
268 @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),
269 воздушным зазором} может будет вашим единственным позволительным
270 выбором. Компьютер без каких-либо модемов, проводных и беспроводных
271 сетей. Очевидно, что единственная возможность обмениваться почтой и
272 файлами -- использовать физически переносимые устройства хранения типа
273 CD-ROM, жёстких дисков, SD, лент и USB накопителей (@strong{худший}
274 вариант, из-за сложности подобных устройств).
275
276 Предполагаем что у вас есть ещё один собственный узел, стоящий "до"
277 безопасного, который делает базовые проверки полученных накопителей,
278 возможно перезаписывая данные с USB/жёстких дисков на CD-RW.
279
280 NNCP из коробки поддерживает ретрансляцию пакетов.
281
282 @verbatim
283 neigh: {
284   bob: {
285     [...]
286     addrs: {
287       lan: "[fe80::5400%igb0]:5400"
288     }
289   }
290   bob-airgap:
291     [...]
292     via: ["bob"]
293   }
294 }
295 @end verbatim
296
297 Такой @ref{Configuration, конфигурационный файл} говорит что у нас есть
298 два известных соседа: @emph{bob} и @emph{bob-airgap}. @emph{bob}
299 доступен через online соединение, используя @emph{lan} адрес.
300 @emph{bob-airgap} доступен путём посылки промежуточного ретранслируемого
301 пакета через узел @emph{bob}.
302
303 Любая команда типа @command{nncp-file myfile bob-airgap:} автоматически
304 создаст инкапсулированный пакет: один непосредственно для целевой точки,
305 а другой несущий его для промежуточного узла.
306
307 Имейте в виду, что узел-ретранслятор ничего не знает о внутреннем
308 пакете, кроме его полного размера и приоритета. Все промежуточные пакеты
309 тоже зашифрованы: используя хорошо известную технологию
310 @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,
311 луковой маршрутизации}. @emph{bob} не может прочитать пакеты
312 @emph{bob-airgap}.
313
314 @node UsecaseCensorRU
315 @subsection Обход сетевой цензуры, здоровье
316
317 Это тоже подвид плохого канала связи. Некоторые правительства склонны к
318 запрету @strong{любого} вида личного (приватного) общения между людьми,
319 разрешая только доставку развлекательного контента и доступ к популярным
320 социальным сетям (которые уже вовсю наводнены рекламой, локально
321 исполняемым @url{https://www.gnu.org/philosophy/free-sw.ru.html,
322 проприетарным} JavaScript кодом (для слежкой за действиями пользователя,
323 сбором данных), бесстыдно и бессовестно эксплуатируя базовые потребности
324 человека в общении).
325
326 Это их естественное желание. Но никто вас не заставляет насильно
327 подчиняться огромным корпорациям типа Apple, Google или Microsoft. Ваш
328 выбор это создавать изолированные друг-к-другу сети с кучами безобидного
329 контента и приватными сообщениями. Только хищники тихо наблюдают за
330 своими жертвами в мире млекопитающих -- слежка и чувство что вы жертва,
331 сделавшая что-то плохое, вредит вашему здоровью.
332
333 @node UsecaseSpyRU
334 @subsection Разведка, шпионаж, тайная агентура
335
336 Эти ребята знают насколько небезопасен Интернет, несовместим с
337 понятием приватности. Им необходим быстрый сброс и забор данных. Нет
338 возможности провести несколько итераций приёмо-передач (round-trips) --
339 только сбросить данные, выстрелить и забыть. Опять же, это может быть
340 переносной накопитель и/или
341 @url{https://en.wikipedia.org/wiki/USB_dead_drop, USB тайник} (dead drop),
342 @url{https://en.wikipedia.org/wiki/PirateBox, PirateBox}ы,
343 @url{https://en.wikipedia.org/wiki/Short-range_agent_communications,
344 связь малой дальности (SRAC)}. Короткоживущие сети малой дальности типа
345 Bluetooth и WiFi могут быть и довольно быстрыми, позволяя быстро
346 "выстреливать" порциями исходящих пакетов.
347
348 Очень важное свойство -- компрометация этих тайников или накопителей не
349 должна быть ни фатальна, ни даже опасна. Пакеты посылаемые через сети
350 или обмениваемые через устройства -- @ref{Encrypted, зашифрованы} по
351 принципу точка-точка (но, к сожалению, без совершенной прямой
352 секретности). Никаких имён файлов, получателей почтовых сообщений не
353 видно.
354
355 Общение узлов между собой происходит в, так называемой, @ref{Spool,
356 спул} области: директории содержащей только необработанные зашифрованные
357 пакеты. После передачи пакета вы всё равно не сможете его прочитать:
358 необходимо запустить другую фазу: @ref{nncp-toss, распаковку}, которая
359 использует ваши приватные криптографические ключи. То есть, даже если вы
360 потеряете свой компьютер, устройства хранения и тому прочее -- это не
361 так плохо, потому что вы не носите с собой приватные ключи (ведь так?),
362 вы не "распаковываете" эти пакеты сразу же на том же самом устройстве.
363 Распаковка (чтение этих зашифрованных пакетов с извлечением переданных
364 файлов и почтовых сообщений) может и должна бы быть произведена на
365 отдельном компьютере (@ref{nncp-cfgmin} команда может помочь с созданием
366 конфигурационного файла без приватных ключей для этой цели).
367
368 Если вы действительно хотите взять с собой приватные ключи, то
369 @ref{nncp-cfgenc} команда способна зашифровать ваш конфигурационный
370 файл. Парольная фраза вами введённая усиливается функцией нагружающей и
371 центральный процессор и память.
372
373 @node UsecaseCallerRU
374 @subsection Дешёвая ночная связь
375
376 Стоимость Интернет/телефонного трафика может варьироваться, в
377 зависимости от времени дня. Ночные звонки/соединения могут быть дешевле
378 в два раза. Вы хотите посылать ваши файлы в это время, но позволять
379 изредка проходить высокоприоритетной почте в любое время. А также вы
380 хотите проходить любому трафику когда узел доступен через ЛВС (LAN).
381
382 Вы легко можете настроить ваши предпочтения в @ref{Call, настройках
383 звонков} для @ref{nncp-caller} команды, используемой при online связи.
384
385 @verbatim
386 neigh: {
387   [...]
388   some-node: {
389     [...]
390     addrs: {
391       lan: "[fe80::be5f:f4ff:fedd:2752%igb0]:5400"
392       wan: "some-node.com:5400"
393     }
394     calls: [
395       {
396         cron: "*/1 * * * *"
397         addr: lan
398         nice: MAX
399         onlinedeadline: 3600
400       }
401       {
402         cron: "*/10 * * * *"
403         addr: wan
404         nice: PRIORITY
405         xx: rx
406       }
407       {
408         cron: "*/1 0-7 * * *"
409         addr: wan
410         nice: BULK
411         onlinedeadline: 3600
412         maxonlinetime: 3600
413       }
414     ]
415   }
416 }
417 @end verbatim
418
419 @node UsecaseMulticastRU
420 @subsection Мультивещательная flooding рассылка
421
422 Необходимо разослать одно и то же почтовое сообщение или файл многим
423 участникам? Например обновления какой либо программы, списка участников
424 сети или доступных файлов? Но при этом вы не соединены лично с каждым из
425 них:
426
427 @verbatim
428    A-------->E---->F    A <-> B C E
429   / \        |\    ^    C <-> H J
430  /   \       |  \  |    E <-> D F G
431 v     v      v    \v    D <-> G
432 B     C      D---->G    J <-> K
433      / \     ^    /     K <-> D G
434     /   \    |   /
435    v     v   v  /
436    H     J<->K<-
437 @end verbatim
438
439 В NNCP есть особые @ref{Multicast, мультивещательные} форматы пакетов
440 позволяющие организовывать эффективную передачу одно единственного
441 пакета сразу нескольким получателям (flooding алгоритм). @strong{A}
442 отправляет пакет трём получателям. @strong{C} в свою очередь отсылает
443 ещё двум, а @strong{E} трём. Некоторые участники сети получат несколько
444 копий одного и того же пакета, как например @strong{D}, @strong{J},
445 @strong{G}, @strong{F}, но копии будут просто проигнорированы. Если
446 @strong{B} отошлёт пакет единственному ему известному @strong{A}, то
447 этот пакет распространится по всей сети подписантов широковещательной
448 зоны и дальше.
449
450 Более того, мультивещательные пакеты зашифрованы и для прочтения требуют
451 знание ключей. Но это не мешает их обрабатывать для дальнейшей пересылки!
452 Кроме того, совершенно не обязательно знать ключи отправителя. Таким
453 образом можно создать эхоконференцию для передачи файлов или команд
454 (например доставки почтовых сообщений).
455
456 Создаём ключи для мультивещательной зоны:
457
458 @example
459 $ nncp-cfgnew -area filelists -nocomments
460 areas: @{
461   filelists: @{
462     id: TOU5TKOW4JBIZJBX63D4776C72FMWDAUAUSZNJX4DFOITVYQ5ZQA
463     pub: DSHL5O6BK2R3QKJAIJ7BC4UIGE73EC2LJPOV3VTS44KYOTUQYZLA
464     prv: AYD5FAA4GDDSAD5N65NJLLFS6TG2NSPQ46KAQO5U722JLVG34SOQ
465   @}
466 @}
467 @end example
468
469 и отправляем ключевую пару всем кто может и хочет читать данную зону.
470 Посредникам, готовым участвовать в переотправке пакетов подписантам, но
471 которым не стоит "читать" пакеты, достаточно отправить только
472 идентификатор зоны. Например @strong{A} добавляет себе в конфигурацию:
473
474 @example
475 areas: @{
476   filelists: @{
477     id: TOU...
478     pub: DSH...
479     prv: AYD...
480     subs: ["B", "C", "E"]
481     incoming: /home/A/areas/filelists
482   @}
483 @end example
484
485 а @strong{E}, являющимся (как было решено) просто посредником:
486
487 @example
488 areas: @{
489   filelists: @{
490     id: TOU...
491     subs: ["D", "F", "G"]
492   @}
493 @end example
494
495 После распространения знания о @code{filelists} мультивещательной зоне
496 можно обмениваться @ref{FreqIndex, списками файлов}:
497
498 @example
499 $ nncp-file tree-of-A-20210715.txt.zst area:filelists:
500 $ nncp-toss -node self
501 @end example