Лабораторная работа. Исследуем сокеты. Часть 1::Журнал СА 04.2016
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9937
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8149
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8254
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5225
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5909
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Лабораторная работа. Исследуем сокеты. Часть 1

Архив номеров / 2016 / Выпуск №04 (161) / Лабораторная работа. Исследуем сокеты. Часть 1

Рубрика: Карьера/Образование /  Лабораторная работа

Владимир Закляков ВЛАДИМИР ЗАКЛЯКОВ, советник налоговой службы 2-го ранга

Лабораторная работа
Исследуем сокеты. Часть 1

В работе исследуется взаимодействие процессов в ОС Linux через интернет-сокеты, созданные на базе протоколов TCP и UDP и работающие поверх протокола IP версии 4

Крик души (введение)

Первая публикация о сокетах в «СА» была в первом номере в 2002 году, где Всеволод Стахов описал программирование сокетов на Си [1]. С того момента и до сегодняшнего номера публикаций по этой теме не было. Почему не было публикаций? Ничего не изменилось? Нет, всё же небольшие изменения по коду есть. Сокеты не востребованы? Востребованы! Все умеют программировать сокеты, и это никому не нужно? Тоже вряд ли. Тема в той публикации была раскрыта полностью, писать больше нечего? Скорее да, чем нет. Но, может, что-то осталось за кадром? Несомненно, да, за кадром остались вопросы практического применения и получения навыков работы с сокетами. Одно дело прочитать статью и «знать» о сокетах, другое – «уметь» выполнить предложенные по теме сокетов задания и совсем третье – «владеть» технологией использования сокетов так, чтобы использовать их на практике, самостоятельно исправлять возникающие ошибки. Цель данной работы – сократить пропасть между программистами и сетевыми администраторами, поскольку первые могут ничего не знать о тонкостях сетевых технологий и настройки операционных систем, обращаясь с сокетами, как с некоторой программной абстракцией, а вторые могут использовать снифферы, тонко настраивать всевозможные программы, пакетные фильтры, сетевые интерфейсы и аппаратные компоненты, но совсем недружить с компилированием программ, структурами, шаблонами и т.п.

Терминология

В английском языке слово «socket» может употребляться как в обычной жизни, так и во многих отраслях науки: биологии, медицине, механике, электронике и компьютерных науках.

В русском языке термин «сокет» имеет более узкое смысловое наполнение, поскольку для большинства случаев у нас есть свои аналоги. Однако аналоги не успели появиться либо были вытеснены в таких быстро развившихся областях науки и техники, как электроника, вычислительная техника (компьютеры), компьютерные сети и интернет, где у сокета остаётся несколько смысловых значений, поэтому его употребление происходит либо в контексте, откуда становится ясно его смысловое наполнение, либо этот термин является составной частью другого многословного термина. Так, в литературе можно встретить без перевода: Berkeley sockets, Internet sockets, Network socket, Unix sockets, Unix domain sockets, raw socket, IC socket, CPU socket, ZIF Socket и др., а также их различные переводные и транслитерированные аналоги.

Таким образом, в отечественной литературе преимущественно сокет – это:

  • либо соединительный разъём или панелька (панель) для установки микросхемы, в том числе разнообразные детальки исключительно для конкретной микросхемы процессора;
  • либо название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных, связанных между собой сетью.

В рамках данной работы будем использовать термин «сокет» для обозначения абстрактного объекта, представляющего конечную точку, используемую программой на языке Си, для соединения двух различных процессов поверх протокола IP версии 4. Или, по сути, сокет – это то, через что две различные программы могут взаимодействовать друг с другом, обмениваться информацией.

Цели работы

  • Показать, что, используя метод декомпозиции (т.е. решения одной большой задачи путем её разделения и решения серии меньших задач), возможно организовать силами начинающих программистов и/или системных администраторов относительно сложные процессы информационного обмена между двумя процессами в ОС Linux.
  • Показать, что при использовании абстракции сокет возможно понизить требования к знаниям программиста для решения задачи информационного обмена между процессами.
  • Закрепить теоретические знания и дать (выполняющим работу) практические навыки использования сокетов.
  • Усовершенствовать навыки работы через интерфейс командной строки (CLI).
  • Немного попрактиковаться в компилировании небольших прикладных программ.

Описание лабораторного стенда

Для выполнения работы используется ОС Linux CentOS 6.7. Данная версия является последней на момент подготовки материалов в печать, для неё имеются 32- и 64-битные сборки. Поскольку понятие «сокета» изначально абстрактное, тотексты программ и задания разработаны таким образом, чтобы была возможность расширить (с минимальными изменениями или совсем без них) как перечень исследуемых вопросов, так и набор используемых для этого программных иаппаратных компонентов.

Для выполнения работы возможны различные сценарии (в зависимости от варианта установки), в каждом из которых указаны минимальные требования к организации лабораторного стенда, определены задания для последовательного самостоятельного выполнения.

Поскольку для выполнения некоторых заданий необходимо наличие прав root, самое простое решение – использовать виртуализацию, например, на основеVirtualBox (поскольку он кроссплатформенный, свободный и имеет интуитивно-понятный графический интерфейс), что позволит иметь полный доступ к возможностям ОС. С другой стороны, существует более сложный, но имеющий право на жизнь вариант, – пользователи остаются с обычными правами, но запуск нужных им команд разрешён через прописывание в /etc/sudoers всех необходимых комбинаций запуска программ через sudo.

В этом случае следует помнить, что:

  • для iptables придётся прописать разрешения для просмотра статистики с различными комбинациями ключей, а также для добавления и удаления правил без действия. Потенциальная опасность: пользователи увидят текущие настройки системы фильтрации и значения счётчиков не у своих правил;
  • для nc придётся прописать различные разрешающие шаблоны для создания серверных сокетов TCP и UDP для диапазона привилегированных портов (0-1023). Потенциальная опасность: пользователи могут «занять» все свободные привилегированные порты и тем самым осложнить возможный запуск других программ на этих портах;
  • проблема запуска веб-сервера не актуальна, если он всегда запущен;
  • для запуска снифферов придётся прописать различные комбинации в /etc/sudoers. Потенциальная опасность – получение пользователями доступа не к своему трафику, а также в случае использования ключа -w проблемы переполнения диска.

Примеры таких записей в файле /etc/sudoers:

user ALL=(ALL) NOPASSWD: /usr/sbin/tcpdump -i lo -n -nn -X

user ALL=(ALL) NOPASSWD: /usr/sbin/tshark -i lo -x -V

user ALL=(ALL) NOPASSWD: /sbin/iptables -L

user ALL=(ALL) NOPASSWD: /sbin/iptables -L -v -x -n

user ALL=(ALL) NOPASSWD: /sbin/iptables -L -v -x -n --line-numbers

user ALL=(ALL) NOPASSWD: /sbin/iptables -L INPUT -v -x -n --line-numbers

user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ?

user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ??

user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ???

user ALL=(ALL) NOPASSWD: /usr/bin/nc -l ????

user ALL=(ALL) NOPASSWD: /usr/bin/nc -u -l ????

Какой путь выбрать – решать вам.

Варианты установок:

Вариант 1. «Минимум». Минимальная установка ОС (в неё уже включены программы netstat, ss, ps, iptables) + дополнительная установка программ: Apache + GCC + lsof + nc + tcpdump + telnet + tshark + wget.

Консольный интерфейс. Исследование взаимодействия двух процессов производится через интерфейс lo. Подключение во внешнюю сеть отсутствует.

Вариант 2. «Графический интерфейс». Установка системы с графической средой в варианте «Desktop» + дополнительные программы как в Варианте 1 + дополнительно сниффер Wireshark (пакет wireshark-gnome).

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

Вариант 3. «Сетевой интерактив». Установка программ производится как в Варианте 2 (или 1), но с поддержкой сети. То есть работа проводится не одним человеком в одной операционной системе, а несколькими, например, вкомпьютерном классе. Появляется возможность создания сокетных соединений между физически разными компьютерами.

При наличии в локальной сети веб-серверов или прямого доступа к сети Интернет возможно расширение экспериментов заданиями по подключению к реальным веб-серверам.

Несомненно то, что можно смоделировать работу любой сети и все задания выполнять с одного рабочего места на двух виртуальных машинах в пределах одного физического компьютера, однако остаётся больше впечатлений, если компьютер с сокет-клиентом и компьютер с сокет-сервером оказываются физически разными на небольшом удалении друг от друга, а сеть между ними – реальной.

Таким образом, оптимальным вариантом для проведения лабораторной работы можно считать использование нескольких физических компьютеров, объединённых в сеть, на каждом из которых в независимости от используемой ОС установлен VirtualBox, внутри которого произведена установки одной виртуальная машины с Linux согласно Варианту 3. Для обеспечения сетевого обмена между всеми виртуальными машинами администратором оговорены правила использования локального IP-адресного пространства, а виртуальные машины подключены к реальным сетевым интерфейсам хостовых машин в режиме «Сетевой мост».

Подготовка лабораторного стенда

Вариант 1. По завершении минимальной установки запустите систему и добавьте учетную запись пользователя user с паролем user (там, где это возможно, старайтесь приучать себя работать с минимальными привилегиями, то есть справами обычного пользователя):

# adduser user

# passwd user

Замечание. Подробнее, как определить источник получения пакетов и настроить сеть (присвоить IP-адрес сетевому интерфейсу, прописать маршруты и т.п.), см. [1].

Установите пакеты согласно выбранному варианту, добавьте компилятор g++ (пакет gcc-c++) и файловый менеджер mc. В работе они не используются, но пригодятся в дальнейшем.

# yum install mc httpd gcc gcc-c++ lsof lynx nc tcpdump telnet wireshark wget

Вариант 2. Доустановите пакеты как для Варианта 1 + wireshark-gnome.

Вариант 3. Создайте в VirtualBox новую виртуальную машину и выполните действия для Варианта 2. Выключите машину. Клонируйте виртуальную машину. Для этого используйте копирование внутри менеджера виртуальных машин, поскольку в этом случае будет произведена замена идентификаторов дисков и MAC-адресов сетевых интерфейсов, что позволит избежать проблем взаимодействия двух виртуальных машин между собой в будущем.

Перенесите клонированную виртуальную машину на другой компьютер. Убедитесь, что в настройках сетевых интерфейсов у виртуальных машин тип подключения указан как «Сетевой мост», а MAC-адреса у всех используемых копий виртуальных машин разные.

Определитесь с используемыми в сети сетевыми адресами (либо возьмите сеть 192.168.0.0/24, либо уточните у администратора). Далее полагаем, что у первой виртуальной машины адрес 192.168.0.2, у соседней – 192.168.0.3 и т.д.

Запустите нужное число виртуальных машин, настройте их сетевые интерфейсы и маршрутизацию (см. [1]). Отключите средства фильтрации установлением разрешительной политики и удалением всех имеющихся правил. (После установки ОС в ней по умолчанию запрещены входящие соединения, что делает невозможным подключение к прослушивающим сокетам (которые будут создаваться в процессе работы) извне системы.)

# iptables -P INPUT ACCEPT

# iptables -P OUTPUT ACCEPT

# iptables -F

Запустите веб-сервер.

# service httpd start

Подготовка лабораторного стенда завершена.

Краткие теоретические сведения

Предполагается, что, приступая к выполнению лабораторной работы, лица, планирующие её выполнить, уже имеют достаточный багаж теоретических знаний о сокетах. Если вы таковыми не являетесь либо хотите освежить в памяти теорию, то см. [1-3]. Общая схема, по которой производится сокетное соединение для протоколов TCP (тип сокета SOCK_STREAM) и UDP (тип сокета SOCK_DGRAM), представлена на рис. 1 и 2.

Рисунок 1. Функции сокетов для элементарного клиент-серверного TCP-соединения

Рисунок 1. Функции сокетов для элементарного клиент-серверного TCP-соединения

Рисунок 2. Функции сокетов для элементарного клиент-серверного UDP-соединения

Рисунок 2. Функции сокетов для элементарного клиент-серверного UDP-соединения

Описание хода проведения работы и отдельных компонентов

Для исследования межпроцессного информационного обмена (обмена данными между двумя процессами) в работе предлагается произвести связь процесса клиента и процесса сервера, используя сокеты в режиме клиента и сервера соответственно. Для этого в распоряжении обучаемых имеется (см. таблицу 1) шесть вариантов программ, использующих сокет в режиме клиента, три варианта программ, открывающих сокет на прослушивание на стороне сервера, и семь различных инструментов для исследования тех и иных аспектов, связанных с работой указанных программ и передачей данных. Хотя общее число комбинаций записей в таблице 6×3×8 = 144 и кажется большим, число принципиально исследуемых моментов на порядок, а то и два меньше. То, что в ряде комбинаций наблюдаемые результаты будут не так сильно отличаться друг от друга, должно быть очевидным после ознакомления с теорией, а на проверку каждого такого случая потребуется не более 5-10 секунд.

При наличии технической возможности и достаточного опыта у обучаемых число используемых программ и инструментов, как и число вариантов использования их друг по отношению к другу, в процессе исследования можно самостоятельно увеличить, а интересные наблюдения отразить в отчёте. Ниже даётся краткое описание всех компонентов из таблицы 1, типичные способы их использования, примеры запуска и ожидаемые результаты.

Таблица 1. Схема исследований

Клиент Инструмент исследования Сервер
telnet
nc*
программа на Си*
браузер Firefox
браузер lynx
wget
tcpdump
tshark
Wireshark
netstat
ss
lsof
iptables
ps
nc*
программа на Си*
веб-сервер Apache

telnet

Изначально протокол telnet (уровень приложения (прикладной), RFC 854) использовался для предоставления двухстороннего доступа терминальным устройствам к серверу. Таким образом, пользователь мог через терминал взаимодействовать с различными процессами на сервере, в том числе и с командным интерпретатором. На транспортном уровне он использует протокол TCP. В протоколе telnet все данные передаются по сети в открытом виде и могут быть легко перехвачены. По этой причине сегодня для удалённого управления протокол telnet практически не используется (его заменил SSH), но для данной работы он прекрасно подходит. Программная реализация консольного клиента называется также telnet. Этой программой нам и предстоит воспользоваться в процессе работы.

Например, подключение к серверу 127.0.0.1 на порт 1234 протокола TCP:

$ telnet 127.0.0.1 1234

то же самое, но на порт 80 протокола TCP:

$ telnet 127.0.0.1 80

Замечание 1. Аналогичная программа в ОС Windows называется «telnet.exe». Если в Windows XP она была установлена по умолчанию, то начиная с Windows Vista (в том числе и на серверных линейках) её убрали. Установить её можно следующим образом: «Панель управления → Программы и компоненты → Включение или отключение компонентов Windows → Клиент Telnet» – поставить галочку. Либо можно произвести установку через консоль командой:

pkgmgr /iu:"TelnetClient"

Замечание 2. Вместо клиента telnet сегодня довольно часто используется бесплатная графическая утилита PuTTY, имеющая не только ряд дополнительных полезных свойств (например, поддержка протокола SSH, работа с различными кодировками), но и реализацию как под Windows, так и под UNIX и Linux [4].

Замечание 3. Программа telnet в ОС Linux не использует пользовательский сигнал SIGINT, возникающий при нажатии клавиш <CTRL> + <C>, для выхода из программы. Чтобы выйти из сеанса работы telnet-клиента в случае зависания сервера, нажмите <ctrl> + <]>, после чего у вас появится приглашение «telnet>», где наберите quit для выхода из программы.

nc

nc – программа для создания соединений с использованием сокетов протоколов TCP и UDP и последующей передачей данных по ним [5]. Она позволяет как осуществлять клиентские подключения с использованием указанных протоколов, так и создавать на серверной стороне сокеты, находящиеся в режиме ожидания входящих соединений от клиентов.

Примеры использования nc в режиме «сервера»:

Создание прослушивающего сокета протокола TCP на порту 1234 для всех имеющихся у хоста IP-адресов.

$ nc -l 1234

Заметим, что для обычного пользователя доступны для прослушивания (для создания входящих соединений) лишь непривилегированные номера портов, то есть с номерами из диапазона 1024-65535. Для портов с номерами 1023 и меньше потребуются права суперпользователя.

# nc -l 1023

По умолчанию программа nc использует протокол TCP. Для использования протокола UDP необходимо дополнительно указывать ключ -u. Например, открытие на прослушивание порта 1234 протокола UDP:

$ nc -l 1234 -u

Выдавать содержимое файла 1.txt всем присоединившимся к сокету на 1080-м порту протокола TCP:

$ nc -l 1080<1.txt

Совместно с циклом на bash возможно создание временной заглушки для замены веб-сервера на 80-м порту:

# while true; do nc -l 80<index.html; done

Работает это следующим образом. При обращении к сокету HTTP-запросы клиента игнорируются, и сразу начинается передача данных из файла index.html клиенту. Большинство браузеров при получении такого потока данных игнорируют отсутствие заголовков от сервера и выводят полученное содержимое пользователю. Имя файла (index.html в нашем случае) может быть любым, поскольку клиент его не видит.

Примеры использования nc в режиме «клиента»:

Подключение к хосту с именем samag.ru на порт 80 по протоколу TCP:

$ nc samag.ru 80

Подключение к хосту с IP-адресом 192.168.3.1 на порт 53 по протоколу UDP:

$ nc -u 192.168.3.1 53

В man к nc можно найти много других полезных примеров по использованию.

Обратите внимание, что программа nc в режиме клиента в случае отсутствия возможности установления соединения по-разному себя ведёт для протоколов TCP и UDP.

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

Замечание. Обратите внимание, что существуют и другие, аналогичные nc (netcat), программы: ncat, socat (Multipurpose relay (SOcket CAT) . Первая была специально написана для проекта Nmap. Она имеет несколько дополнительных возможностей, которые не потребуются в данной работе, но их, возможно, стоит знать, например поддержка прокси, работа с SSL:

$ ncat -l -p 6500 --ssl --ssl-cert /etc/ssl/host.crt --ssl-key /etc/ssl/host.key > out.tgz

$ tar -zc ~ | ncat --ssl machineb 6500

Вторая программа умеет делать множественные перенаправления сокетов.

Браузер Firefox

Популярный кроссплатформенный браузер с GUI-интерфейсом. Удобен тем, что через обращение к странице about:config позволяет редактировать многие параметры своей работы. Также имеется возможность подключения большого числа расширений (файлы с расширением .xpi), добавляющих различную полезную функциональность. При необходимости возможна его замена на любой другой браузер. Для обращения к какому-либо серверу в адресной строке браузера следует указать его адрес и нажать «Enter». По умолчанию используется протокол TCP, и обращения направляются на порт 80. В случае необходимости использования отличного порта, например 1180, его следует указать через знак «:» в адресной строке. Например, http://192.168.1.1:1180.

Продолжение – в следующем номере.

  1. Закляков В. Looking Glass своими руками, или Сервер диагностики сетевой доступности. // «Cистемный администратор», №1-2, 2016 г. – С. 10-15 (http://samag.ru/archive/article/3110).
  2. Стахов В. Программирование сокетов. // «Cистемный администратор», №1, 2002 г. – С. 78-82 (http://samag.ru/archive/article/33).
  3. UNIX: разработка сетевых приложений /У. Стивенс. – СПб.: «Питер», 2003. – 1088 с. ISBN 5-318-00535-7.
  4. PuTTY: a free SSH and Telnet client – http://www.chiark.greenend.org.uk/~sgtatham/putty.
  5. man для программы nc (русский язык) – http://bsdadmin.ru/index.php/mans-freebsd/295-nc-netcat.
  6. Сайт Mozilla – http://www.mozilla.org.

Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru