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

Существует двоичный файл, который мне нужно запустить, который использует 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); } 
  • Команда Solaris для остановки прослушивания в порту
  • Как обеспечить, чтобы исходящий трафик TCP / IP всегда использовал VPN, даже при использовании Wi-Fi?
  • Создайте UDP для TCP-моста с помощью socat / netcat для управления командами управления для медиаплеера vlc
  • Получение текущего количества соединений TCP в системе
  • Как записывать сеанс TCP / TLS в societ socat?
  • Реле TCP / IP от одного клиента к нескольким клиентам
  • Захват данных с Fluke 1620a с помощью дескриптора файла Bash / dev / tcp
  • Ошибка: «TCP_NODELAY» не был объявлен в этой области
  • Как хранить данные на диске непосредственно в модуле ядра?
  • Какие порты необходимы и, как правило, должны быть разрешены в системе Linux?
  • Анализ сетевого трафика
  • Почему я не вижу капель с потоками TCP в linux
  • Linux и Unix - лучшая ОС в мире.