Практический способ определения именованных портов (автоматически разрешаемая версия /etc/services)?

Вопрос или проблема

Именованные порты могут быть определены в /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 или других, необходимо рассмотреть возможность интеграции специализированного программного обеспечения или создание модуля, который будет обеспечивать такой функционал. Есть несколько подходов, которые могут быть рассмотрены:

  1. Патчинг и настройка приложений:
    Самый сложный, но потенциально самый мощный подход был бы в модификации исходного кода таких утилит, как curl, для использования системных функций, подобных getservbyname(). Однако это требует знаний программирования и времени на поддержку.

  2. Создание обертки:
    Разработайте обертку вокруг таких команд, как curl, чтобы перед вызовом основного процесса, конвертировать именованные порты в числовые. Это может быть скрипт на Bash или другом языке, который перед запуском определяет, какие порты должны быть преобразованы.

  3. Прокси-система:
    Создайте прокси-систему, которая принимает именованные порты и автоматически преобразует их в числовые, к которым через настроенную маршрутизацию направляются остальные приложения. Такой прокси может быть полезен в корпоративной среде.

  4. Дополнение DNS:
    В случае, если путь назначения (хост) также управляется вами, можно рассмотреть возможность использования CNAME записей в DNS для поддержки такого рода разрешений, но это может быть менее гибким в решении проблемы портов.

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

Заключение

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

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

Капча загружается...