From 28b0b08cf8a84af710b6b65981f5e76b52cfc5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=87a=C4=9Fr=C4=B1?= Date: Sun, 15 Oct 2023 20:08:13 +0000 Subject: [PATCH] allow source IP binding --- bindToInterface.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/bindToInterface.c b/bindToInterface.c index 4354b3e..3feb9a4 100644 --- a/bindToInterface.c +++ b/bindToInterface.c @@ -9,12 +9,23 @@ #include #include #include +#include //#define DEBUG //compile with gcc -nostartfiles -fpic -shared bindToInterface.c -o bindToInterface.so -ldl -D_GNU_SOURCE //Use with BIND_INTERFACE= LD_PRELOAD=./bindInterface.so like curl ifconfig.me +int bind_to_source_ip(int sockfd, const char *source_ip) +{ + struct sockaddr_in source_addr; + memset(&source_addr, 0, sizeof(source_addr)); + source_addr.sin_family = AF_INET; + source_addr.sin_addr.s_addr = inet_addr(source_ip); + + return bind(sockfd, (struct sockaddr *)&source_addr, sizeof(source_addr)); +} + int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { int *(*original_connect)(int, const struct sockaddr *, socklen_t); @@ -80,6 +91,8 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { char *bind_addr_env; bind_addr_env = getenv("BIND_INTERFACE"); + char *source_ip_env; + source_ip_env = getenv("BIND_SOURCE_IP"); struct ifreq interface; int errorCode; @@ -118,8 +131,15 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) }; } } - else - { + + if(source_ip_env != NULL && strlen(source_ip_env) > 0){ + if (bind_to_source_ip(sockfd, source_ip_env) < 0){ + perror("bind_to_source_ip failed"); + return -1; + } + } + + if(!(source_ip_env != NULL && strlen(source_ip_env) > 0) && !(bind_addr_env != NULL && strlen(bind_addr_env) > 0)){ printf("Warning: Programm with LD_PRELOAD startet, but BIND_INTERFACE environment variable not set\n"); fprintf(stderr, "Warning: Programm with LD_PRELOAD startet, but BIND_INTERFACE environment variable not set\n"); }