¿Cómo limitar el range de tomas de puertos random?

Hay un binary que necesito ejecutar que usa bind con un argumento de puerto de cero, para get un puerto libre aleatorio del sistema. ¿Hay alguna forma de restringir el range de puertos desde los que el núcleo puede elegir?

en Linux, harías algo como

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

las instrucciones para cambiar el range de puertos efímeros en otros equipos se pueden encontrar, por ejemplo, en http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html

Si desea cambiar la forma en que se ejecuta un binary sin tener acceso a sus fonts, a veces puede usar un shim, un fragment de código que, en su ejemplo, replaceá la llamada en bind() por una llamada a una function que proporcione que puede manipular los datos antes de llamar a la function real. Ver LD_PRELOAD en man ld.so

Aquí hay un C que hace exactamente eso, shim_bind.c, anulando el puerto a 7777, y asumiendo un socket AF_INET. Comstack con gcc -Wall -O2 -fpic -shanetworking -ldl -o shim_bind.so shim_bind.c y LD_PRELOAD=shim_bind.so poniendo LD_PRELOAD=shim_bind.so frente a tu command.

 /* * capture calls to a routine and replace with your code * http://unix.stackexchange.com/a/305336/119298 * gcc -Wall -O2 -fpic -shanetworking -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); }