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