Как ограничить диапазон случайных портов?

Существует двоичный файл, который мне нужно запустить, который использует bind с аргументом порта, равным нулю, чтобы получить случайный свободный порт из системы. Есть ли способ ограничить диапазон портов, из которых ядро ​​можно выбрать?

2 Solutions collect form web for “Как ограничить диапазон случайных портов?”

на Linux вы бы сделали что-то вроде

 sudo sysctl -w net.ipv4.ip_local_port_range="60000 61000" 

инструкции по изменению эфемерного диапазона портов в других организациях можно найти, например, по адресу http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html.

Если вы хотите изменить способ запуска двоичного файла без доступа к его источникам, иногда вы можете использовать прокладку, часть кода, которая в вашем примере заменит вызов на bind() вызовом функции, которую вы предоставляете которые могут манипулировать данными перед вызовом реальной функции. См. LD_PRELOAD в man ld.so

Вот некоторые C, которые делают именно это, shim_bind.c, переопределяя порт до 7777 и предполагая сокет AF_INET. Скомпилируйте его с помощью gcc -Wall -O2 -fpic -shared -ldl -o shim_bind.so shim_bind.c и используйте его, поставив LD_PRELOAD=shim_bind.so перед вашей командой.

 /* * capture calls to a routine and replace with your code * http://unix.stackexchange.com/a/305336/119298 * gcc -Wall -O2 -fpic -shared -ldl -o shim_bind.so shim_bind.c * LD_PRELOAD=/path/to/shim_bind.so ./test */ #define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <dlfcn.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen){ static int (*real_bind)(int sockfd, const struct sockaddr *addr, socklen_t addrlen) = NULL; int port = 7777; struct sockaddr_in theaddr; if (!real_bind) { real_bind = dlsym(RTLD_NEXT, "bind"); char *error = dlerror(); if (error != NULL) { fprintf(stderr, "%s\n", error); exit(1); } } fprintf(stderr, "binding: port %d\n", port); memcpy(&theaddr, addr, sizeof(theaddr)); theaddr.sin_port = htons((unsigned short)port); return real_bind(sockfd, (struct sockaddr*)&theaddr, addrlen); } 
  • `cat / dev / ttyACM` теряет данные при передаче через netcat
  • Как настроить контейнеры Docker для уникальных IP-адресов, которые не являются стандартными?
  • Хранение огромных данных в ядре Linux
  • обнаружение процесса, выполняющего порты
  • Инструмент для генерации трафика TCP
  • Как изменить заголовок команды при запуске сервера?
  • Как я могу регистрировать исходящий трафик TCP, включая полный путь к URL-адресам?
  • Значение bash -i> & / dev / tcp / HOST / PORT 0> & 1?
  • Как получить доступ к http-серверу из сценария bash с существующим подключением tcp?
  • Получать количество байтов / пакетов в одном и том же порту TCP / UDP
  • Как загрузить видео из протокола rtmp из-за прокси-сервера, используя rtmpdump
  • Interesting Posts

    Почему пишет SLOW на необработанном устройстве и FAST на файловой системе (USB-ключ)?

    Попытка обнаружения приемлемых базовых DN DN для LDAP для разных серверов каталогов в сценарии bash

    Как изменить монитор, на котором отображается TTY?

    X11 управляет корневым окном или устанавливает окно как фоновое окно (обои)

    Как изменить размер логического тома для файловой системы

    Почему для настройки статического IP-адреса нужны «сетевые», «сетевые», «шлюзовые» и «DNS-серверы имен»?

    Установите Firefox Quantum в debian 9 Stretch

    Как подключить wi-fi интерфейс из командной строки?

    На RHEL 6 у меня, похоже, установлен EPEL, но он не отображается в yum. Как я могу активировать его?

    find arcana: невозможно заставить трубу работать в линии -exec

    Как установщики дистрибуции избегают инициализации ext2 / 3/4?

    Почему мой пользовательский макет не работает?

    Форматировать жесткий диск Windows (NTFS) на Ubuntu с помощью командной строки

    Шаблон Grep, включающий тире и ограничение на расширение имени файла

    Установка vpnc на CentOS

    Linux и Unix - лучшая ОС в мире.