Как отправить tcp пакет windows

Обновлено: 02.07.2024

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

Работа нейросети из книги Тарика Рашида "Создаем нейронную сеть"
Здравствуйте! Вопрос наверное к тем, кто читал сабжевую книгу и понимает, что там за сетка.

Грубо говоря да. Только для реализации подобных задач обычно используют дополнительный сетевой адаптер и копаются в драйверах. Результатом получается некорректная работа, не все приложения сами умеют выставлять приоритет адаптеров, из за этого эмуляция локальной сети работает криво. Обычный VPN под мои задачи мало подходит. Отличие моей реализации состоит в том, чтобы запустить клиент без каких либо дополнительных настроек(фактический даже без установки-portable) и получить виртуальную связь по "локальной сети" со всеми моими внешними устройствами через мой собственный сервер, чтобы приложение запущенное на локальной машине через локальную сеть, работало фактический через интернет. Самый банальный пример это любая игра с режимом локальной сети, она должна думать что все пакеты пришли из локалки.
Реализация передачи данных с сервером уже написана, вопрос состоит в том, как полученные пакеты ретранслировать на какой-либо порт таким образом, чтобы windows думал что все пришло из локальной сети и те приложения которые слушают этот порт приняли пакеты. Только для реализации подобных задач обычно используют дополнительный сетевой адаптер и копаются в драйверах.

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

Вы точно не пытаетесь велосипед сотворить?

Ничего не используют и нигде не копаются. Настройка VPN во всех современных ОС осуществляется довольно просто и без описанных вами вещей. И все программы с этим работают совершенно корректно, ибо вопрос разруливания трафика лежит на таблице маршрутизации сетевого стёка и совершенно прозрачен для любого ПО.
Вы точно не пытаетесь велосипед сотворить? Да, я знаю как настраивается VPN в OC. Тут вопрос состоит в том, чтобы использовать свой сервер для передачи пакетов и организовать связь двух локальных машин которые подключены к интернету с серыми ип, чтобы можно было обменивать между ними данные, поднимать серверы локально на одной из машин, при этом другая корректно видела эти серверы и работала с ними. Не уверен, что обычный VPN подойдет для этих задач. Плюсом к этому нужно организовать дополнительные функции и настройки которые было бы удобнее использовать в одном приложении по щелчку мыши, когда есть контроль над полученными пакетами и остальное. Тут вопрос состоит в том, чтобы использовать свой сервер

Ну так устанавливайте на своём сервере сервер VPN. Или арендуйте VPS с преднастроенным VPN. Каждый второй хостер такое предлагает.

Не подходит для своей основной задачи, ради которой и создавался? Серьёзно?) Ну так устанавливайте на своём сервере сервер VPN. Или арендуйте VPS с преднастроенным VPN. Каждый второй хостер такое предлагает.

Есть еще одно условие задачи, я нашел бесплатный VPS с предустановленным на нем node js на котором написал проброс пакетов всем подключенным клиентам. И хочу использовать именно его как сервер ретрансляции данных между всеми клиентами. Поэтому моя ситуация немного отличается от типичной, когда есть свой собственный выделенный сервер куда можно установить что угодно. Понимаете

Добавлено через 12 минут
Ну и еще такое условие, у меня есть свой собственный сервер, у которого серый ип. Я хочу на нем запустить клиент и хостить то, что мне нужно, чтобы к нему был доступ из внешнего интернета, а ретранслятором выступал бесплатный vps на node js. У меня не такие масштабные задачи стоят, чтобы выделенный vps арендовать и следить за его оплатой. Раз в пол года нужно запускать локально какое-либо приложение чтобы его тестировать, чтобы оно имело виртуальную связь по локальной сети. Поэтому нашел бесплатный vps за которым не нужно следить и оплачивать.
ДА и вообще в целом интересно как можно пакеты локально ретранслировать таким образом, чтобы windows думал что они с локальной сети пришли.

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

Почемубы не воспользоваться стронними разработками ? Это ведь тест файрвола и ничего больше!

[SSH]
sequence = 12345:tcp,54321:udp
seq_timeout = 20
tcpflags = syn
start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
cmd_timeout = 30
stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT

Вот если обращусь на порт 12345 протокол tcp и потом на порт 54321 протокол udp в течение 20 сек, то мне будет открыт доступ к SSH на 30 сек :D

у вас даже Задача поставлена и сформулирована, условие:

ALex_hha
Вот если обращусь на порт 12345 протокол tcp и потом на порт 54321 протокол udp в течение 20 сек

Posted via ActualForum NNTP Server 1.4

автор
в дельфях работы на 20 минут. Использовать библтотеку indy (сэкономил ещё 5 минут).

да написать то я и сам могу на с++ builder, вопрос был именно в штатных средствах. Да и писать не надо, у knockd есть свой клиент и под винду, просто тогда клиенту его надо будет всегда иметь при себе, что несколько неудобно

автор
Столько геморроя только для того, чтобы можно было использовать SSH сервер с известными
уязвимостями?

это был лишь пример для наглядности так сказать ;) Использоваться будет не ssh

Posted via ActualForum NNTP Server 1.4

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

Posted via ActualForum NNTP Server 1.4

Posted via ActualForum NNTP Server 1.4

Posted via ActualForum NNTP Server 1.4

Как способ защиты от сканирования портов -очень даже хороший способ. Невиден порт снаружи - нет уязвимости. Подобрть комбинацию для "стука" давольно сложно.

Posted via ActualForum NNTP Server 1.4

int af,
int type,
int protocol
);

[in] An address family specification.

[in] A type specification for the new socket.

[in] A particular protocol to be used with the socket which is specific to the indicated address family.

The socket function causes a socket descriptor and any related resources to be allocated and bound to a specific transport service provider. Windows Sockets will utilize the first available service provider that supports the requested combination of address family, socket type and protocol parameters. Note that the socket created will have the overlapped attribute. Sockets without the overlapped attribute can only be created by using WSASocket.

Note The manifest constant AF_UNSPEC continues to be defined in the header file but its use is strongly discouraged, as this can cause ambiguity in interpreting the value of the protocol parameter.

The following are the only two type specifications supported for Windows Sockets 1.1:

Type Explanation
SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams with an out-of-band data transmission mechanism. Uses TCP for the Internet address family.
SOCK_DGRAM Supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. Uses UDP for the Internet address family.

In Windows Sockets 2, many new socket types will be introduced. However, since an application can dynamically discover the attributes of each available transport protocol through the WSAEnumProtocols function, the various socket types need not be called out in the API specification. Socket type definitions will appear in WINSOCK2.H which will be periodically updated as new socket types, address families and protocols are defined.
Connection-oriented sockets such as SOCK_STREAM provide full-duplex connections, and must be in a connected state before any data can be sent or received on it. A connection to another socket is created with a connect call. Once connected, data can be transferred using send and recv calls. When a session has been completed, a closesocket must be performed.

The communications protocols used to implement a reliable, connection-oriented socket ensure that data is not lost or duplicated. If data for which the peer protocol has buffer space cannot be successfully transmitted within a reasonable length of time, the connection is considered broken and subsequent calls will fail with the error code set to WSAETIMEDOUT.
Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received only from this peer using recv.

Support for sockets with type RAW is not required, but service providers are encourage to support raw sockets whenever it makes sense to do so.

If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling WSAGetLastError.

WSANOTINITIALISED A successful WSAStartup must occur before using this function.
WSAENETDOWN The network subsystem or the associated service provider has failed.
WSAEAFNOSUPPORT The specified address family is not supported.
WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAEMFILE No more socket descriptors are available.
WSAENOBUFS No buffer space is available. The socket cannot be created.
WSAEPROTONOSUPPORT The specified protocol is not supported.
WSAEPROTOTYPE The specified protocol is the wrong type for this socket.
WSAESOCKTNOSUPPORT The specified socket type is not supported in this address family.

автор
Насколько я понимаю. то ТС хочет использовать так называемый "стук" для открытия порта. Не помню как оригинале это называется.

ну собственно knock и переводится как стук ;)

int af,
int type,
int protocol
);

[in] An address family specification.

[in] A type specification for the new socket.

[in] A particular protocol to be used with the socket which is specific to the indicated address family.

The socket function causes a socket descriptor and any related resources to be allocated and bound to a specific transport service provider. Windows Sockets will utilize the first available service provider that supports the requested combination of address family, socket type and protocol parameters. Note that the socket created will have the overlapped attribute. Sockets without the overlapped attribute can only be created by using WSASocket.

Note The manifest constant AF_UNSPEC continues to be defined in the header file but its use is strongly discouraged, as this can cause ambiguity in interpreting the value of the protocol parameter.

The following are the only two type specifications supported for Windows Sockets 1.1:

Type Explanation
SOCK_STREAM Provides sequenced, reliable, two-way, connection-based byte streams with an out-of-band data transmission mechanism. Uses TCP for the Internet address family.
SOCK_DGRAM Supports datagrams, which are connectionless, unreliable buffers of a fixed (typically small) maximum length. Uses UDP for the Internet address family.

In Windows Sockets 2, many new socket types will be introduced. However, since an application can dynamically discover the attributes of each available transport protocol through the WSAEnumProtocols function, the various socket types need not be called out in the API specification. Socket type definitions will appear in WINSOCK2.H which will be periodically updated as new socket types, address families and protocols are defined.
Connection-oriented sockets such as SOCK_STREAM provide full-duplex connections, and must be in a connected state before any data can be sent or received on it. A connection to another socket is created with a connect call. Once connected, data can be transferred using send and recv calls. When a session has been completed, a closesocket must be performed.

The communications protocols used to implement a reliable, connection-oriented socket ensure that data is not lost or duplicated. If data for which the peer protocol has buffer space cannot be successfully transmitted within a reasonable length of time, the connection is considered broken and subsequent calls will fail with the error code set to WSAETIMEDOUT.
Connectionless, message-oriented sockets allow sending and receiving of datagrams to and from arbitrary peers using sendto and recvfrom. If such a socket is connected to a specific peer, datagrams can be sent to that peer using send and can be received only from this peer using recv.

Support for sockets with type RAW is not required, but service providers are encourage to support raw sockets whenever it makes sense to do so.

If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling WSAGetLastError.

WSANOTINITIALISED A successful WSAStartup must occur before using this function.
WSAENETDOWN The network subsystem or the associated service provider has failed.
WSAEAFNOSUPPORT The specified address family is not supported.
WSAEINPROGRESS A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.
WSAEMFILE No more socket descriptors are available.
WSAENOBUFS No buffer space is available. The socket cannot be created.
WSAEPROTONOSUPPORT The specified protocol is not supported.
WSAEPROTOTYPE The specified protocol is the wrong type for this socket.
WSAESOCKTNOSUPPORT The specified socket type is not supported in this address family.

2aleks2
это надо понимать вместо рабочего примера с использованием штатных средств.

Передавать сырые данные 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. Для воспроизведения полного диалога с камерой можно использовать команду вида:

Протокол TCP является одним из важнейших протоколов связи в компьютерных сетях. В этой статье познакомимся с ним поближе.

Что такое транспортные протоколы

Транспортные протоколы (TCP и UDP) используются для передачи информации. Информация передаётся маленькими частями – сетевыми пакетами. То есть поток информации разбивается на много маленьких пакетов.

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

Особенности TCP

Главной особенностью TCP (Transmission Control Protocol) является то, что он гарантирует доставку всех отправленных пакетов. При этом проверяется целостность пакетов и их порядок. Если пакет потерялся или испортился, то получатель запросит эти пакеты у отправителя снова. Если пакеты пришли не в том порядке, то они на принимающей стороне всё равно обработаются в правильном. Этот механизм контроля доставки накладывает дополнительную нагрузку в виде увеличения служебной информации, которую нужно передать вместе с полезными данными.

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

Поверх протокола TCP работают многие прикладные протоколы:

TCP пакеты передаются не просто так, а в рамках установленного соединения – которое называют TCP сессией.

Подключение можно выполнить только если вторая сторона прослушивает порт, к которому будет выполняться подключение.

Алгоритм работы TCP

Алгоритм работы TCP следующий:

  1. Используя трехкратное рукопожатие, между двумя узлами создаётся сеанс связи.
  2. При отправке пакетов узлы последовательно нумеруют их и рассчитывают контрольную сумму.
  3. Поскольку все пакеты имеют последовательные номера, то становится видно если какие-то из них отсутствуют. В этом случае отправляется запрос на повторную отправку пакета.
  4. Если для какого-то пакета не совпала контрольная сумма, то отправляется запрос на повторную отправку пакета.

При открытии даже одной веб странички создаются несколько TCP соединений для:

  • html страницы;
  • каждого CSS и JavaScript файлов;
  • каждого изображения.

И для каждого такого соединения вначале устанавливается сеанс, что замедляет передачу данных.

Заголовок TCP пакета

Заголовок TCP пакета состоит из следующих полей:

  • Порт отправителя.
  • Порт получателя.
  • Порядковый номер в сегменте (sequence number). В целях безопасности это значение генерируется случайным образом и может быть равно от 0 до 4294967295;
  • Номер подтверждения (acknowledgment number). Когда мы подтверждаем определённый пакет, в нем записывается sequence number подтверждаемого пакета.
  • Длина заголовка (data offset). В этом поле указывается длина заголовка TCP пакета и где начинаются фактические данные.
  • Зарезервированное поле. Эти биты зарезервированы для будущего использования.
  • Флаги. Необходимы для дополнительной функциональности. Например, позволяют установить или разорвать соединение, включить или выключить защиту от перегрузки сети и тому подобное.
  • Размер окна (Window Size). Указывается количество байт, считая от последнего номера подтверждения, которые готов принять отправитель данного пакета. То есть, какой у него в данный момент времени размер буфера.
  • Контрольная сумма (Checksum). Используется для проверки на наличие ошибок при приеме или передачи пакетов. Рассчитывается с учетом заголовка (кроме контрольной суммы) и самих данных.
  • Указатель срочности (Urgent pointer). Используется, если стоит флаг URG. По этому значению определяются срочные данные и они сразу же передаются приложению. Остальные данные попадают в буфер.
  • Дополнительные опции. Необязательно, но используются почти всегда.
  • Заполнение (Padding). Дополняет заголовок, пока он не закончится на 32-разрядной границе. Всегда состоит только из нулей.

Флаги в заголовке TCP

Создание TCP сессии

Для установления соединения использует трехкратное рукопожатие.

Трёхкратное рукопожатие TCP

Первый этап. Клиент отправляет на сервер пакет с флагом SYN. При этом клиент устанавливает порядковый номер сегмента на случайное значение A.

Второй этап. В ответ сервер отвечает пакетом с флагами SYN и ACK. Номер подтверждения установлен на единицу больше принятого (A+1). Поскольку сервер также будет отправлять данные, то для себя он тоже выбирает номер первого пакета, который будет другим случайным числом B.

Третий этап. Клиент отправляет ACK на сервер. Порядковый номер устанавливается равным A+1, а номер подтверждения устанавливается на B+1.

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

Передача данных в TCP

Теперь разберём пример передачи данных в уже установленном сеансе.

Обмен данными TCP

Клиент отравляет запрос к серверу. Поскольку данные поместились в один пакет TCP, он получил флаг PSH, чтобы сервер не ждал продолжение получения данных. При этом пакет получил 2 флага: ACK (подтвердил предыдущею передачу пакетов от сервера) и PSH.

В ответ на это сервер отправляет пакет ACK с номером успешно полученных данных.

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

Далее клиент подтверждает, что данные получены отправляя пакеты с флагом ACK.

Завершение сеанса TCP

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

Завершение сеанса TCP

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

После того, как сторона, отправившая первый FIN, ответила с последним ACK, она ожидает некоторое время прежде чем окончательно закрыть соединение. В течение этого времени локальный порт недоступен для новых соединений.

Соединение может быть «полуоткрытым», и в этом случае одна сторона завершила свою часть, а другая — нет. Завершившая сторона больше не может отправлять какие-либо данные, но другая сторона может. Завершающая сторона должна продолжить чтение данных, пока другая сторона также не завершит свою работу.

Также возможно разорвать соединение трёхкратным рукопожатием, когда первая сторона отправляет FIN, а вторая отвечает FIN и ACK (просто объединяет 2 шага в один). Дальше первая сторона подтверждает завершение сеанса с помощью ACK.

Состояния сеанса TCP

Сеанс TCP может находится в следующих состояниях:

  • CLOSED – начальное состояние;
  • LISTEN – сервер ожидает запросы от клиента;
  • SYN-SENT – клиент хочет установить соединение с сервером и ожидает подтверждение;
  • SYN-RECEIVED – сервер получил запрос на создание сеанса, отправил ответный запрос и ожидает подтверждение;
  • ESTABLISHED – соединение установлено, идёт передача данных;
  • FIN-WAIT-1 – одна из сторон завершает соединение, отправив флаг FIN;
  • CLOSE-WAIT – другая сторона переходит в это состояние, отправив подтверждение на FIN, но продолжает передачу;
  • FIN-WAIT-2 – первый узел получил ACK, разорвал свое соединение, но еще читает данные;
  • LAST-ACK – второй узел заканчивает передачу и отправляет флаг FIN;
  • TIME-WAIT – сервер получил пакет с флагом FIN, отправил флаг ACK и ждёт некоторое время, перед окончательным закрытием соединения;
  • CLOSING – обе стороны инициировали закрытие соединения одновременно.

Вот мы и познакомились с одним из самых важных протоколов сети Интернет. Разобрались с его особенностями, алгоритмом работы. Узнали про сеансы TCP, пакеты и сегменты.

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