Internet

Методические указания к лабораторной работе по курсу «инфокоммуникационные системы и сети»

К рассмотрению предложен ряд протоколов, применяемых в современном Internet, в ряде их реализаций. Протокол HTTP осознанно обойден вниманием, поскольку рассмотрен в работе, посвященной Всемирной паутине. (Которая, в противном случае, была бы неполной.) Вопросам, связанным с применением протокола SSH, иных прикладных криптографических систем, и системы электронной почты (Internet email) также посвящены отдельные работы.

Номинальный вклад этой работы в оценку — 40 единиц.

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

  1. (2 ед.) Используя http://lg.he.net/ определите четыре маршрута до каких-либо двух хостов Internet с каких-либо двух маршрутизаторов — и соответствующие времена доставки. (Функция traceroute.) Опишите четыре промежуточных маршрутизатора (автономная система, владелец, географическое расположение — используя, например, данные системы Whois) — по одному для каждого маршрута.

    Обратите внимание, что для включения результата в «текстовый» отчет, может быть полезно применить опцию raw output (no tables).

    Пример: маршрут до хоста example.com с маршрутизатора Teraco JB1, Йоханнесбург.
    core1.jnb1.he.net> traceroute ipv6 2606:2800:220:1:248:1893:25c8:1946  source 2001:470:0:25e::1 numeric
    
    Tracing the route to IPv6 node 2606:2800:220:1:248:1893:25c8:1946 from 1 to 30 hops
    
      1   156 ms  159 ms  156 ms 2001:470:0:191::1
      2   236 ms  230 ms  225 ms 2001:470:0:2cf::2
      3   228 ms  250 ms  228 ms 2001:470:0:299::1
      4   230 ms  229 ms  245 ms 2001:470:0:335::2
      5   229 ms  246 ms  229 ms 2606:2800:4204:f::2
      6   229 ms  228 ms  228 ms 2606:2800:220:1:248:1893:25c8:1946
    
    
  2. (1 ед.) Используя http://lg.he.net/ определите времена доставки ICMP echo-пакетов до каких-либо двух хостов Internet с каких-либо двух маршрутизаторов. («Каждый с каждым.» Функция ping.)

    Пример: время доставки до хоста example.org с маршрутизатора Equinix Osaka (OS1), Осака.
    core1.osa1.he.net> ping ipv6 2606:2800:220:1:248:1893:25c8:1946 numeric count 5
      Sending 5, 16-byte ICMPv6 Echo to 2606:2800:220:1:248:1893:25c8:1946
    timeout 5000 msec, Hop Limit 64
    Reply from 2606:2800:220:1:248:1893:25c8:1946: bytes=16 time=88ms Hop Limit=60
    Reply from 2606:2800:220:1:248:1893:25c8:1946: bytes=16 time=88ms Hop Limit=60
    Reply from 2606:2800:220:1:248:1893:25c8:1946: bytes=16 time=87ms Hop Limit=60
    Reply from 2606:2800:220:1:248:1893:25c8:1946: bytes=16 time=88ms Hop Limit=60
    Reply from 2606:2800:220:1:248:1893:25c8:1946: bytes=16 time=87ms Hop Limit=60
    Success rate is 100 percent (5/5), round-trip min/avg/max=87/87/88 ms.
    
    
  3. (2 ед.) Определите глобально-маршрутизируемый IP-адрес используемой системы. Используя http://lg.he.net/ определите маршрут и времена доставки до нее с каких-либо четырех маршрутизаторов.

    Пример: определение глобально-маршрутизируемых адресов системы в выводе команды ip address show.
    $ 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
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:8d:37:20:ad:1a brd ff:ff:ff:ff:ff:ff
        inet6 2001:db8:df42::72b6/64 scope global 
           valid_lft forever preferred_lft forever
        inet6 fe80::28d:37ff:fe20:ad1a/64 scope link 
           valid_lft forever preferred_lft forever
        inet 172.27.191.53/16 brd 172.27.255.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet 192.0.2.34/24 brd 192.0.2.255 scope global eth0
           valid_lft forever preferred_lft forever
    $ 
    
  4. (2 ед.) Соберите командой mtr статистику по временам доставки пакетов до какого-либо хоста Internet. Сбор статистики должен выполняться в течение четырех минут и включать порядка 64 циклов доставки.

    Пример: сбор статистики по временам доставки до хоста example.net программой mtr.
    $ mtr --report --report-cycles=67 --interval=4 \
          -- example.net 
    HOST: 2001:db8-   Loss% Snt  Last   Avg  Best  Wrst StDev
      1.|-- ???       100.0  67   0.0   0.0   0.0   0.0   0.0
      2.|-- ???       100.0  67   0.0   0.0   0.0   0.0   0.0
    
      7.|-- ???       100.0  67   0.0   0.0   0.0   0.0   0.0
      8.|-- 2606:2800- 0.0%  67 160.6 163.7 158.5 175.6   3.6
    $ 
    

Равноранговое распространение больших объемов данных; BitTorrent

  1. (2 ед.) Примите участие в законном распространении каких-либо данных с использованием протокола BitTorrent (например, обратившись к ресурсам из списка ниже.) Запишите сведения о распространяемых данных (infohash, общий объем, краткое описание) и семи участниках «torrent-роя» (swarm; IP-адрес, объем переданных и полученных данных, время соединения, использовалось ли шифрование), с которыми выполнялся обмен данными.

  2. (2 ед.) Сформируйте .torrent-файл для набора данных, состоящего из небольшого количества файлов, общим объемом порядка 4 ÷ 16 MiB. Распространите данные на две другие машины без использования torrent tracker (используя, например, local peer discovery, LPD, или DHT.)

    Пример: формирование .torrent-файла программой rhash.
    $ rhash --bt-batch="$(date +%s.%N)".torrent \
          -- gpt.noaccyij mbr.roawyavo 
    1582742234.104437739.torrent saved
    $ 
    

Система доменных имен DNS

Основным инструментом в данном разделе является программа dig пакета BIND.

  1. (1 ед.) Выполните четыре запроса к DNS используя dig. Используйте не менее двух различных типов ресурсных записей; имена должны принадлежать по меньшей мере двум различным доменам второго уровня.

    Пример: получение ресурсных записей DNS типа AAAA для двух имен программой dig.
    $ dig +noall +answer aaaa example.com example.net 
    example.com.    86400   IN AAAA 2606:2800:220:1:248:1893:25c8:1946
    example.net.    84850   IN AAAA 2606:2800:220:1:248:1893:25c8:1946
    $ 
    
  2. (1 ед.) Получите из DNS две различные MX-записи. Объясните их назначение и действие.

  3. (2 ед.) Получите из DNS три различные SRV-записи. Объясните их назначение и действие.

    Обратите внимание, что SRV-записи сравнительно редки. Несколько помочь в их поиске могут, например, следующие ресурсы. (Следует отметить, впрочем, что подобно тому, как MX-записи не являются необходимыми для SMTP, SRV-записи не являются необходимыми для XMPP. Кроме того, организации, использующие Kerberos и LDAP могут считать их частью «внутренней» инфраструктуры и скрывать такие записи при запросах «извне».)

    _kerberos
    _ldap (возможно)
    http://sources.debian.org/src/kerberos-configs/2.6/krb5.conf.template/
    _xmpp-client
    _xmpp-server
    http://list.jabber.at/
    http://xmpp.net/directory.php
    http://search.jabber.network/
  4. (2 ед.) Выполните проверку цифровых подписей трех различных наборов записей (RRset) DNS используя delv или dig +sigchase. Укажите, какие именно наборы были проверены и была ли проверка успешной в каждом случае.

  5. (1 ед.) Выполните проверку цифровых подписей трех различных наборов записей используя http://dnsviz.net/.

  6. (1 ед.) Опубликуйте в DNS три «осмысленных» записи для двух различных имен. Удостоверьтесь в их работоспособности.

    (Здесь можно воспользоваться, например, http://freedns.afraid.org/.)

Текстовые конференции в реальном времени; IRC

  1. (1 ед.) Подключитесь к какому-либо серверу IRC (Freenode, или же локальному); например, используя sic. Найдите «проверочную» конференцию и отправьте в нее сообщение. Получите ответ.

    Пример использования IRC-клиента sic.
    $ rlwrap -- sic -h irc.example.org -n bob 
    irc.example.org: 02/02/20 14:15 >< 001 (bob): Welcome to the Internet Relay Network bob!~bob@[2001:db8::4:57]
    irc.example.org: 02/02/20 14:15 >< 002 (bob): Your host is irc.example.org
    :j #testchan 
    bob         02/02/20 14:15 >< JOIN (): #testchan
    irc.example.org: 02/02/20 14:15 >< 332 (bob #testchan): Generic testing channel
    irc.example.org: 02/02/20 14:15 >< 353 (bob = #testchan): bob
    irc.example.org: 02/02/20 14:15 >< 366 (bob #testchan): End of NAMES list
    alice       02/02/20 14:17 >< JOIN (): #testchan
    #testchan   : 05/11/20 14:17 <alice> Hello, bob! 
    Hi yourself!
    #testchan   : 05/11/20 14:17 <bob> Hi yourself!
    alice       02/02/20 14:17 >< QUIT ():
    :q 
    irc.example.org: 02/02/20 14:17 >< NOTICE (bob): Connection statistics: N/A.
    irc.example.org: 02/02/20 14:17 >< ERROR (): Closing connection
    sic: remote host closed connection
    $ 
    
  2. (2 ед.) Подключитесь к серверу «диагностическим» TCP-клиентом (socat, PuTTY, etc.) Отправьте сообщение в «проверочную» конференцию и получите ответ.

    Пример: сеанс взаимодействия с IRC-сервером.
    $ socat  STDIO  TCP:irc.example.org:6667 
    NICK alice
    USER alice 0 * :Alice
    :irc.example.org 001 alice :Welcome to the Internet Relay Network alice!~alice@[2001:db8::1:23]
    :irc.example.org 002 alice :Your host is irc.example.org
    JOIN #testchan 
    :alice!~alice@[2001:db8::1:23] JOIN :#testchan
    :irc.example.org 332 alice #testchan :Generic testing channel
    :irc.example.org 353 alice = #testchan :alice bob
    :irc.example.org 366 alice #testchan :End of NAMES list
    PRIVMSG #testchan :Hello, bob! 
    :bob!~bob@[2001:db8::4:57] PRIVMSG #testchan :Hi yourself!
    QUIT
    :irc.example.org NOTICE alice :Connection statistics: N/A.
    ERROR :Closing connection
    $ 
    
  3. (2 ед.) Запустите собственный IRC-сервер (например, ngircd.) Проверьте работоспособность, создав не менее двух каналов и подключив не менее трех клиентов.

Kerberos

  1. (1 ед.) Используя kinit, аутентицируйтесь в домене (realm) Kerberos. Сравните вывод klist до и после аутентикации. Удостоверьтесь в действительности полученного ticket успешно обратившись к какому-либо серверу, аутентицировавшись используя GSSAPI.

  2. (1 ед.) Измените собственный пароль в домене Kerberos используя kpasswd.

Иерархические базы данных LDAP

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

Существует, впрочем, некоторое количество серверов, доступных через Internet; некоторые из них перечислены в списке http://ldapwiki.com/wiki/Public%20LDAP%20Servers (.) Проверить доступность сервера можно, например, командой ldapsearch -xLLL -o nettimeout=7 -H ldap://ldap.example.com/ 2>&1 | less -UF .

  1. (2 ед.) Выполните запрос к серверу LDAP, подобрав критерий поиска так, чтобы получить в результате 1 ÷ 11 записей. Объясните результат.

    Пример: получение перечня «организационных единиц», хранимых в базе данных проекта Debian.
    $ ldapsearch -xLLL -b dc=debian,dc=org \
          -H ldap://db.debian.org/ -- "(ou=*)" 
    dn: ou=hosts,dc=debian,dc=org
    objectClass: top
    objectClass: organizationalUnit
    ou: hosts
    
    dn: ou=users,dc=debian,dc=org
    objectClass: top
    objectClass: organizationalUnit
    ou: users
    
    $ 
    

Сетевая файловая система NFS

  1. (1 ед.) Выясните, какие сетевые файловые системы подключены к используемой системе (например, выполнив df -t nfs4 — или же обратившись к /proc/mounts непосредственно.) Прочитайте пять файлов с удаленного сервера, включая по меньшей мере один обычный.

  2. (1 ед.) Разместите на NFS-сервере три файла, включая по меньшей мере одну новую директорию. Удостоверьтесь в их доступности с удаленного клиента.

  3. (1 ед.) Используя exportfs сделайте какую-либо директорию доступной через NFS. Удостоверьтесь в работоспособности, подключив ее.

    Обратите внимание, что без использования Kerberos, содержащиеся в NFS-запросах идентификаторы пользователя и группы тривиально подделать, поэтому крайне желательно применять опцию all_squash (и, видимо, ro.)

Телеконференции; NNTP

  1. (1 ед.) Подключитесь к какому-либо серверу NNTP (например, nntp://news.aioe.org/) используя какой-либо пользовательский агент телеконференций (netnews user agent; Alpine, Neomutt, etc.) Отправьте сообщение в какую-либо «проверочную» конференцию (news:alt.test, news:relcom.test, etc.) Получите ответ.

  2. (1 ед.) Зарегистрируйтесь на каком-либо NNTP-сервере, требующем регистрации (например, Eternal September.) Отправьте сообщение в «проверочную» конференцию. Получите ответ.

  3. (2 ед.) Подключитесь к серверу «диагностическим» TCP-клиентом (socat, PuTTY, etc.) Отправьте сообщение в «проверочную» конференцию и получите ответ.

Синхронизация времени; NTP

  1. (1 ед.) Изучите состояние локального NTP-сервера, выполнив ntpq -pn. Объясните вывод команды.

    Пример: получение информации о состоянии локального NTP-сервера программой ntpq.
    $ ntpq -pn 
         remote      refid  st t when poll reach  delay offset jitter
    =================================================================
     0.debian.pool.n .POOL. 16 p    -   64    0   0.000  0.000  0.001
     1.debian.pool.n .POOL. 16 p    -   64    0   0.000  0.000  0.001
     2.debian.pool.n .POOL. 16 p    -   64    0   0.000  0.000  0.001
     3.debian.pool.n .POOL. 16 p    -   64    0   0.000  0.000  0.001
     ff05::101       .XFAC. 16 M    -   64    0   0.000  0.000  0.001
    *195.112.113.253 .GPS.   1 u  769 1024  377  43.508  0.836  0.594
    +91.209.94.10    .SOCK.  1 u  831 1024  377  38.652  1.426  0.429
    +162.159.200.1   10.71.- 3 u  464 1024  377  72.663 -2.142  0.429
    -2001:470:d43f:f .GPS.   1 u  575 1024  377 190.548 16.360 10.247
    -151.80.211.8    37.59.- 3 u  534 1024  377  86.263 -3.197  0.107
    $ 
    
  2. (2 ед.) Изучите состояние двух удаленных серверов NTP.

  3. (1 ед.) Составьте список общедоступных NTP-серверов Internet, отвечающих на запросы ntpq (в частности — ntpq -p.)

Синхронизация директорий; Rsync

  1. (2 ед.) Получите доступ к какому-либо из общедоступных Rsync-серверов Internet. Найдите на сервере директорию с небольшим (1 ÷ 16 MiB) общим объемом содержащихся файлов (или же ограничьте данные большей по объему директории таким объемом используя опции ряда --filter=.) Выполните рекурсивную синхронизацию локальной директории с содержимом найденной, сохраняя кроме того времена последнего изменения файлов (например, -rOt.) Через некоторое время (не менее 30 мин) выполните повторную синхронизацию. В обоих случаях, запишите список переданных файлов, объемы переданных данных и время синхронизации (-v.)

  2. (2 ед.) Выполните синхронизацию директорий между двумя хостами используя Rsync поверх SSH. Измените один из файлов директории-источника и удостоверьтесь в том, что при повторной синхронизации этот и только этот файл был обновлен.

  3. (1 ед.) Выполните синхронизацию небольшой (1 ÷ 16 MiB) выборки из большой (не менее 64 MiB) директории используя фильтр команды rsync (например, --filter=, --include=, --exclude=.) Измените настройки фильтра так, чтобы в выборку вошел еще один небольшой файл и удостоверьтесь в том, что при повторной синхронизации этот файл был добавлен к копии.

  4. (1 ед.) Измените поведение команды rsync используя одну из опций ниже. Объясните изменения.

    • -c
    • -H
    • -L
    • -u
    • -x

Socat — универсальный клиент-сервер

Изучите возможности программы socat.

  1. (1 ед.) Подключитесь к какому-либо серверу используя протокол с гарантией доставки. Удостоверьтесь в успешности подключения получив сообщение о готовности или ответ на какой-либо запрос.

    Пример: подключение к TCP-серверу example.net:80 и выполнение проверочного запроса.
    $ printf %s\\r\\n \
          "GET /nonexistent HTTP/1.1" "Host: example.net" "" \
          | socat  STDIO  TCP6:example.net:80,end-close 
    HTTP/1.1 404 Not Found^M
    Accept-Ranges: bytes^M
    Age: 232089^M
    Cache-Control: max-age=604800^M
    Content-Type: text/html; charset=UTF-8^M
    Date: Wed, 26 Feb 2020 19:10:09 GMT^M
    Expires: Wed, 04 Mar 2020 19:10:09 GMT^M
    Last-Modified: Mon, 24 Feb 2020 02:40:27 GMT^M
    Server: ECS (dcb/7F15)^M
    Vary: Accept-Encoding^M
    X-Cache: 404-HIT^M
    Content-Length: 1256^M
    ^M
    <!doctype html>
    <html>
    <head>
        <title>Example Domain</title>
    
    </body>
    </html>
    $ 
    
  2. (1 ед.) Запустите собственный сервер используя протокол с гарантией доставки в качестве транспортного. Сервер должен обслуживать произвольное количество подключений. Удостоверьтесь в работоспособности.

    Пример: запуск фонового SCTP-сервера, ожидающего подключения на порту 10085.
    $ socat  SCTP6-LISTEN:10085,fork \
          EXEC:"printf %s\\r\\n Hello!" & 
    
    
  3. (1 ед.) Запустите собственный сервер. Сервер должен обслуживать произвольное количество подключений. Обеспечьте обработку не менее двух типов запросов. Удостоверьтесь в корректной обработке запросов.

  4. (1 ед.) В некоторых сетях для управления доступом к Internet используется proxy протокола HTTP или SOCKS. Использовать такой способ доступа, однако, позволяют лишь отдельные программы-клиенты.

    Реализуйте сервер, принимающий соединения и «передающий» их какому-либо другому серверу через proxy. Удостоверьтесь в работоспособности подключившись соответствующим клиентом к целевому серверу.

Internet-телефония (VoIP)

  1. (1 ед.) Установите равноранговое VoIP-соединение между машинами программой Linphone или Twinkle. Выявите используемые программой Internet-соединения (например, командой lsof.)

  2. (2 ед.) Установите VoIP-соединение через SIP-коммутатор.

Мгновенные сообщения; XMPP

  1. (2 ед.) Получите (санкционированный) доступ к серверу XMPP. Создайте новую конференцию; удостоверьтесь, что к ней подключились три участника. Запишите протокол какого-либо обсуждения (не менее пяти комментариев от каждого из участников.)

    Вероятно, что для выполнения этого задания потребуется зарегистрироваться на каком-либо сервере XMPP; списки таких серверов можно найти, например, на следующих ресурсах.

  2. (1 ед.) Удостоверьтесь в том, что созданная конференция проиндексирована поисковой системой http://search.jabber.network/.

  3. (1 ед.) Используя «отладочные» средства пользовательского агента получите две различных стансы (англ. stanzas) XMPP, переданных от клиента к серверу, и две, переданные в обратном направлении. Объясните их назначение и действие.

Оформление отчета

  1. (1 ед.) Оформите отчет в виде документа HTML.

    Обратите внимание на то, что документ должен не только корректно воспроизводится соответствующим программным обеспечением, но и успешно проходить формальную проверку с использованием http://html5.validator.nu/ и (или) иных подобных средств. Элементы и атрибуты HTML должны быть использованы семантически-обоснованно — сообразно смыслу, которым их наделяет текущая практика и актуальные спецификации.

  2. (1 ед.) Опубликуйте отчет на сервере NNTP.

    Обратите внимание, что если правилами конференции и сервера явно не указано иного, размещаемые материалы должны иметь «текстовый» (основанный на ASCII и соответствующий MIME-типу text/plain) формат. Кроме того, допускается использование единственной MIME-части; другими словами, сообщение не должно содержать «прикрепленных» файлов.