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