Networking

如何限制隨機埠套接字的範圍?

  • August 23, 2016

我需要執行一個二進製文件,它使用bind埠參數為零,以從系統中獲取隨機空閒埠。有沒有辦法限制核心允許選擇的埠範圍?

在 Linux 上,你會做類似的事情

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

可以在例如http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html找到更改其他 unices 上的臨時埠範圍的說明

如果您想在不訪問其原始碼的情況下更改二進製文件的執行方式,有時可以使用 shim,在您的範例中,一段程式碼將bind()通過呼叫您提供的可以操作的函式來替換呼叫呼叫實際函式之前的數據。見LD_PRELOADman 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);
}

引用自:https://unix.stackexchange.com/questions/305308