mirror of
https://codeberg.org/scip/udpxd.git
synced 2025-12-16 03:20:58 +01:00
Merge pull request #8 from ValdikSS/dumbmode
Implement promiscuous (dumb) mode by binding port on outgoing socket
This commit is contained in:
6
net.c
6
net.c
@@ -185,7 +185,7 @@ int drop_privileges(char *user, char *chrootdir) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int start_listener (char *inip, char *inpt, char *srcip, char *dstip,
|
||||
int start_listener (char *inip, char *inpt, char *srcip, char *srcpt, char *dstip,
|
||||
char *dstpt, char *pidfile, char *chrootdir, char *user) {
|
||||
host_t *listen_h, *dst_h, *bind_h;
|
||||
|
||||
@@ -208,7 +208,7 @@ int start_listener (char *inip, char *inpt, char *srcip, char *dstip,
|
||||
bind_h = NULL;
|
||||
|
||||
if(srcip != NULL) {
|
||||
bind_h = get_host(srcip, 0, NULL, NULL);
|
||||
bind_h = get_host(srcip, atoi(srcpt), NULL, NULL);
|
||||
}
|
||||
else {
|
||||
if(dst_h->is_v6)
|
||||
@@ -298,6 +298,8 @@ void handle_inside(int inside, host_t *listen_h, host_t *bind_h, host_t *dst_h)
|
||||
src_h->ip, src_h->port, len, dst_h->ip, dst_h->port);
|
||||
verb_prbind(bind_h);
|
||||
|
||||
if (bind_h->port)
|
||||
client_clean(1);
|
||||
output = bindsocket(bind_h);
|
||||
if (output >= 0) {
|
||||
/* send req out */
|
||||
|
||||
2
net.h
2
net.h
@@ -56,7 +56,7 @@ void handle_inside(int inside, host_t *listen_h, host_t *bind_h, host_t *dst_h);
|
||||
void handle_outside(int inside, int outside, host_t *outside_h);
|
||||
|
||||
int main_loop(int listensocket, host_t *listen_h, host_t *bind_h, host_t *dst_h);
|
||||
int start_listener (char *inip, char *inpt, char *srcip, char *dstip,
|
||||
int start_listener (char *inip, char *inpt, char *srcip, char *srcpt, char *dstip,
|
||||
char *dstpt, char *pidfile, char *chrootdir, char *user);
|
||||
int daemonize(char *pidfile);
|
||||
int drop_privileges(char *user, char *chrootdir);
|
||||
|
||||
25
udpxd.c
25
udpxd.c
@@ -92,7 +92,8 @@ void usage() {
|
||||
"Usage: udpxd [-lbdfpvhV]\n\n"
|
||||
"Options:\n"
|
||||
"--listen -l <ip:port> listen for incoming requests\n"
|
||||
"--bind -b <ip> bind ip used for outgoing requests\n"
|
||||
"--bind -b <ip[:port]> bind ip used for outgoing requests\n"
|
||||
" specify port for promiscuous mode\n"
|
||||
"--to -t <ip:port> destination to forward requests to\n"
|
||||
"--daemon -d daemon mode, fork into background\n"
|
||||
"--pidfile -p <file> pidfile, default: /var/run/udpxd.pid\n"
|
||||
@@ -110,7 +111,7 @@ void usage() {
|
||||
|
||||
int main ( int argc, char* argv[] ) {
|
||||
int opt, err;
|
||||
char *inip, *inpt, *srcip, *dstip, *dstpt;
|
||||
char *inip, *inpt, *srcip, *srcpt, *dstip, *dstpt;
|
||||
char pidfile[MAX_BUFFER_SIZE];
|
||||
char user[128];
|
||||
char chroot[MAX_BUFFER_SIZE];
|
||||
@@ -135,7 +136,7 @@ int main ( int argc, char* argv[] ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
srcip = dstip = inip = dstpt = inpt = NULL;
|
||||
srcip = srcpt = dstip = inip = dstpt = inpt = NULL;
|
||||
|
||||
/* set defaults */
|
||||
strncpy(pidfile, "/var/run/udpxd.pid", 19);
|
||||
@@ -171,19 +172,23 @@ int main ( int argc, char* argv[] ) {
|
||||
dstip = malloc(INET6_ADDRSTRLEN+1);
|
||||
dstpt = malloc(6);
|
||||
if (parse_ip(optarg, dstip, dstpt) != 0) {
|
||||
fprintf(stderr, "Parameter -d has the format <ip-address:port>!\n");
|
||||
fprintf(stderr, "Parameter -t has the format <ip-address:port>!\n");
|
||||
err = 1;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
srcip = malloc(INET6_ADDRSTRLEN+1);
|
||||
if(strlen(optarg) > INET6_ADDRSTRLEN) {
|
||||
srcip = malloc(INET6_ADDRSTRLEN+1+5); // +5 is for port
|
||||
srcpt = malloc(6);
|
||||
if(strlen(optarg) > INET6_ADDRSTRLEN+5) {
|
||||
fprintf(stderr, "Bind ip address is too long!\n");
|
||||
err = 1;
|
||||
}
|
||||
else {
|
||||
strncpy(srcip, optarg, INET6_ADDRSTRLEN);
|
||||
srcip[INET6_ADDRSTRLEN-1] = '\0';
|
||||
if (strchr(optarg, ':') == NULL || parse_ip(optarg, srcip, srcpt) != 0) {
|
||||
strncpy(srcip, optarg, INET6_ADDRSTRLEN+5);
|
||||
srcip[INET6_ADDRSTRLEN+5-1] = '\0';
|
||||
strncpy(srcpt, "0", 2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
@@ -225,11 +230,13 @@ int main ( int argc, char* argv[] ) {
|
||||
}
|
||||
|
||||
if(! err) {
|
||||
err = start_listener (inip, inpt, srcip, dstip, dstpt, pidfile, chroot, user);
|
||||
err = start_listener (inip, inpt, srcip, srcpt, dstip, dstpt, pidfile, chroot, user);
|
||||
}
|
||||
|
||||
if(srcip != NULL)
|
||||
free(srcip);
|
||||
if(srcpt != NULL)
|
||||
free(srcpt);
|
||||
if(dstip != NULL)
|
||||
free(dstip);
|
||||
if(inip != NULL)
|
||||
|
||||
Reference in New Issue
Block a user