Вопрос или проблема
Именованные порты могут быть определены в /etc/services
, но ни curl
, ни http.Get()
(Go), ни reqwest::get()
(Rust) не признают этого определения.
Хотя возможно вручную определить номер порта по имени службы через библиотеку libc's getservbyname()
или команду getent
, было бы здорово, если бы существовал способ задавать именованные порты, которые автоматически разрешаются любыми сетевыми приложениями, такими как curl
.
Есть ли такой способ?
.
Ответ или решение
Вопрос, представленный на Unix & Linux Stack Exchange, касается использования именованных портов, которые могут автоматически разрешаться сетевыми приложениями, такими как curl
. Вопрос акцентируется на поиске практического способа, при котором такие именованные порты могут использоваться без необходимости вручную искать и заменять именованные порты на числовые значения.
Теория
Прежде всего, важно понять, как функционирует система разрешения именованных портов в современных операционных системах на базе Unix. Файл /etc/services
используется для сопоставления имен служб с соответствующими номерами портов. Это текстовый файл, который предоставляет стандартную таблицу сопоставления для множества интернет-служб. Однако многие современные приложения не используют этот файл напрямую для разрешения именованных портов.
Причина в том, что такие приложения, как curl
, http.Get()
в Go и reqwest::get()
в Rust, не обращаются к системным функциям, таким как getservbyname()
, которые позволяют извлекать информацию из /etc/services
. Эти приложения, как правило, полагаются на числовое указание портов, поскольку это более надежно и предсказуемо. В результате, обеспечение автоматического разрешения именованных портов для таких приложений требует дополнительных действий.
Пример
В качестве примера рассмотрим, как используется традиционная функция getservbyname()
в языках программирования, таких как C. Эта функция позволяет получать информацию о службе из /etc/services
. Однако, даже в этом случае, необходимо вручную внедрять вызов этой функции в код, чтобы заменить именованные порты на числовые значения.
#include <netdb.h>
#include <stdio.h>
#include <string.h>
int main() {
char *service_name = "http";
struct servent *service;
service = getservbyname(service_name, "tcp");
if (service) {
printf("Service %s is on port %d\n", service_name, ntohs(service->s_port));
} else {
printf("Service not found\n");
}
return 0;
}
Применение
Чтобы обеспечить автоматическое разрешение именованных портов в приложениях, таких как curl
или других, необходимо рассмотреть возможность интеграции специализированного программного обеспечения или создание модуля, который будет обеспечивать такой функционал. Есть несколько подходов, которые могут быть рассмотрены:
-
Патчинг и настройка приложений:
Самый сложный, но потенциально самый мощный подход был бы в модификации исходного кода таких утилит, какcurl
, для использования системных функций, подобныхgetservbyname()
. Однако это требует знаний программирования и времени на поддержку. -
Создание обертки:
Разработайте обертку вокруг таких команд, какcurl
, чтобы перед вызовом основного процесса, конвертировать именованные порты в числовые. Это может быть скрипт на Bash или другом языке, который перед запуском определяет, какие порты должны быть преобразованы. -
Прокси-система:
Создайте прокси-систему, которая принимает именованные порты и автоматически преобразует их в числовые, к которым через настроенную маршрутизацию направляются остальные приложения. Такой прокси может быть полезен в корпоративной среде. -
Дополнение DNS:
В случае, если путь назначения (хост) также управляется вами, можно рассмотреть возможность использования CNAME записей в DNS для поддержки такого рода разрешений, но это может быть менее гибким в решении проблемы портов.
Каждый из этих подходов имеет свои преимущества и недостатки, и выбор зависит от специфических требований вашего окружения и приложения.
Заключение
Опыт повышения функциональности системы путем добавления автоматического разрешения именованных портов фактически предлагает полезные усовершенствования, однако требует инноваций и, возможно, изменений в существующей инфраструктуре. Это не простое решение, и часто для его достижения необходимо инновационно подходить к проблеме, используя как стандартные инструменты, так и разрабатывая новые.