- Настройка сетевого соединения
- ТАБЛИЦЫ
- Введение.
- Как открыть TCP-/UDP-сокет средствами командной оболочки bash
- Как открыть TCP-/UDP-сокет средствами командной оболочки bash
- Открытие и закрытие TCP-/UDP-сокета средствами командной оболочки bash
- Прием и передача данных через TCP-/UDP-сокет средствами командной оболочки bash
- Примеры использования TCP-/UDP-сокетов при работе с командной оболочкой bash
- Заключительные слова
- Сокеты в ОС Linux
- Что такое сокет?
- netcat
- socat
Настройка сетевого соединения
ТАБЛИЦЫ
Введение.
Linux-системы конфигурированы на подключение к сетям, в которых используются протоколы TCP/IP. Именно эти протоколы применяются в Internet и многих локальных сетях. Эти протоколы были разработаны в семидесятых годах в рамках специального проекта Управления перспективных исследований и разработок Министерства обороны США с целью развития системы связи между учебными заведениями и научно-исследовательскими институтами. Разрабатывались эти протоколы для Unix-систем, при этом основные исследования проводились в Калифорнийском университете (г. Беркли). ОС Linux во многом выигрывает благодаря этой изначальной ориентации протоколов на Unix.
Комплект TCP/IP состоит из нескольких различных протоколов, каждый из которых выполняет в сети определенную задачу. Базовых протоколов два:
протокол управления передачей (TCP), который обеспечивает отправку и прием сообщений, и межсетевой протокол (IP), который отвечает за маршрутизацию. Остальные протоколы выполняют различные сетевые функции. Служба доменных имен (DNS) обеспечивает преобразование адресов. Протокол пересылки файлов (ftp) управляет передачей файлов, а набор протоколов NFS обеспечивает доступ к удаленным файловым системам. Прото-колы комплекта TCP/IP представлены в табл. 20.1
Конфигурирование в Linux-системе сетевого соединения, устанавливаемого по протоколу TCP/IP, и управление им — не слишком сложная задача. К услугам пользователя имеется набор конфигурационных файлов, с помощью которых система настраивает и поддерживает сетевые соединения. Полный перечень этих файлов приведен в табл. 20.2. Многими из них можно управлять с помощью административных программ из интерфейса привилегированного пользователя, в частности с помощью утилиты netcfg . Допускается также использование более специализированных программ, например таких, как netstat, ifconfig и route . Некоторые конфигурационные файлы легко поддаются редактированию с помощью текстового редактора. Широко используемые программы для настройки сетевого соединения представлены в табл. 20.3.
Допустим, в процессе инсталляции вы ввели информацию о конфигурации сети. Это означает, что система полностью готова к работе. Если Linux-система уже подключена к сети, например к Ethernet, читать данный материал вам не нужно (если только вы не хотите понять, как ОС Lit настраивает сетевые соединения). Однако если вы входите в сеть через модем (например, связываетесь таким образом с провайдером Internet), вам 6yдет полезно ознакомиться с материалами, относящимися к протоколам SLII РРР . Сдесь рассказывается о том, как заставить Linux-систему связываться с провайдером Internet и правильно устанавливать сетев соединение. Если в процессе выхода в сеть у вас возникли проблемы, полезной будет вся информация, представленная в этом материале.
Источник
Как открыть TCP-/UDP-сокет средствами командной оболочки bash
Оригинал: How to open a TCP/UDP socket in a bash shell
Автор: Dan Nanni
Дата публикации: 24 мая 2016 г.
Перевод: А.Панин
Дата перевода: 23 июля 2016 г.
Как открыть TCP-/UDP-сокет средствами командной оболочки bash
Представьте, что вам по какой-либо причине необходимо открыть TCP-/UDP-сокет на работающем под управлением Linux сервере. Например, вам нужно проверить доступность определенного порта на удаленном узле с известным адресом. Также у вас может возникнуть потребность в загрузке определенной веб-страницы с удаленного веб-сервера или задействования restful API для тестирования сетевого сервиса. Кроме того, вы можете просто захотеть соединиться с сервером IRC или каким-либо другим удаленным сервером. Но что делать в том случае, если на вашем сервере имеется лишь очень ограниченное в плане функций рабочее окружение? Так, в нем могут быть просто не установлены такие стандартные инструменты для работы с сетью, как netcat , curl и wget , при этом в вашем распоряжении может иметься лишь командная оболочка bash.
Фактически, одной из встроенных функций командной оболочки bash является функция открытия TCP-/UDP-сокетов с помощью файлов устройств /dev/tcp и /dev/udp соответственно. В данном руководстве мы постараемся разобраться в том, как открывать TCP-/UDP-сокеты, а также осуществлять посредством них прием и передачу данных в процессе работы с командной оболочкой bash.
Открытие и закрытие TCP-/UDP-сокета средствами командной оболочки bash
По сути, вы можете открыть TCP-/UDP-сокет средствами командной оболочки bash, воспользовавшись следующей синтаксической конструкцией:
Вместо строки «дескриптор-файла» следует использовать уникальные неотрицательные целочисленные идентификаторы (дескрипторы), которые будут ассоциированы с каждым из создаваемых сокетов. Файловые дескрипторы 0, 1 и 2 зарезервированы за стандартными потоками ввода ( stdin ), вывода ( stdout ) и ошибок ( stderr ) соответственно. Исходя из этого, вы должны использовать значения, начиная с 3 (которые не используются) в качестве файловых дескрипторов.
Сочетание символов «<>» указывает на то, что сокет должен быть открыт для чтения и записи. В зависимости от ваших потребностей, вы можете открыть сокет только для чтения ( » ) или только для записи ( «>» ).
В поле «протокол» может располагаться строка «tcp», либо «udp». Назначение полей «адрес-узла» и «номер-порта» не требует особых комментариев.
Например, для открытия двунаправленного TCP-сокета, соединенного с основным портом HTTP-сервера ресурса xmodulo.com, с файловым дескриптором 3 достаточно выполнить следующую команду:
После открытия сокет для чтения/записи может быть закрыт с помощью следующей синтаксической конструкции. Первая команда предназначена для закрытия входящего соединения, вторая — исходящего.
Прием и передача данных через TCP-/UDP-сокет средствами командной оболочки bash
После открытия сокета вы можете использовать его для приема или передачи сообщений.
Для передачи сообщения, хранящегося в переменной $MESSAGE , через сокет следует использовать одну из следующих команд:
Для чтения сообщения из сокета и сохранения его в переменной $MESSAGE — одну из следующих команд (в переменных $NUM_BYTES и $COUNT должны храниться числовые значения, равные количеству байт сообщения и количеству сообщений соответственно — прим.пер.):
Примеры использования TCP-/UDP-сокетов при работе с командной оболочкой bash
Ниже я привел несколько примеров сценариев, в рамках которых создаются и используются TCP-сокеты.
1. Получение веб-страницы с удаленного сервера и вывод ее исходного кода
2. Вывод информации о версии установленного на удаленном узле SSH-сервера
Фактически, приведенный выше сценарий может быть сокращен до следующего однострочного сценария:
3. Вывод информации о текущем времени, полученной с веб-сайта nist.gov
4. Проверка работоспособности соединения с сетью Интернет
5. Сканирование TCP-портов удаленного узла
Заключительные слова
Для получения возможности открытия сокетов средствами командной оболочки bash необходима активация механизма поддержки виртуальных файлов устройств сокетов на этапе сборки бинарного файла этой командной оболочки из исходных кодов (т.е., его сборки с активацией возможности «—enable-net-redirections» ). В устаревших версиях дистрибутивов данная возможность bash может быть деактивирована, причем в этом случае вы будете получать следующее сообщение об ошибке после каждой попытки открытия сокета:
Помимо командной оболочки bash, виртуальные устройства сокетов поддерживаются такими командными оболочками, как ksh и zsh.
Источник
Сокеты в ОС Linux
В данной статье будет рассмотрено понятие сокета в операционной системе Linux: основные структуры данных, как они работают и можно ли управлять состоянием сокета с помощью приложения. В качестве практики будут рассмотрены инструменты netcat и socat.
Что такое сокет?
Сокет — это абстракция сетевого взаимодействия в операционной системе Linux. Каждому сокету соответствует пара IP-адрес + номер порта. Это стандартное определение, к которому привыкли все, спасибо вики. Хотя нет, вот здесь лучше описано. Поскольку сокет является только лишь абстракцией, то связка IP-адрес + номер порта — это уже имплементация в ОС. Верное название этой имплементации — «Интернет сокет». Абстракция используется для того, чтобы операционная система могла работать с любым типом канала передачи данных. Именно поэтому в ОС Linux Интернет сокет — это дескриптор, с которым система работает как с файлом. Типов сокетов, конечно же, намного больше. В ядре ОС Linux сокеты представлены тремя основными структурами:
struct socket — представление сокета BSD, того вида сокета, который стал основой для современных «Интернет сокетов»;
struct sock — собственная оболочка, которая в Linux называется «INET socket»;
struct sk_buff — «хранилище» данных, которые передает или получает сокет;
Как видно по исходным кодам, все структуры достаточно объемны. Работа с ними возможна при использовании языка программирования или специальных оберток и написания приложения. Для эффективного управления этими структурами нужно знать, какие типы операций над сокетами существуют и когда их применять. Для сокетов существует набор стандартных действий:
socket — создание сокета;
bind — действие используется на стороне сервера. В стандартных терминах — это открытие порта на прослушивание, используя указанный интерфейс;
listen — используется для перевода сокета в прослушивающее состояние. Применяется к серверному сокету;
connect — используется для инициализации соединения;
accept — используется сервером, создает новое соединение для клиента;
send/recv — используется для работы с отправкой/приемом данных;
close — разрыв соединения, уничтожение сокета.
Если о структурах, которые описаны выше, заботится ядро операционной системы, то в случае команд по управлению соединением ответственность берет на себя приложение, которое хочет пересылать данные по сети. Попробуем использовать знания о сокетах для работы с приложениями netcat и socat.
netcat
Оригинальная утилита появилась 25 лет назад, больше не поддерживается. На cегодняшний день существуют порты, которые поддерживаются различными дистрибутивами: Debian, Ubuntu, FreeBSD, MacOS. В операционной системе утилиту можно вызвать с помощью команды nc, nc.traditional или ncat в зависимости от ОС. Утилита позволяет «из коробки» работать с сокетами, которые используют в качестве транспорта TCP и UDP протоколы. Примеры сценариев использования, которые, по мнению автора, наиболее интересны:
перенаправление входящих/исходящих запросов;
трансляция данных на экран в шестнадцатеричном формате.
Опробуем операции в действии. Задача будет состоять в том, что необходимо отправить TCP данные через netcat в UDP соединение. Для лабораторной будет использоваться следующая топология сети:
Введем команду на открытие порта на машине Destination: nc -ulvvp 7878
Настроим машину Repeater. Так как передача из одного интерфейса этой машины будет происходить по протоколу TCP, а на другой интерфейс будет осуществляться передача по протоколу UDP, то для таких действий необходимо сделать соединитель, который сможет накапливать данные и пересылать их между открытыми портами. На такую роль отлично подходит FIFO файл. Поэтому команда для запуска будет выглядеть так: sudo mkfifo /tmp/repeater #создать FIFO файл
sudo nc -l -p 4545 > /tmp/repeater | nc -u 10.0.3.5 7878 IP адрес 10.0.3.5 — адрес машины Destination. Символы «|» и «> nc 10.0.2.4 4545
В итоге получаем возможность читать данные от машины Source:
В машине Destination:
Пример с трансляцией данных в шестнадцатеричном формате можно провести так же, но заменить команду на Destination или добавить еще один пайп на Repeater:
nc -l -p 4545 -o file
В результате будет создан файл, в котором можно будет обнаружить передаваемые данные в шестнадцатеричном формате:
Как видно из тестового сценария использования, netcat не дает контролировать практически ничего, кроме направления данных. Нет ни разграничения доступа к ресурсам, которые пересылаются, ни возможности без дополнительных ухищрений работать с двумя сокетами, ни возможности контролировать действия сокета. Протестируем socat.
socat
Инструмент, который до сих пор поддерживается и имеет весьма обширный функционал по склейке каналов для взаимодействия. Разработчиками инструмент именуется как netcat++. Ниже приведем небольшой список того что можно перенаправить через socat:
STDIO -> TCP Socket;
FILE -> TCP Socket;
TCP Socket -> Custom Application;
UDP Socket -> Custom Application;
Для повседневного использования достаточно опций, но если понадобится когда-то работать напрямую с серийным портом или виртуальным терминалом, то socat тоже умеет это делать. Полный перечень опций можно вызвать с помощью команды:
Помимо редиректов socat также можно использовать как универсальный сервер для расшаривания ресурсов, через него можно как через chroot ограничивать привилегии и доступ к директориям системы.
Чтобы комфортно пользоваться этим инструментом, нужно запомнить шаблон командной строки, который ожидает socat:
socat additionalOptions addr1 addr2
additionalOptions — опции, которые могут добавлять возможности логирования информации, управления направлением передачи данных;
addr1 — источник данных или приемник (влияет использование флага U или u), это может быть сокет, файл, пайп или виртуальный терминал;
addr2 — источник данных или приемник (влияет использование флага U или u), это может быть сокет, файл, пайп или виртуальный терминал;
Попробуем провести трансляцию данных из сокета в сокет. Будем использовать для этого 1 машину. Перед началом эксперимента стоит отметить, что особенностью socat является то, что для его корректной работы нужно обязательно писать 2 адреса. Причем адрес не обязательно должен быть адресом, это может быть и приложение, и стандартный вывод на экран.
Например, чтобы использовать socat как netcat в качестве TCP сервера, можно запустить вот такую команду:
socat TCP-LISTEN:4545, STDOUT
Для коннекта можно использовать netcat:
nc localhost 4545
При таком использовании, socat дает возможность пересылать сообщения в обе стороны, но если добавить флаг «-u», то общение будет только от клиента к серверу. Все серверные сообшения пересылаться не будут:
Настроим более тонко наш сервер, добавив новые опции через запятую после используемого действия:
socat TCP-LISTEN:4545,reuseaddr,keepalive,fork STDOUT
Дополнительные параметры распространяются на те действия, которые socat может выполнять по отношению к адресу. Полный список опций можно найти здесь в разделе «SOCKET option group».
Таким образом socat дает практически полный контроль над состоянием сокетов и расшариваемых ресурсов.
Статья написана в преддверии старта курса Network engineer. Basic. Всех, кто желает подробнее узнать о курсе и карьерных перспективах, приглашаем записаться на день открытых дверей, который пройдет уже 4 февраля.
Источник