Протоколы Интернет 2016-2017

Задачи курса

tracert-as
Написать скрипт, который выводит маршрут (traceroute) и номера автономных систем промежуточных узлов, используя ответы службы whois региональных регистраторов.

Вход: IP-адрес (или DNS-имя) передается в качестве аргумента командной строки.
Выход:
[1-3 балла] вывести результат трассировки (в пределах разумного TTL), для "белых" IP-адресов из него указать номер автономной системы и название сети,
[4-6 балла] то же, плюс обращение к правильному whois-серверу и определение страны промежуточного IP,
[7-10 баллов] то же, плюс самостоятельная реализация traceroute (сборка пакета с нужным TTL и разбор ICMP)

Формат вывода для каждого адреса из трассировки:
N. IP\r\n
NETNAME, AS, COUNTRY\r\n
\r\n

где N -- номер хоста в трассировке (начинается с 1), IP - ipv4-адрес хоста; NETNAME, AS, COUNTRY - имя сети, номер автономной системы (^\d+$) и страна соответственно. Вся информация должна быть получена из ответа/ответов whois-сервера. После вывода информации о хосте пустая строка (\r\n).

Если какая-либо информация отсутствует, то не включаем ее в вывод. Например, если нашли в ответе от whois-сервера только имя сети и страну, то во второй строке пишем:
NETNAME, COUNTRY

Если ip-адрес в трассировке является локальным, пишем в строке с информацией слово local

Обращаем внимание, что EU - это не страна.

Если узел в трассировке не отвечает, то вместо IP пишем *, строка с информацией пропадает, пустая строка остается.

Если указан некорректный адрес, то вместо трассировки пишем
ADDRESS is invalid, где ADDRESS - некорректный параметр

Если не хватает прав, то нужно вежливо об этом сказать, а не падать, выдавая весь стектрейс.

Пример вывода:
1. 192.168.1.1
local

2. *

3. 92.242.29.74
miralogic-net-200, 12668, RU

4. 212.193.163.6
imgu-net, 60600, RU


sntp
Написать "обманывающий" сервер времени
Вход: передается количество секунд (+ или -) смещения относительно точного времени
Выход:
[1-4 балла] ответить на корректные запросы по протоколу SNTP корректными ответами (поля: LI, VN, Mode, Stratum и время должны быть заполнены осмысленным образом)
[5-7 баллов] то же, плюс многопоточность (thread pool)

Формат ввода-вывода
Параметры:
-d - delay, может быть как положительным, так и отрицательным целым числом, означающим число секунд, на которое должны обманывать клиентов, по умолчанию 0
--port, -p - порт, который слушаем, по умолчанию 123

./sntp.py -d 5
сервер в ответе добавляет 5 секунд к текущему времени
Сервер сообщает на stdout о начале работы, а при подключении очередного клиента выводит его ip-адрес

Не забываем проверять работоспособность со стандартными утилитами:
ntpdate -d -q localhost
rdate -u -n -v -p localhost

При реализации многопоточности обращаем внимание, что время на запуск нового треда будет сравнимо со временем на формирование ответного пакета

portscan
Написать сканер TCP- и UDP-портов удалённого компьютера.
Вход: адрес хоста и диапазон портов
Выход: итоговая оценка складывается как сумма:
[1-2 балла] список открытых TCP-портов,
[1-4 балла] список открытых UDP-портов,
[1-3 балла] многопоточность,
[1-6 балла] распознать прикладной протокол по сигнатуре (NTP/DNS/SMTP/POP3/IMAP/HTTP).

Формат ввода-вывода
Параметры:
-t - сканировать tcp
-u - сканировать udp
-p N1 N2, --ports N1 N2 - диапазон портов

Вывод:
В одной строке информация об одном открытом порте (через пробел):
TCP 80 HTTP
UDP 128
UDP 123 SNTP

Если протокол не распознали, то пишем только TCP/UDP и номер порта.
Если нужно больше прав при запуске, то стоит вежливо об этом сказать, а не громко падать.

dns-cache
Написать кеширующий DNS-сервер, отвечающий на корректные запросы по протоколу DNS (RFC 1035) корректными ответами, данные сервер должен брать из своего кэша или (в случае устаревания или отсутствия данных в кэше) переспрашивать у указанного сервера (см. BIND forwarders).

[1-7] реализация кэша на основе query records в качестве ключа.
[8-15] парсинг пакета для помещения в кэш записей из секций AN, NS, AR (в серии запросов dig mail.ru mx; dig mxs.mail.ru второй ответ - из кеша). Самостоятельная сборка пакета с ответом.
[16-20] обработка зацикливания (корректное поведение сервера в случае, если в качестве «старшего сервера» указан он же сам, или экземпляр его, запущенный на другой машине)

Обязательно должно быть реализовано
* устаревание данных в кэше (обработка TTL), при этом клиентам должны отдавать актуальное значение ttl, то есть если 10 секунд назад от форвардера получили ответ, что данные устареют через 700 секунд, то клиенту говорим, что ttl для имеющейся у нас в кэше записи равен 690
* временный отказ вышестоящего сервера (сервер не должен терять работоспособность (уходить в бесконечное ожидание, падать с ошибкой и т.д.), если старший сервер почему-то не ответил на запрос к нему)

Формат ввода-вывода
Параметры:
-p, --port - слушаемый порт udp (по умолчанию 53)
-f --forwarder - ip-адрес или символьное имя форвардера, с возможным указанием порта, например, 8.8.8.8 или 8.8.8.8:53 (порт по умолчанию 53)
-h, --help - вывод справки

При запуске сервера выводим на stdout информацию об успехе запуска сервера.
Для каждого запроса от клиентов выводим на stdout информацию в следующем формате:
IP, TYPE, QUESTION, SOURCE,
где IP - адрес клиента, TYPE - тип DNS-запроса (латиницей, заглавными буквами), QUESTION - информацию о чем запрашивают, SOURCE - источник, откуда взяли ответ (cache или forwarder). Пример вывода:
10.11.12.13, A, urfu.ru, forwarder
4.8.15.16, A, urfu.ru, cache

dns-server
Написать скрипт, умеющий парсить файлы зон и корректно отвечающий на dns-запросы. Требуется понимание записей SOA, NS, A/AAAA, CNAME, MX, остальные можно пропускать. The format of a zone file is defined in RFC 1035 (section 5) and RFC 1034 (section 3.6.1).

Параметры:
$server.py [-p PORT] [-h] [-f zonefile] fqdn
-p, --port - прослушиваемый порт, по умолчанию 53
-h, --help - вывод справки
-f, --file - имя файла с описанием зоны, по умолчанию ./${fqdn}dns

Например:
$server.py urfu.ru.
файл зоны в текущей папке, urfu.ru.dns

При запуске вывести в stdout текст, содержащий информацию о том, успешно ли запустились и количество прочитанных записей. Если что-то не удалось корректно обработать, вывести сообщения об ошибках в “читабельном” формате и завершить работу.

Баллы:
5 баллов. Корректное формирование пакета dns, правильные флаги
2 балла. Разбор файла с зоной и “читабельные” сообщения об ошибках
2 балла. Работа по udp (включая ограничение размера, флаг truncated)
3 балла. Работа по tcp (включая передачу зоны, AXFR)
3 балла. Заполнение секции additional (при необходимости)

smtp-mime
Написать скрипт, который отправляет получателю все картинки из указанного (или рабочего) каталога в качестве вложения.

Параметры:
-h/--help - справка
--ssl - разрешить использование ssl, если сервер поддерживает (по умолчанию не использовать)
-s/--server - адрес (или доменное имя) SMTP-сервера в формате адрес[:порт] (порт по умолчанию 25)
-t/--to - почтовый адрес получателя письма
-f/--from - почтовый адрес отправителя (по умолчанию <>)
--subject - необязательный параметр, задающий тему письма, по умолчанию тема “Happy Pictures”
--auth - запрашивать ли авторизацию (по умолчанию нет), если запрашивать, то сделать это после запуска, без отображения пароля
-v/--verbose - отображение протокола работы (команды и ответы на них), за исключением текста письма
-d/--directory - каталог с изображениями (по умолчанию $pwd)

Итоговая оценка складывается как сумма
[1-3 балла] формирование письма в соответствии с MIME,
[1-3 балла] работа с SMTP-сервером с авторизацией и без,
[1-2 балла] работа по защищенному соединению (+starttls),
[1-2 балла] использование ESMTP (напр., pipelining, size).
Обязательна обработка ответов сервера, в том числе многострочных.

imap
Написать скрипт, выводящий информацию о письмах в почтовом ящике

Параметры:
-h/--help - справка
--ssl - разрешить использование ssl, если сервер поддерживает (по умолчанию не использовать).
-s/--server - адрес (или доменное имя) IMAP-сервера в формате адрес[:порт] (порт по умолчанию 143).
-n N1 [N2] - диапазон писем, по умолчанию все.
-u/--user - имя пользователя, пароль спросить после запуска и не отображать на экране.

Итоговая оценка складывается как сумма
[1-3 балла] вывод заголовков писем как списка или таблицы с полями "кому, от кого, тема, дата, размер письма",
[1-3 балла] декодирование заголовков From/Subject,
[1-2 балла] работа по защищенному соединению,
[1-2 балла] вывод количества аттачей, имен файлов и размеров.
Обязательна обработка ответов сервера, в том числе многострочных.

http-api
Майнинг данных через HTTP
Примерный перечень задач:
1) [VK] скачать фотографии в максимальном разрешении из выбранного альбома
2) [VK | Facebook | Instagram] Отобразить новости за указанный промежуток времени, упорядоченные по убыванию лайков
3) [VK | Facebook] Вывести список друзей по уменьшению популярности. Популярность = функция (количество друзей, количество лайков к фотографиям профиля)
4) [VK | Facebook | Twitter] Вывести список недрузей, упорядоченных по уменьшению числа общих друзей
5) [VK] Загрузка всех фото из указанной папки в указанный альбом
6) [VK | Facebook | Instagram ] Список друзей, упорядоченных по уменьшению числа оставленных лайков и комментариев для записей текущего пользователя
7) [ANY] вывести прогноз погоды для заданного города на заданный промежуток времени
8) [VK + сервис, склоняющий русские слова (по желанию) ] Вывести наиболее часто используемые при переписке слова (только исходящие сообщения)
9) [VK | Facebook ] топ друзей, упорядоченный по общему числу подписок
10) [VK | OK] Определить победителей конкурса, проводимого одновременно в нескольких соцсетях (требование подписки на группы и репоста в вк, класса на одноклассниках)
11) [VK | OK] Скачать все фото, прикрепленные к указанной публикации

Если обработка данных занимает “много” времени, то отображаем прогресс-бар.

Для авторизации используем OAuth, НЕ запрашиваем у пользователя логин/пароль. Примерный алгоритм работы с апи вк

http-proxy
Написать скрипт, работающий как HTTP-прокси

Параметры:
-h/--help - справка
-p/--port - порт
-f/--filters - текстовый файл с фильтрами (при обновлении содержимого файла не требуется перезапуск сервера), по умолчанию filters.txt
-v/--verbose - для каждого входящего запроса выводим в stdout тип запроса и запрашиваемый url

Итоговая оценка
[1-4] Http-proxy, слушающий заданный порт
[5-7] Многопоточность (скорость загрузки страницы не должна сильно падать при использовании прокси)
[8-10] Встроенный блокировщик рекламы (предусмотреть интерфейс добавления регулярных выражений url'ов, для которых нужно всегда отдавать пустой ответ и подходящий код ошибки), например, можно "блокировать" все запросы к ^r\.e1\.ru.*$

(Activity)
Техническая запись для вычисления общего балла

(Quest)