Internet

Прохождение

Прохождение лабораторной работы «Internet». Если явно не указано иного, все примеры ниже выполнены с использованием системы fable.am-1.org (также доступной по IPv4 как users.am-1.org — используйте порт 5322 для подключения по SSH.)

Поскольку оценка за отчет снижается при повторах и заимствованиях (в том числе «из Internet» — а значит и из данного прохождения), я не привожу здесь подробных комментариев и пояснений к получаемым результатам, необходимых (в той или иной степени) в отчете. Кроме того, ради простоты, если задание требует повторить некоторое действие (подключиться к серверу, отправить запрос, etc.) многократно, ниже я иногда выполняю его один раз — считая, что повторить несложно по-аналогии.

Прохождение на полноту не претендует. Более того, вместо того, чтобы выполнять задания в полном объеме, я пытаюсь выполнить наибольшее их число.

Часть примеров продублирована в формате видеофрагментов. Для создания последних записывался протокол терминального сеанса, который затем редактировался (для удаления несущественных деталей), после чего воспроизводился в окне XTerm и записывался средствами FFmpeg.

Отдельные пояснения и примеры, быть может, подошли бы и тексту заданий самой лабораторной работы. Не исключено, что они будут позже перенесены.

Перед началом…

Для подключения к SSH-серверу fable нужен, очевидно, SSH-клиент. Я воспользуюсь таковым из пакета OpenSSH.

  1. Проверяю наличие моего (закрытого) ключа у агента:

    $ ssh-add -l 
    256 SHA256: jPVr5owiWTpUza9tdCbFjhvdAwH4HOtCS2pKhqDgbAK .ssh/id_ed25519 (ED25519)
    $ 
    
  2. Проверяю наличие (открытого) ключа системы в known_hosts:

    $ grep -F -- fable < ~/.ssh/known_hosts 
    fable.am-1.org,[users.am-1.org]:5322 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPQd9vDwbp7qBC7guXgLdxRInowiEIpjMZesL1bf2dqz
    $ 
    
  3. Подключаюсь:

    $ slogin -- ivan@fable.am-1.org 
    [ivan@fable] ~$ 
    

    Напомню, что список имен пользователей, имеющих доступ к fable, можно найти по следующим URI:

  4. Если бы у меня не было IPv6-связности, я бы мог подключится к fable по IPv4 — указав явно номер порта TCP 5322:

    $ slogin -4 -p 5322 -- ivan@users.am-1.org 
    [ivan@fable] ~$ 
    
  5. Пример подключения в виде видео: fable-ssh.webm.

Маршрутизация в Internet

Наиболее сложная часть первых двух заданий — избежать повторов при выборе хоста для определения маршрутов и времен доставки. Здесь можно использовать два подхода (хотя ни один из них не исключает оных повторов):

  1. взять какой-либо хорошо знакомый ресурс Всемирной паутины и использовать отладочные функции агента для определения HTTP-серверов, к которым агент выполняет запросы при работе с этим ресурсом;
  2. выполнить «случайный» запрос к поисковой машине; например, запрос http://duckduckgo.com/html/?kd=-1&q=outmaneuvering+similes даст нам такие имена хостов, как literarydevices.net, xwing-miniatures.fandom.com, etc.

Итак, прохождение.

  1. (#route.lgt) Построение маршрута (одного из четырех требуемых заданием.) Заполняем форму http://lg.he.net/ следующим образом:

    Commands
    
        ( ) Ping · (•) Traceroute · ( ) BGP Route
    
    Arguments
    
      • IP/Hostname: literarydevices.net___
      • [✓] Raw output (no tables)
      • (•) Prefer IPv6 name resolution
      • ( ) Prefer IPv4 name resolution
    
    Probe Clear
    

    Результат (для одного выбранного маршрутизатора — из двух нужных):

    core3.fmt2.he.net> traceroute ipv6 2606:4700:20::681a:166  source 2001:470:0:23c
    ::1 numeric
    
    Tracing the route to IPv6 node 2606:4700:20::681a:166 from 1 to 30 hops
    
      1    27 ms    8 ms   <1 ms 2001:470:0:eb::2
      2    18 ms    2 ms   38 ms 2001:504:0:1:0:1:3335:1
      3    58 ms    2 ms    1 ms 2606:4700:20::681a:166
    # Entry cached for another 60 seconds.
    

    Делаем Whois-запрос по отношению к адресу единственного в данном маршруте транзитного маршрутизатора — что дает нам информацию о владельце. (Поскольку адреса относятся к сети обмена данными, англ. Internet Exchange, IX, они не принадлежат никакой автономной системе.)

    fable$ whois -- 2001:504:0:1:0:1:3335:1 
    
    NetRange:       2001:504:: - 2001:504:0:FFFF:FFFF:FFFF:FFFF:FFFF
    CIDR:           2001:504::/48
    NetName:        EQUINIX-IX-V6
    
    
    NetRange:       2001:504:0:1:: - 2001:504:0:1:FFFF:FFFF:FFFF:FFFF
    CIDR:           2001:504:0:1::/64
    NetName:        EQUINIX-IX-V6-SJO
    NetHandle:      NET6-2001-504-1-2
    Parent:         EQUINIX-IX-V6 (NET6-2001-504-1)
    NetType:        Reassigned
    OriginAS:
    Organization:   Equinix, Inc. (EQUINIX)
    RegDate:        2006-01-10
    Updated:        2017-07-24
    
    
    OrgName:        Equinix, Inc.
    OrgId:          EQUINIX
    Address:        One Lagoon Drive
    City:           Redwood City
    StateProv:      CA
    PostalCode:     94065
    Country:        US
    RegDate:        2002-06-12
    Updated:        2020-05-07
    
    
  2. (#route.lgp) Для определения времени доставки выбираем в форме ping вместо traceroute:

    Commands
    
        (•) Ping · ( ) Traceroute · ( ) BGP Route
    

    Результат:

    core3.fmt2.he.net> ping ipv6 2606:4700:20::681a:66 numeric count 5
      Sending 5, 16-byte ICMPv6 Echo to 2606:4700:20::681a:66
    timeout 5000 msec, Hop Limit 64
    Reply from 2606:4700:20::681a:66: bytes=16 time=3ms Hop Limit=61
    Reply from 2606:4700:20::681a:66: bytes=16 time=1ms Hop Limit=61
    Reply from 2606:4700:20::681a:66: bytes=16 time=2ms Hop Limit=61
    Reply from 2606:4700:20::681a:66: bytes=16 time=2ms Hop Limit=61
    Reply from 2606:4700:20::681a:66: bytes=16 time=2ms Hop Limit=61
    Success rate is 100 percent (5/5), round-trip min/avg/max=1/2/3 ms.
    # Entry cached for another 60 seconds.
    
  3. (#route.lgh) Определяем IP-адреса системы следующим образом:

    $ ip address show 
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 5a:53:77:43:6d:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet6 2a00:1098:86:49:0:e:7743:6df3/64 scope global 
           valid_lft forever preferred_lft forever
        inet6 fe80::5853:77ff:fe43:6df3/64 scope link 
           valid_lft forever preferred_lft forever
    $ 
    

    Вводим единственный глобально-маршрутизируемый из них (2a00:1098:86:49:0:e:7743:6df3) в форму http://lg.he.net/:

    Commands
    
        ( ) Ping · (•) Traceroute · ( ) BGP Route
    
    Arguments
    
      • IP/Hostname: 2a00:1098:86:49:0:e:7743:6df3___
      • [✓] Raw output (no tables)
      • (•) Prefer IPv6 name resolution
      • ( ) Prefer IPv4 name resolution
    
    Probe Clear
    

    Получаем следующий маршрут (для одного маршрутизатора из четырех нужных — ⅛ оценки.)

    core3.fmt2.he.net> traceroute ipv6 2a00:1098:86:49:0:e:7743:6df3  source 2001:47
    0:0:23c::1 numeric
    
    Tracing the route to IPv6 node 2a00:1098:86:49:0:e:7743:6df3 from 1 to 30 hops
    
      1    41 ms    1 ms   <1 ms 2001:470:0:eb::2
      2    96 ms   88 ms  184 ms 2001:470:0:296::1
      3   156 ms  146 ms  141 ms 2001:470:0:2cf::1
      4   146 ms  290 ms  276 ms 2001:7f8:4::ae8c:1
      5   162 ms  129 ms  162 ms 2a00:1098:2::5d5d:8518
      6   139 ms  293 ms  181 ms 2a00:1098:2::5d5d:85f1
      7   142 ms  158 ms  141 ms 2a00:1098:86:49:0:e:7743:6df3
    # Entry cached for another 59 seconds.
    

    Совершенно аналогично выполняется и измерение времен доставки (ping.)

  4. (#route.mtr) Программа mtr установлена на fable, но, к сожалению, является шлюзом привилегий — другими словами, предполагает настройку системы, позволяющую ей выполняться от имени пользователя отличного от того, который непосредственно ее запускает. В качестве меры предосторожности шлюзы привилегий отключены настройками fable, а значит выполнить это задание на этой системе невозможно.

    А именно, корневая ФС подключена с опцией mount nosuid; дерево процессов порождено с опцией prctl PR_SET_NO_NEW_PRIVS.

DNS

Основная идея DNS заключается в том, что мы не можем хранить информацию о всех именах (хостов, иных сущностей) Internet на одном сервере, или даже на некотором количестве серверов, администрируемых одной организацией. Вместо этого, каждый сервер хранит информацию (ресурсные записи) для имен некоторого количества зон (другими словами — суффиксов), а равно хранит указатели на сервера, хранящие информацию о нижестоящих зонах.

Так, например, сервер, отвечающий за зону . хранит информацию о серверах, отвечающих за зону org., которые, в свою очередь, хранят ссылки на сервера, отвечающие за example.org., которые, затем, хранят конкретные записи для таких имен, как example.org. и www.example.org.

Таким образом, DNS позволяет по меньшей мере хранить информацию о хостах (в первую очередь — их адреса; поскольку сервера имен DNS сами являются хостами, с которыми нужно выполнять обмен данными в процессе работы с DNS) — и зонах самой системы DNS.

Кроме того, из DNS можно извлечь, например, следующую информацию.

Сложной частью данного раздела вновь является выбор из мириад доменных имен Internet нескольких, отличающихся от условных соцсеть.рф и поисковик.рф. Решить ее можно способом выше.

Некоторую сложность представляет и подсчет результатов. Так, например, в задании может требоваться получить из системы DNS три различных записи; первый запрос может вернуть две; второй — восемь, причем одна из них совпадает с одной из возвращенных предыдущим запросом. Чтобы претендовать на выполнение задания в трехкратном объеме (т. е. с оценкой на 75% выше номинала) нужно отдельно указать в отчете количество «оцениваемых» записей.

Начнем.

  1. (#dns.dig) Единственная существенная оговорка в данном задании — один запуск команды dig позволяет выполнить достаточно произвольное количество запросов — в том числе, как того требует задание, в отношении различных доменов второго уровня и с использованием разных типов записей.

    Выполним, например, одной командой нужные четыре запроса в отношении трех доменных имен принадлежащих двум различным доменам второго уровня (debian.org, example.com.) используя три типа ресурсных записей (MX, AAAA, SOA.)

    $ dig +noall +answer \
          lists.debian.org. MX \
          www.debian.org. AAAA \
          example.com. SOA \
          example.com. AAAA 
    lists.debian.org.   2365  IN  MX    0 bendel.debian.org.
    www.debian.org.      299  IN  AAAA    2001:67c:2564:a119::77
    example.com.        1139  IN  SOA   ns.icann.org. noc.dns.icann.org. 2019121384 7200 3600 1209600 3600
    example.com.        21001 IN  AAAA  2606:2800:220:1:248:1893:25c8:1946
    $ 
    

    В зависимости от используемого рекурсивного DNS-сервера запрос может также вернуть некоторое количество записей как additional и authority. Чтобы включить эти части DNS-ответа в вывод команды dig выше нужно включить в командную строку аргументы +additional +authority.

  2. (#dns.mx) Запись типа MX хранит адреса серверов, принимающих почту для некоторого почтового домена — имени, указываемого в адресах электронной почты после знака @. Например для почтовых ящиков Google Mail используются почтовые адреса вида нечто@gmail.com (или, в виде унифицированного идентификатора ресурса, URI: mailto:нечто@gmail.com.) Посмотрим, какие сервера принимают почту на эти адреса.

    $ dig +noall +answer  gmail.com MX 
    gmail.com.  3186  IN  MX  30 alt3.gmail-smtp-in.l.google.com.
    gmail.com.  3186  IN  MX  40 alt4.gmail-smtp-in.l.google.com.
    gmail.com.  3186  IN  MX   5 gmail-smtp-in.l.google.com.
    gmail.com.  3186  IN  MX  20 alt2.gmail-smtp-in.l.google.com.
    gmail.com.  3186  IN  MX  10 alt1.gmail-smtp-in.l.google.com.
    $ 
    

    Поскольку запрос вернул пять записей — при требуемых заданием двух, можно претендовать на выполнение задания в 2.5-кратном объеме.

  3. (#dns.srv) Адреса протокола обмена мгновенными сообщениями XMPP тоже имеют вид нечто@домен (xmpp:нечто@домен.) В этом случае, однако, используется два комплекта записей: один указывает, какие хосты принимают сообщения для учетных записей в некотором домене; другой — какие хосты обслуживают пользователей, владеющих этими записями.

    Выясним, например, к каким хостам (и с использованием каких портов TCP) должен подключиться пользовательский агент XMPP для работы от имени учетной записи, находящейся в домене jabber.ru:

    $ dig +noall +answer  _xmpp-client._tcp.jabber.ru SRV 
    _xmpp-client._tcp.jabber.ru. 21599 IN   SRV 0 0 5222 jabber.ru.
    _xmpp-client._tcp.jabber.ru. 21599 IN   SRV 10 0 443 allports.jabber.ru.
    $ 
    
  4. Примеры запросов выше в виде видео: dns-in.webm.

IRC

IRC можно рассматривать как ранний (используется с 1988 г.) протокол мгновенного обмена сообщениями. Как и более новый XMPP он допускает децентрализацию (несколько серверов могут быть объединены в сеть так, что пользователи любого сервера смогут передавать сообщения пользователям любого другого сервера в сети), но, в отличие от него, не поддерживает обмен сообщениями между сетями.

Хотя протокол утратил популярность среди «рядовых» пользователей Internet, он по-прежнему используется разработчиками и «опытными пользователями» программ, главным образом благодаря своей открытости и простоте: желающие воспользоваться IRC могут выбрать один из десятков существующих клиентов, или, при желании, за разумное время написать собственный. Так, например, ниже я воспользуюсь клиентом sic, объем исходного кода которого на C немногим больше 5.5 Кбайт.

Одним из наиболее активных известных мне каналов IRC является официальный канал СУБД PostgreSQL в сети Freenode. В этой же сети существуют официальные каналы ОС NetBSD, языка программирования Tcl, проектов Фонда Викимедиа, etc.

Одним из необычных, но распространенных правил каналов IRC является запрет на обнародование переписки. (В случаях, когда в правилах канала явно не указано иного.) Поэтому при выполнении данного задания (в особенности если предполагается публикация результатов — как, например, в случае данного прохождения) нужно создавать отдельный канал, договариваясь с другими заинтересованными лицами о подключении к нему в конкретное время. В данном прохождении, однако, для простоты я буду переписываться сам с собой.

  1. (#irc.test) Проверю для начала работу клиента используя «локальную» IRC-сеть.

    Отмечу, что используемая мной программа sic настолько проста, что даже не поддерживает редактирования и ведения истории ввода — для которых я воспользуюсь отдельной программой-«оберткой» rlwrap.

    $ rlwrap -- sic -h irc.am-1.org -n iv4n- 
    wata.am-1.org: 05/11/20 09:17 >< 001 (iv4n-): Welcome to the Internet Relay Network iv4n-!~iv4n-@7af2ad8c.host.hidden.invalid
    
    wata.am-1.org: 05/11/20 09:17 >< 396 (iv4n- 7af2ad8c.host.hidden.invalid): is your displayed hostname now
    :j #test 
    iv4n-       : 05/11/20 09:17 >< JOIN (): #test
    wata.am-1.org: 05/11/20 09:17 >< 332 (iv4n- #test): An unassuming testing channel
    wata.am-1.org: 05/11/20 09:17 >< 333 (iv4n- #test -Server- 1588901152): 
    wata.am-1.org: 05/11/20 09:17 >< 353 (iv4n- = #test): iv4n- iv4n3 iv4n ivan
    wata.am-1.org: 05/11/20 09:17 >< 366 (iv4n- #test): End of NAMES list
    IRC test.
    #test       : 05/11/20 09:17 <iv4n-> IRC test.
    #test       : 05/11/20 09:17 <ivan> Passed.
    :quit 
    wata.am-1.org: 05/11/20 09:17 >< NOTICE (iv4n-): Connection statistics: client 0.1 kb, server 1.8 kb.
    irc.am-1.org: 05/11/20 09:17 >< ERROR (): Closing connection
    sic: remote host closed connection
    $ 
    

    Теперь повторю все то же самое, но используя созданный для данного прохождения канал на Freenode.

    $ sic -h irc.freenode.net -n iv4n- 
    niven.freenode.net: 05/11/20 09:25 >< NOTICE (*): *** Looking up your hostname...
    
    niven.freenode.net: 05/11/20 09:25 >< 372 (iv4n-): - Thank you for using freenode!
    niven.freenode.net: 05/11/20 09:25 >< 376 (iv4n-): End of /MOTD command.
    iv4n-       : 05/11/20 09:25 >< MODE (iv4n-): +i
    :j ##rytvitok 
    iv4n-       : 05/11/20 09:25 >< JOIN (##rytvitok): 
    niven.freenode.net: 05/11/20 09:25 >< 353 (iv4n- @ ##rytvitok): iv4n- @iv4nshm4k0v
    niven.freenode.net: 05/11/20 09:25 >< 366 (iv4n- ##rytvitok): End of /NAMES list.
    Can you see me?
    ##rytvitok  : 05/11/20 09:25 <iv4n-> Can you see me?
    ##rytvitok  : 05/11/20 09:25 <iv4nshm4k0v> iv4n-: See you well and clear.
    :quit 
    iv4n-       : 05/11/20 09:25 >< QUIT (): Client Quit
    irc.freenode.net: 05/11/20 09:25 >< ERROR (): Closing Link: 2a00:1098:86:49:0:e:7743:6df3 (Client Quit)
    sic: remote host closed connection
    $ 
    
  2. Примеры IRC-сеансов выше в виде видео: irc-in.webm.

LDAP

Система LDAP, будучи иерархичной и децентрализованной, напоминает DNS, однако шире используется в сетях предприятий, нежели чем в Internet как таковом. Поэтому при выполнении на fable, основной сложностью данного раздела является поиск общедоступного LDAP-сервера для выполнения запросов. (Альтернативой является выполнение задания на системе, имеющей доступ к корпоративной сети организации, использующей LDAP.)

Одним из общедоступных серверов является db.debian.org, хранящий, в частности, информацию о разработчиках проекта Debian.

  1. (#ldap.sea) Поскольку для почтовых адресов и записей LDAP разработчиков Debian используются одни и те же идентификаторы, можно выяснить адрес электронной почты какого-либо разработчика (например, со страниц http://packages.debian.org/, http://bugs.debian.org/, etc.), и сделать запрос к серверу, подобный:

    $ ldapsearch -xLLL -b ou=users,dc=debian,dc=org \
          -H ldap://db.debian.org/ -- \
          "(uid=идентификатор)" 
    

    Но я предпочел запросить информацию (различительное имя, gecos, каноническое имя) о разработчике, занимающем в настоящий момент пост лидера проекта:

    $ ldapsearch -xLLL -b ou=users,dc=debian,dc=org \
          -H ldap://db.debian.org/ -- \
          "(supplementaryGid=dpl)"  dn gecos cn 
    dn: uid=jcc,ou=users,dc=debian,dc=org
    gecos: Jonathan Cristopher Carter,,,,
    cn: Jonathan
    
    $ 
    
  2. Пример запроса выше в виде видео: ldap-in.webm.

NTP

Протокол NTP используется для синхронизации времени между хостами Internet. Агенты NTP периодически обмениваются короткими сообщениями друг с другом (в соответствии с настройками), принимая такие решения, как, например, какую коррекцию хода системных часов следует установить? когда следует выполнить повторный запрос текущего времени? какие из вышестоящих агентов являются надежными? etc.

Как правило, в сетях организаций настраиваются один—два агента, которые синхронизируются с «внешними» хостами, и, в свою очередь, используются для синхронизации времени всеми остальными хостами сети. В типовых случаях, использование протокола NTP требует минимального внимания со стороны администратора сети.

Агенты, синхронизирующиеся с каким-либо считаемым достоверным источником (как, например, приемник сигналов GPS) относят к слою (англ. stratum) 1. (К слою 0 условно относят сами источники времени — хотя они не являются ни агентами, ни хостами.) Агенты, синхронизирующиеся с ними составляют слой 2; именно с ними, как правило, выполняется синхронизация времени «серверов времени» организаций и домашних сетей — которые, тем самым, относят к слою 3. Аналогично выделяют и последующие слои, до слоя 15. Номером слоя 16 отмечают агентов, часы которых не считают синхронизованными.

  1. (#ntp.pn) Поскольку fable является контейнером (изолированной частью другой системы), у нее отсутствуют собственные системные часы. (Вместо которых она полагается на системные часы основной системы.) Следовательно, применение NTP-агента на ней нецелесообразно, а значит и выполнить это задание не удастся.

  2. (#ntp.rem) Выполним, для примера, запрос к агенту, выполняемому на хосте wata.am-1.org:

    $ ntpq -pn -- wata.am-1.org 
       remote     refid  st t when poll reach delay offset jitter
    =============================================================
     0.debian.po .POOL.  16 p    -   64    0  0.000 +0.000  0.000
     1.debian.po .POOL.  16 p    -   64    0  0.000 +0.000  0.000
     2.debian.po .POOL.  16 p    -   64    0  0.000 +0.000  0.000
     3.debian.po .POOL.  16 p    -   64    0  0.000 +0.000  0.000
     ff05::101   .MCST.  16 M    -   64    0  0.000 +0.000  0.000
    -92.243.6.5  85.199.2 2 u  333 1024  367 15.402 -0.357  0.294
    *81.21.65.16 85.199.2 2 u  515 1024  377  7.086 +0.311  0.186
    -139.162.192 119.204. 3 u 1024 1024  377  2.553 -2.778  2.417
    +178.62.250. 131.176. 2 u  802 1024  377  7.488 +0.504  0.654
    +134.0.16.1  194.35.2 2 u  896 1024  377  4.138 -0.002  0.243
    $ 
    
  3. Пример запроса выше в виде видео: ntp-in.webm.

Rsync

Программа Rsync и одноименный протоколе рассматривались в лекции. В Internet протокол используется, как правило, для (односторонней) синхронизации зеркал файловых архивов; следовательно, подходящие для выполнения большей части заданий сервера можно найти по набору ключевых слов, подобному: public rsync mirror.

  1. (#rsync.pub) Для выполнения данного задании я собираюсь получить копию какого-либо файла или файлов с сервера rsync://mirror.yandex.ru/.

    1. Вспоминая материал лекции, начну с получения списка модулей:

      $ rsync -- rsync://mirror.yandex.ru/ 
      
      debian-security Debian Linux Security
      debian-volatile Debian Volatile archive
      debian-cd       Debian Linux CD
      
      $ 
      
    2. Последовательно указывая в командной строке все более глубокие директории, нахожу на сервере подходящие к условиям задания директорию и файл в ней:

      $ rsync -- rsync://mirror.yandex.ru/debian-cd/10.4.0-live/amd64/iso-hybrid/ 
      
      2,757,427,200 debian-live-10.4.0-amd64-kde.iso
          1,156,977 debian-live-10.4.0-amd64-kde.log
             81,901 debian-live-10.4.0-amd64-kde.packages
      
      $ 
      
    3. Выполняю синхронизацию. Дважды — хотя и без требуемой заданием паузы в 30 минут.

      $ rsync -v -ub -rOtH --suffix=.~"$(date +%s)"~ \
            --include=10.4.0-live/{,amd64/{,iso-hybrid/{,debian-live-10.4.0-amd64-kde.log}}} \
            --exclude=\* -- \
            rsync://mirror.yandex.ru/debian-cd/ \
            /tmp/debian-cd.ivan/ 
      receiving incremental file list
      created directory /tmp/debian-cd.ivan
      10.4.0-live/
      10.4.0-live/amd64/
      10.4.0-live/amd64/iso-hybrid/
      10.4.0-live/amd64/iso-hybrid/debian-live-10.4.0-amd64-kde.log
      
      sent 206 bytes  received 1,157,468 bytes  771,782.67 bytes/sec
      total size is 1,156,977  speedup is 1.00
      $ rsync -v -ub -rOtH --suffix=.~"$(date +%s)"~ \
            --include=10.4.0-live/{,amd64/{,iso-hybrid/{,debian-live-10.4.0-amd64-kde.log}}} \
            --exclude=\* -- \
            rsync://mirror.yandex.ru/debian-cd/ \
            /tmp/debian-cd.ivan/ 
      receiving incremental file list
      
      sent 174 bytes  received 159 bytes  222.00 bytes/sec
      total size is 1,156,977  speedup is 3,474.41
      $ 
      

      Отмечу, что объем переданных Rsync данных (за исключением, разумеется, неучитываемых клиентом накладных расходов — как, например, заголовков TCP/IP) при повторной синхронизации (которая на деле свелась к простой проверке идентичности свойств файлов) составил всего 333 байта (!)

    4. Пример выполнения команд выше в виде видео: rsync-in.webm.

  2. (#rsync.ssh) В данном прохождении я предполагаю использование fable в качестве единственной платформы для запуска клиентов — и ее же в качестве единственного SSH-сервера. Что, по большему счету, лишает задачу синхронизации через SSH какого-либо смысла.

  3. (#rsync.filt) Выше я уже использовал требуемые заданием опции --include=, --exclude=, поэтому для выполнения мне остается лишь добавить к копии какой-либо еще файл; например — debian-live-10.4.0-amd64-kde.packages из ранее полученного списка:

    $ rsync -v -ub -rOtH --suffix=.~"$(date +%s)"~ \
          --include=10.4.0-live/{,amd64/{,iso-hybrid/{,debian-live-10.4.0-amd64-kde.{log,packages}}}} \
          --exclude=\* -- \
          rsync://mirror.yandex.ru/debian-cd/ \
          /tmp/debian-cd.ivan/ 
    receiving incremental file list
    10.4.0-live/amd64/iso-hybrid/debian-live-10.4.0-amd64-kde.packages
    
    sent 269 bytes  received 82,143 bytes  164,824.00 bytes/sec
    total size is 1,238,878  speedup is 15.03
    $ rsync -v -ub -rOtH --suffix=.~"$(date +%s)"~ \
          --include=10.4.0-live/{,amd64/{,iso-hybrid/{,debian-live-10.4.0-amd64-kde.{log,packages}}}} \
          --exclude=\* -- \
          rsync://mirror.yandex.ru/debian-cd/ \
          /tmp/debian-cd.ivan/ 
    receiving incremental file list
    
    sent 246 bytes  received 183 bytes  286.00 bytes/sec
    total size is 1,238,878  speedup is 2,887.83
    $ 
    

    Как видно, добавленный файл увеличил объем передаваемых при повторной синхронизации (проверке) данных (учитываемых Rsync) на 96 байт.