8-900-374-94-44
[email protected]
Slide Image
Меню

Server udp: Уроки Ардуино. Протокол UDP. Создание UDP-сервера и клиента с помощью библиотеки UIPEthernet.

Содержание

Настройка сведений о портах UDP сервера политики сети

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016

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

По умолчанию NPS прослушивает трафик RADIUS на портах 1812, 1813, 1645 и 1646 для протокола IP версии 6 (IPv6) и IPv4 для всех установленных сетевых адаптеров.

Примечание

При удалении IPv4 или IPv6 на сетевом адаптере NPS не отслеживает трафик RADIUS для неустановленного протокола.

Значения портов 1812 для проверки подлинности и 1813 для учета — это стандартные порты RADIUS, определяемые IETF в RFC 2865 и 2866. Однако по умолчанию многие серверы доступа используют порты 1645 для запросов проверки подлинности и 1646 для запросов учета. Независимо от того, какие номера портов вы решили использовать, убедитесь, что NPS и сервер доступа настроены для использования одних и тех же номеров.

СУЩЕСТВЕННО Если вы не используете номера портов RADIUS по умолчанию, необходимо настроить на брандмауэре исключения для локального компьютера, чтобы разрешить трафик RADIUS на новых портах. Дополнительные сведения см. в статье Настройка брандмауэров для трафика RADIUS.

Членство в группе Администраторы домена или эквивалентной является минимальным требованием для выполнения данной процедуры.

  1. Откройте консоль NPS.
  2. Щелкните правой кнопкой мыши сервер политики сетии выберите пункт свойства.
  3. Перейдите на вкладку порты и проверьте параметры портов. Если проверка подлинности RADIUS и UDP-порты для учета RADIUS отличаются от указанных значений по умолчанию (1812 и 1645 для проверки подлинности, а также 1813 и 1646 для учета), введите параметры порта в поле
    Проверка подлинности
    и учет.
  4. Чтобы использовать несколько параметров портов для проверки подлинности или запросов учета, разделяйте номера портов запятыми.

Дополнительные сведения об управлении NPS см. в разделе Управление сервером политики сети.

Дополнительные сведения о NPS см. в разделе сервер политики сети (NPS).

Обмен данными по протоколу UDP блокируется правилом брандмауэра Windows в WSFC — Windows Server

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

В этой статье описано, как устранить проблему, из-за которой подключение по протоколу UDP блокируется правилом брандмауэра Windows в WSFC при прерывании и восстановлении сетевого подключения.

Применяется к: Windows Server 2012 R2
Исходный номер базы знаний: 2701206

Симптомы

В среде Windows Server 2008 R2 входящее подключение по протоколу UDP может быть заблокировано, если подключение к сети прервано, а затем восстановлено. В этой ситуации также может быть заблокировано входящее подключение TCP и ICMP.

Эта проблема возникает, если входящий UDP-обмен данными включен брандмауэром Windows. Одна из служб, на которые может повлиять эта проблема, — отказоустойчивая кластеризация Windows Server (WSFC). Хотя heartbeat-связь (UDP 3343) может быть включена по умолчанию, обмен данными может быть заблокирован. При возникновении этой проблемы состояние связи в диспетчере отказоустойчивости кластеров отображается как «Недоступно».

Примечание.

Вы можете ссылаться на параметры подключения UDP брандмауэра Windows из следующего правила:
[Брандмауэр Windows с расширенной безопасностью] — [Правила для входящего трафика]

Причина

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

Решение 1. Использование команды netsh

Выполните следующие команды

netsh в командной строке с повышенными привилегиями:

netsh advfirewall firewall show rule "Failover Clusters (UDP-In)"
netsh advfirewall firewall set rule "Failover Clusters (UDP-In)" new enable=no
netsh advfirewall firewall show rule "Failover Clusters (UDP-In)"

Примечание.

  • При использовании этого метода служба кластера может быть остановлена. Поэтому, если это возможно, следует остановить службу кластера перед запуском этого метода, а затем перезапустить службу кластера после выполнения других действий.
  • При использовании этого метода правило «Отказоустойчивые кластеры (UDP-in)» также отключено.
  • Служба кластера обеспечивает обмен данными между узлами, заключив порт брандмауэра UDP при запуске.

Решение 2. Использование брандмауэра Windows с надстройки расширенной безопасности

Запустите надстройку консоли управления Майкрософт «Брандмауэр Windows с расширенной безопасностью». Для этого выполните следующие действия:

  1. Нажмите кнопку «Пуск», введите wf.msc в поле «Поиск программ и файлов», а затем в разделе «Программы» нажмите кнопку wf.msc.
  2. Щелкните «Правила для входящего трафика».
  3. Найдите и выберите правило отказоустойчивых кластеров (UDP-in ).
  4. Отключите или удалите правило отказоустойчивых кластеров (UDP-in ).

Примечание.

  • При использовании этого метода служба кластера может быть остановлена. Поэтому, если это возможно, следует остановить службу кластера перед запуском этого метода, а затем перезапустить службу кластера после выполнения других действий.
  • При использовании этого метода правило «Отказоустойчивые кластеры (UDP-in)» также отключено.
  • Служба кластера обеспечивает обмен данными между узлами, заключив порт брандмауэра UDP при запуске.

Решение 3. Отключение службы списка сетей

Чтобы отключить службу «Список сетей», выполните следующие действия.

  1. Нажмите кнопку «Пуск», введите службы в поле «Поиск программ и файлов » и нажмите клавишу ВВОД.
  2. В столбце «Имя » в разделе «Службы (локальные)» щелкните правой кнопкой мыши службу списка сетей и выберите пункт «Свойства».
  3. На вкладке « Общие» установите для поля «Тип запуска » значение «Отключено».
  4. Нажмите кнопку «Применить>ОК».
  5. Перезагрузите компьютер.

Примечание.

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

  • По умолчанию брандмауэр Windows теперь выбирает общедоступный профиль.
    Поэтому правила, задаваемые для домена или закрытого профиля, должны быть добавлены в общедоступный профиль.
  • В Центре общего доступа к сети не отображаются типы профилей и состояние сетевого подключения.
  • Значок сетевого подключения больше не отображается на панели задач Windows.

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

Корпорация Майкрософт подтвердила, что это известная проблема в Брандмауэре Windows.

Все, что вы хотели знать о сокетах UDP, но боялись спросить, часть 1

Идет загрузка…

25 ноября 2021 г. 17:27

  • Марек Майковский

Фрагмент внутренней презентации о внутренней работе UDP в Spectrum. Кто сказал, что UDP — это просто!

Исторически основной компетенцией Cloudflare была работа с обратным прокси-сервером HTTP. Мы приложили значительные усилия для оптимизации традиционных серверов HTTP/1.1 и HTTP/2, работающих поверх TCP. Однако недавно мы начали использовать крупномасштабные сервисы UDP с отслеживанием состояния.

Stateful UDP набирает популярность по ряду причин:

— QUIC — это новый транспортный протокол, основанный на UDP, он поддерживает HTTP/3. Мы видим, что принятие ускоряется.

— Мы используем WARP — нашу службу туннелирования на основе протокола Wireguard, которая внутри использует UDP.

— У нас много общего UDP-трафика, проходящего через нашу службу Spectrum.

Хотя протокол UDP в принципе прост, для работы в больших масштабах требуется много знаний в предметной области. В этом сообщении блога мы рассмотрим основы: все, что вам нужно знать о UDP-серверах, чтобы начать работу.

Подключенные и неподключенные

Как вы «принимаете» соединения на UDP-сервере? Если вы используете несвязанные сокеты, вы обычно этого не делаете.

Но давайте начнем с основ. Сокеты UDP могут быть «подключенными» (или «установленными») или «неподключенными». Подключенные сокеты имеют полный 4-кортеж, связанный {IP-адрес источника, исходный порт, IP-адрес назначения, порт назначения}, неподключенные сокеты имеют 2-кортеж {bind ip, bind port}.

Традиционно подключенные сокеты в основном использовались для исходящих потоков, а неподключенные — для входящих соединений со стороны «сервера».

Клиент UDP

Как мы сегодня узнаем, их можно смешивать. Можно использовать подключенные сокеты для обработки входа и неподключенные для выхода. Чтобы проиллюстрировать последнее, рассмотрим эти два фрагмента. Они делают то же самое — отправляют пакет DNS-преобразователю. Первый фрагмент использует подключенный сокет:

Второй, использует неподключенный:

Какой из них лучше? Во втором случае при получении программист должен проверить исходный IP пакета. В противном случае программа может запутаться из-за случайного входящего интернет-мусора, например сканирования портов. Заманчиво повторно использовать дескриптор сокета и затем запросить другой DNS-сервер, но это плохая идея, особенно при работе с DNS. В целях безопасности DNS предполагает, что исходный порт клиента является непредсказуемым и недолговечным.

Вообще говоря, для исходящего трафика предпочтительнее использовать подключенные сокеты UDP.

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

Для полноты картины можно свернуть новый исходный порт и повторно использовать дескриптор сокета с непонятным приемом, который называется «распад ассоциации сокета». Это можно сделать с connect(AF_UNSPEC) , но это довольно продвинутая магия Linux.

Сервер UDP

Традиционно на стороне сервера UDP требует несвязанных сокетов. Их использование требует некоторой ловкости. Чтобы проиллюстрировать это, давайте напишем эхо-сервер UDP. На практике вам, вероятно, не стоит писать такой сервер из-за риска стать вектором отражения DoS. Среди других средств защиты, таких как ограничение скорости, службы UDP всегда должны отвечать строго меньшим объемом данных, чем было отправлено в исходном пакете. Но не будем отвлекаться, наивный эхо-сервер UDP может выглядеть так:

Этот код вызывает вопросы:

— Полученные пакеты могут быть длиннее 2048 байт. Это может произойти из-за обратной петли, при использовании больших кадров или с помощью фрагментации IP.

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

— А как насчет входящих ошибок ICMP?

Эти проблемы специфичны для UDP, они не возникают в мире TCP. TCP может прозрачно обрабатывать MTU/фрагментацию и ошибки ICMP. В зависимости от конкретного протокола служба UDP может быть более сложной и уделять особое внимание таким крайним случаям.

Получение пакетов из сокета с подстановочными знаками

С этим кодом связана более серьезная проблема. Корректно работает только при привязке к определенному IP-адресу, например ::1 или 127.0.0.1 . Это не всегда будет работать, когда мы привязываемся к подстановочному знаку. Проблема заключается в строке sendto() — мы явно не указали исходящий IP-адрес! Linux не знает, откуда мы хотим получить пакет, и выберет исходящий IP-адрес по умолчанию. Это может быть не тот IP-адрес, с которым общался клиент. Например, допустим, мы добавили :: 2 адрес для обратного интерфейса и отправки пакета на него, с IP-адресом src, установленным на действительный :: 1

:

 [электронная почта защищена]: ~$ sudo tcpdump -ni lo порт 1234 -t
tcpdump: подробный вывод подавлен, используйте -v или -vv для полного декодирования протокола
прослушивание на lo, канальный EN10MB (Ethernet), размер захвата 262144 байт
IP6 ::1.41879 > ::2.1234: UDP, длина 2
IP6 ::1.1234 > ::1.41879: UDP, длина 2
 

Здесь мы видим, что пакет корректно летит с ::1 на ::2 , на наш сервер. Но затем, когда сервер отвечает, он получает ответ от IP-адреса :: 1 , что в данном случае неверно.

На стороне сервера при привязке к подстановочному знаку:

— мы можем получать пакеты, предназначенные для нескольких IP-адресов

— мы должны быть очень осторожны при ответе и использовать соответствующий исходный IP-адрес

BSD Sockets API не t облегчить понимание того, куда был направлен полученный пакет. В Linux и BSD можно запросить полезные метаданные CMSG с помощью IP_RECVPKTINO и IPV6_RECVPKTINFO.

Улучшенный цикл сервера может выглядеть так:

Системные вызовы recvmsg и sendmsg , в отличие от recvfrom / sendto , позволяют программисту запрашивать и устанавливать дополнительные метаданные CMSG, что очень удобно при работе с UDP.

CMSG IPV6_PKTINFO содержит следующую структуру данных:

Здесь мы можем найти IP-адрес и номер интерфейса получателя пакета. Обратите внимание, здесь нет места для номера порта.

Мягкий перезапуск сервера

Многие традиционные протоколы UDP, такие как DNS, основаны на запросе-ответе. Поскольку нет состояния, связанного с «соединением» более высокого уровня, сервер может без проблем перезапуститься, обновить или изменить конфигурацию. В идеале сокеты должны управляться с помощью обычной активации сокета systemd, чтобы избежать короткого временного окна, когда сокет не работает.

Современные протоколы часто основаны на соединении. Для таких серверов при перезапуске полезно сохранять старые подключения, направленные на старый серверный процесс, в то время как новый экземпляр сервера доступен для обработки новых подключений. Старые соединения со временем прервутся, и старый серверный процесс сможет завершиться. Это обычная и простая практика в мире TCP, где каждое соединение имеет свой собственный файловый дескриптор. Старый серверный процесс прекращает принимать (accept()) новые соединения и просто ждет, пока старые соединения постепенно исчезнут. У NGINX есть хорошая документация по этому вопросу.

К сожалению, в UDP вы не можете accept() новых подключений. Выполнение изящных перезапусков сервера для UDP на удивление сложно.

Метод «установлено-по-неподключенному»

Для некоторых услуг мы используем метод, который мы называем «установлено-по-неподключенному». Это происходит от осознания того, что в Linux можно создать подключенный сокет *по* неподключенному. Рассмотрим этот код:

Это выглядит хакерским? Что ж, должно. Что мы делаем здесь:

— Запускаем несвязанный сокет UDP.

— Ждем прихода клиента.

— Как только мы получаем первый пакет от клиента, мы немедленно создаем новый полностью подключенный сокет, *над* неподключенным сокетом! Он использует тот же локальный порт и локальный IP-адрес.

Вот как это может выглядеть в ss:

 [email protected]:~$ ss -panu sport = :1234 или dport = :1234 | кот
Состояние Recv-Q Send-Q Локальный адрес: порт Одноранговый адрес: процесс порта
УСТАНОВКА 0 0 [::1]:1234 [::1]:44592 питона3
UNCONN 0 0 *:1234 *:* python3
УСТАНОВИТЬ 0 0 [::1]:44592 [::1]:1234 н. з.
 

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

Этот трюк в основном воспроизводит поведение «accept()» в UDP, где каждое входящее соединение получает свой собственный выделенный дескриптор сокета.

Хотя этот трюк хорош, он не лишен недостатков — пикантен в двух местах. Во-первых, возможно, что клиент отправит более одного пакета в неподключенный сокет, прежде чем будет создан подключенный сокет. Код приложения должен обходить это — если пакет, полученный из серверного сокета, принадлежит уже существующему подключенному потоку, он должен быть передан в нужное место. Затем, во время создания подключенного сокета, в коротком окне после bind() до connect() мы можем получить неожиданные пакеты, принадлежащие неподключенному сокету! Нам не нужны эти пакеты здесь. Необходимо фильтровать исходный IP/порт при получении ранних пакетов на подключенном сокете.

Стоит ли такой подход дополнительной сложности? Это зависит от варианта использования. Для относительно небольшого количества долгоживущих потоков это может быть нормально. Для большого количества недолговечных потоков (особенно DNS или NTP) это излишество.

Сохранение стабильности старых потоков во время перезапуска службы особенно сложно в UDP. Техника установленного над неподключенным — лишь один из самых простых способов справиться с этим. Мы оставим еще один метод, основанный на SO_REUSEPORT ebpf, для следующей статьи в блоге.

Резюме

В этом сообщении блога мы начали с выделения подключенных и неподключенных сокетов UDP. Затем мы обсудили, почему сложно привязать UDP-серверы к подстановочному знаку и как IP_PKTINFO CMSG может помочь решить эту проблему. Мы обсудили проблему изящного перезапуска UDP и намекнули на метод установления соединения поверх отсутствия соединения.

Тип гнезда Создано с Соответствующие системные вызовы
установлен соединить() прием()/отправка()
установлен привязать() + подключить() recvfrom()/send(), следите за гонкой после bind(), проверьте источник пакета
не подключен привязка (конкретный IP) recvfrom()/отправить()
не подключен привязка (подстановочный знак) recvmsg()/sendmsg() с IP_PKTINFO CMSG

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

Мы защищаем целые корпоративные сети, помочь клиентам построить Интернет-приложения эффективно, ускорить любой Веб-сайт или Интернет-приложение, защититься от DDoS-атак атаки, держать хакеры в залив, и может помочь вам в ваш путь к нулевому доверию.

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

Чтобы узнать больше о нашей миссии по улучшению Интернета, начните здесь. Если вы ищете новое направление карьеры, ознакомьтесь с нашими открытыми позиции.

UDP

Похожие сообщения

07 октября 2021 г. 3:20

Обновленная информация о недавних атаках VoIP: что мне делать, если меня атакуют?

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

    К
  • Омер Йоахимик

  • , Вивек Ганти

  • , Алекс Форстер

ДДоС , DDoS-атаки с выкупом , Тенденции , ГЛОТОК , VoIP

08 декабря 2021 г. 1:59PM

Расширение платформы Cloudflare Zero Trust для поддержки UDP и внутреннего DNS

В прошлом году мы запустили новую функцию, которая позволила пользователям начать создание частной сети на Cloudflare. Сегодня мы рады представить еще больше функций, которые сделают миграцию с нулевым доверием проще, чем когда-либо….

    К
  • Эйб Кэррил

Неделя ИТ-директора , Облачная вспышка Один , Облачный туннель , Нулевое доверие , УДП

13 ноября 2021 г. 14:33

Cloudflare блокирует многовекторную DDoS-атаку со скоростью почти 2 Тбит/с

Ранее на этой неделе Cloudflare автоматически обнаружила и смягчила DDoS-атаку, пиковая скорость которой составила чуть менее 2 Тбит/с — самая крупная, которую мы видели на сегодняшний день.

    К
  • Омер Йоахимик

ДДоС , Атаки , Мирай , Ботнет , DNS

02 февраля 2022 г. 9:53

Как остановить нехватку эфемерных портов и полюбить долгоживущие соединения

Часто у программистов есть предположения, которые, к их удивлению, оказываются неверными. По моему опыту такое случается часто. Любым API, технологией или системой можно злоупотреблять сверх своих возможностей и сломать самым жалким образом…

    К
  • Марек Майковский

Глубокое погружение , UDP , TCP , линукс , Сеть

Разница между UDP-сервером и UDP-клиентом

спросил

Изменено 1 год, 11 месяцев назад

Просмотрено 10 тысяч раз

Я пытаюсь работать с протоколом UDP и не понимаю разницы между UDP-сервером и UDP-клиентом . Разве они не делают то же самое?

  • сервер
  • udp
  • клиент

1

Сервер UDP:

  • Запускается первым (чтобы открыть порт прослушивания)
  • Открывает определенный порт
  • Обычно может принимать несколько клиентских подключений

Клиент UDP:

  • Запускается второй (при условии, что сервер уже запущен)
  • Указывает конкретный целевой порт
  • Произвольно (обычно) выбрать исходный порт, на который сервер ответит
  • Обычно однопоточный и обрабатывает только одно подключение к UDP-серверу

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

На самом деле все зависит от того, с какой точки смотреть.

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

С точки программирования сокетов все точно так же. Поскольку UDP не требует подключения, и сервер, и клиент будут использовать одни и те же методы sendto и recvfrom . Не существует такого API сокетов, уникального только для сервера или клиента (речь идет о UDP). Поэтому я бы предпочел называть стороны одноранговыми или отправителем/получателем вместо сервера/клиента.

Цитата из статьи Википедии для модели клиент-сервер:

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *