Как послать udp пакет linux

Обновлено: 06.07.2024

Передавать сырые данные TCP и UDP умеют программы Ncat, Netcat, nc.

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

Как передавать и получать сырые данные по протоколу UDP

Чтобы не просто выполнить подключение, когда данные вводятся вручную (вводить шестнадцатеричные данные вручную затруднительно для нас), а чтобы подключиться и сразу передать данные, можно использовать команду вида:

Опция -u означает использовать UDP протокол (по умолчанию используется TCP).

Пример команды, которая отправляет данные из файла hello-camera.bin на удалённый IP 255.255.255.255 на UDP порт 34569:

UDP протокол не дожидается ответа, он разрывает соединение. Для отправки ответа удалённых хост запускает новое UDP соединение, но дело в том, что для его подключения мы должны прослушивать порт. Ответ придёт на UDP порт 34569. Прослушивать порт можно также командой ncat. Для этого используется команда вида:

В этой команде опция -u означает использовать UDP протокол (по умолчанию используется TCP). Опция -l означает прослушивать входящие соединения. IP-АДРЕС - это IP сетевого интерфейса на локальной машине, где запущена утилита ncat. ПОРТ - это порт для прослушивания.

IP адрес компьютера, где будет запущена ncat, 192.168.0.88, нужно прослушивать на 34569 порту, тогда команда следующая:

Кажется, что ничего не происходит, но программа и не завершает работу - она просто ожидает входящее соединение.

Не закрывая это окно терминала, откроем другую консоль и вновь повторяем первую команду:

После этого в первой консоли будет показан полученный ответ:


Чтобы сохранить присланный ответ (вместо того, чтобы выводить его на экран), можно использовать следующую команду для прослушивания входящих подключений:

В результате присланный ответ будет сохранён в файле response.bin.

Как передавать и получать сырые данные по протоколу TCP

Как можно увидеть, мы получили ответ.


Для своих целей я записал всех бинарные строки, которые отправляла программа CMS на камеру в отдельные файлы с именами hex1, hex2 и так далее до hex12. Для воспроизведения полного диалога с камерой можно использовать команду вида:

UDP означает протокол пользовательских дейтаграмм, который представляет собой протокол передачи без установления соединения. По сравнению с TCP, его преимущества и недостатки:

Преимущества: высокая скорость передачи, низкое потребление ресурсов, простое программирование, широко используется при передаче аудио- и видеоданных.

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

Процесс общения

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


Как видно из рисунка, использование UDP для связи позволяет осуществлять прямую связь без установления соединения между обеими сторонами.

Два, функция API

Используйте UDP для сетевого программирования, Linux также предоставляет некоторые функции.

2.1 sendto отправка

Это функция отправки данных, используемая в режиме UDP.Отличие от режима TCP состоит в том, что для каждой отправки требуется такая информация, как адрес назначения.

  • sockfd: дескриптор файла сокета.
  • buf: отправленный контент.
  • len: длина отправленных данных.
  • flags: flags, вы можете использовать этот параметр для установки различных методов передачи данных, обычно используйте 0.
  • dest_addr: информация об адресе назначения, инкапсулированная в структуре socketaddr.
  • addrlen: размер информации о целевом адресе.
  • Возвращаемое значение: вернуть количество отправленных байтов в случае успеха, -1 в случае неудачи и установить для соответствующей ошибки значение errno.

2.2 recvfrom получения

  • sockfd: дескриптор файла сокета.
  • buf: буфер данных, используемый для хранения полученных данных.
  • len: длина получаемых данных.
  • flags: flags, вы можете использовать этот параметр для установки различных методов передачи данных, обычно используйте 0.
  • src_addr: информация об адресе источника, инкапсулированная в структуре socketaddr.
  • addrlen: размер информации об адресе источника,указатель。
  • Возвращаемое значение: вернуть количество байтов, полученных в случае успеха, -1 в случае неудачи и установить для соответствующей ошибки значение errno.

См. Другие функции в предыдущем блоге:

Три, пример связи UDP

server.c (сначала получить):

результат операции:


client:


server:

анализ:

Клиент сначала отправляет данные на сервер. После того, как область обслуживания получает данные, она знает адресную информацию клиента, а затем данные могут быть отправлены клиенту. Как правило, клиент отправляет данные первым, а сервер первым их получает. Введите конец, и обе стороны будут судить о конце.

Интеллектуальная рекомендация


Краткое описание общих функций MPI

содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.

Примечание 9: EL выражение


JVM память

концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.

Проблема сетевого запроса на Android 9.0

вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.


Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.

предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.

s = socket(PF_INET, SOCK_DGRAM, 0); connect(s, (struct sockaddr *) &udp_addr, sizeof(udp_addr));

вот вроде и всё.


а разве это не TCP так работает? У меня бывает, что UDP покеты накапливаются и потом доходить начинают, если прога зависает. Я вообще думал, что UDP как раз не устанавливает соединения.

сокет - это не соединение, это вобчем 'transport end point'.. просто системный интерфейс сетевых протоколов. Почитайте info libc/sockets - толково и сжато описанно всё.

'сокетное соединение' - смешной получился термин :-)

да по-разному можно. socket() нужно всегда делать, а connect() уже зависит от задачи. просто если connect'ом подрубаешься к серверу можно потом обычные read/write использовать вместо recvfrom/sendto. вобщем надо Стивенса почитать у него это всё подробно рассмотрено.

UDP - дейтаграмный протокол, не гаранитрующий доставку пакета. Он работает без установки соединения. Просто кидает пакеты с заданным маком и IP в сеть, дальнейшая их судьба его не волнует


> s = socket(PF_INET, SOCK_DGRAM, 0); connect(s, (struct sockaddr *) &udp_addr, sizeof(udp_addr));

В биореактор. Немедленно.

При работе с UDP-шным сокетом сначала создается сокет (вызов сокет написан правильно), затем делается bind на локальный адрес, а connect к UDP-шным сокетам неприменим, и вернет код ошибки! И только после этого можно отправлять данные, использую sendto и принимать через recvfrom.

Пример, чтобы было понятно:

struct sockaddr_in local; struct sockaddr_in remote;

s = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );

local.sin_family = AF_INET; inet_aton( "192.168.0.1", &local.sin_addr ); local.sin_port = htons( 1025 );

bind( s, (struct sockaddr*) & local, sizeof(local) );

remote.sin_family = AF_INET; inet_aton( "192.168.0.100", &remote.sin_addr ); remote.sin_port = htons( 139 );

sendto ( s, "В биореактор!", strlen("В биореактор!"), 0, &remote, sizeof(remote) );

> а connect к UDP-шным сокетам неприменим, и вернет код ошибки!

С чего это?! Никогда не слышали про connected UDP.


> > а connect к UDP-шным сокетам неприменим, и вернет код ошибки!

> С чего это?! Никогда не слышали про connected UDP?

В man'ах, конечно, сказано что "если . является единственным адресом получателя. " и далее по тексту, но в этом случае куда резонней использовать TCP - все равно программе придется организовывать обмен "квитанциями" о получении пакетов, так что не так уж и страшен TCP-шнй оверхед, как его малюют.

UDP же обычно выбирают если нужно организовать "широковещательное общение" типа каждый-с-каждым, типа виндовой сети, и поэтому. Поэтому, "Мне кажется, connect здесь не уместен" - почти как в незабвенных 12-ти стульях.

и сразу в биорактор!

а разве connect работать не будет? всё зависит от того, что нужно.


> и сразу в биорактор!

Дык?! Выбирать UDP для работы только с одним хостом, нагружаю свою программу реализацией сеанса - в биореактор :-) Использовать connect на UDP при работе со множеством хостов - все равно в биореактор! :-)


Да пожалуйста. Вот только расскажи всем - как ты решал проблему с гарантированием доставки данных? :-)

P.S.: time dd if=/dev/zero bs=4096 count=25600 | nc testhost 1025 [прочесть 100 мегабайт из /dev/zero и сунуть их по tcp на хост testhost, порт 1025] отрабатывает за 9 секунд. А 100 мегабайт за 9 секунд - это в среднем 11 мегабайт в секунду :-)

> Да пожалуйста. Вот только расскажи всем - как ты решал проблему с гарантированием доставки данных? :-)

image


В данной статье я рассмотрю популярную сетевую утилиту netcat и полезные трюки при работе с ней.

Netcat — утилита Unix, позволяющая устанавливать соединения TCP и UDP, принимать оттуда данные и передавать их. Несмотря на свою полезность и простоту, многие не знают способы ее применения и незаслуженно обходят ее стороной.

С помощью данной утилиты можно производить некоторые этапы при проведении тестирования на проникновение. Это может быть полезно, когда на атакованной машине отсутствуют (или привлекут внимание) установленные пакеты, есть ограничения (например IoT/Embedded устройства) и т.д.

Что можно сделать с помощью netcat:

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

Практические примеры

Во многих случаях при необходимости проверки того или иного хоста используют телнет, либо собственные сервисные службы для выявления хоста или баннера. Как нам может помочь netcat:

Проверка наличия открытого TCP-порта 12345

nc: connect to 192.168.1.100 12345 (tcp) failed: Connection refused
Connection to 192.168.1.100 22 port [tcp/ssh] succeeded!
SSH-2.0-OpenSSH

Сканирование TCP-портов с помощью netcat:

При таком сканировании не будет соединение с портом, а только вывод успешного соединения:

nc: connectx to 192.168.1.100 port 20 (tcp) failed: Connection refused
nc: connectx to 192.168.1.100 port 21 (tcp) failed: Connection refused
found 0 associations
found 1 connections:
1: flags=82<CONNECTED,PREFERRED>
outif en0
src 192.168.1.100 port 50168
dst 192.168.1.100 port 22
rank info not available
TCP aux info available
Connection to 192.168.1.100 port 22 [tcp/*] succeeded!
nc: connectx to 192.168.1.100 port 23 (tcp) failed: Connection refused
nc: connectx to 192.168.1.100 port 24 (tcp) failed: Connection refused

Сканирование UDP-портов.

Для сканирования UDP портов с помощью nmap необходимы root привилегии. Если их нет — в этом случае нам тоже может помочь утилита netcat:

Отправка UDP-пакета

Это может быть полезно при взаимодействии с сетевыми устройствами.

Прием данных на UDP-порту и вывод принятых данных

Передача файлов. С помощью netcat можно как получать файлы, так и передавать на удаленный хост:

Netcact в роли простейшего веб-сервера.

Netcat может выполнять роль простейшего веб-сервера для отображения html странички.

Чат между узлами

На первом узле (192.168.1.100):

После выполнения команд все символы, введенные в окно терминала на любом из узлов появятся в окне терминала другого узла.

Реверс-шелл

С помощью netcat можно организовать удобный реверс-шелл:

Теперь можно соединиться с удаленного узла:

Не стоит опускать руки, если нет тех или иных инструментов, зачастую довольно громоздких, иногда задачу можно решить подручными средствами.

Вот некоторые ключевые моменты, которые можно почерпнуть из этой статьи.

  1. Отправка текста с помощью программы Python, которая использует протокол UDP.
  2. Получение текста с помощью программы Python, которая использует протокол UDP.
  3. Проверьте пакет UDP в Wireshark.
  4. Узнайте о коде Python для отправки и получения пакетов UDP.

Схема общей настройки:


Системы A и B должны иметь возможность пинговать друг друга.

Допущения или ограничения:

  1. Обе системы должны иметь Linux с Ubuntu. Код может работать или не работать в другой операционной системе, такой как Windows10, MAC и т. Д.
  2. Обе системы должны иметь версию Python 3. Этот код может работать или не работать на версии Python 2.7.

Примечание: вы можете проверить ссылку для опробования Отправка и получение UDP-пакетов через Linux CLI

прежде чем переходить к файлам Python для выполнения той же задачи.

Файлы Python:

Есть два файла python server.py и client.py. файл сервера и файл клиента должны присутствовать в системе сервера и системе клиента соответственно.

Server.py

Client.py

Отправка / получение пакета UDP:

Давайте возьмем пример, как мы отправим пакет UDP из системы A в систему B. Итак, в концепции сервер-клиент мы должны запустить сервер на стороне системы B и клиент на стороне системы A.


Также у нас есть действующие IP-адреса.

Система A IP: 192.168.1.6
IP-адрес системы B: 192.168.1.102

Теперь в отличие от Отправка и получение UDP-пакетов через Linux CLI мы будем бежать server.py в системе B [192.168.1.102], а затем мы запустим client.py в Системе A [192.168.1.6].

Как запустить server.py в 192.168.1.102?

Вот команда для запуска server.py

Сервер $ python3. ру 192.168.1.102 4444

Вот скриншот


Здесь есть два аргумента в пользу программы Python. 1 ул аргумент - IP-адрес самого сервера, здесь его 192.168.1.102 и 2 nd аргумент - порт, который сервер будет слушать, здесь мы выбрали 4444.

Как запустить client.py в 192.168.1.6?

Вот команда для запуска client.py

Клиент $ python3. ру 192.168.1.102 4444

Вот скриншот


Здесь есть два аргумента в пользу программы Python. 1 ул аргумент - IP-адрес сервера, здесь его 192.168.1.102 и 2 nd аргумент - порт, на котором работает сервер. В нашем примере это 4444.

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

Скриншот клиента формы:



Скриншот сервера:


А вот скриншот на стороне клиента.


Теперь это будет продолжаться бесконечное количество раз, пока мы не остановим программу python с помощью Ctrl + c.

Проверьте пакет UDP в Wireshark:

Теперь мы кое-что связали, но как мы узнаем, что UDP использовался для отправки или получения этих пакетов. Итак, мы можем проверить захват в Wireshark.

Давайте посмотрим на пакет, когда клиент [192.168.1.6] отправил данные [«Я от клиента»] на сервер [192.168.1.6].


Пояснение к коду:

Для базового объяснения кода Python см. «Отправка передачи файлов из сокетов Python» в справочном разделе.

Мы будем объяснять только важные коды строк для файла python клиента и сервера. Внутри кода клиента и сервера есть полезные комментарии.

Объяснение клиентского кода:

если len ( sys . argv ) == 3 :

Вышеупомянутая строка требуется, чтобы проверить, передал ли пользователь обязательные обязательные аргументы. В противном случае программа выйдет. Такая же проверка есть и в серверной программе.

s = разъем . разъем ( разъем . AF_INET , разъем . SOCK_DGRAM , 0 )

Вышеупомянутая строка предназначена для создания сервера сокетов с UDP. [SOCK_DGRAM] протокол. Тот же код есть в server.py.

Запускать программу в бесконечном цикле, пока пользователь не нажмет Ctrl + c. Тот же код есть в server.py.

данные , адрес = с. recvfrom ( 4096 )

Получать любые данные, поступающие с сервера. Тот же код есть в server.py.

Объяснение кода сервера:

Отправьте данные на адрес клиента.

Вывод:

Мы можем отправлять или получать данные UDP с помощью программы Python. Внутри он использует механизм клиент-сервер.

Читайте также: