mirror of
https://codeberg.org/scip/udpxd.git
synced 2025-12-17 03:50:57 +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;
|
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) {
|
char *dstpt, char *pidfile, char *chrootdir, char *user) {
|
||||||
host_t *listen_h, *dst_h, *bind_h;
|
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;
|
bind_h = NULL;
|
||||||
|
|
||||||
if(srcip != NULL) {
|
if(srcip != NULL) {
|
||||||
bind_h = get_host(srcip, 0, NULL, NULL);
|
bind_h = get_host(srcip, atoi(srcpt), NULL, NULL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(dst_h->is_v6)
|
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);
|
src_h->ip, src_h->port, len, dst_h->ip, dst_h->port);
|
||||||
verb_prbind(bind_h);
|
verb_prbind(bind_h);
|
||||||
|
|
||||||
|
if (bind_h->port)
|
||||||
|
client_clean(1);
|
||||||
output = bindsocket(bind_h);
|
output = bindsocket(bind_h);
|
||||||
if (output >= 0) {
|
if (output >= 0) {
|
||||||
/* send req out */
|
/* 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);
|
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 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);
|
char *dstpt, char *pidfile, char *chrootdir, char *user);
|
||||||
int daemonize(char *pidfile);
|
int daemonize(char *pidfile);
|
||||||
int drop_privileges(char *user, char *chrootdir);
|
int drop_privileges(char *user, char *chrootdir);
|
||||||
|
|||||||
25
udpxd.c
25
udpxd.c
@@ -92,7 +92,8 @@ void usage() {
|
|||||||
"Usage: udpxd [-lbdfpvhV]\n\n"
|
"Usage: udpxd [-lbdfpvhV]\n\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
"--listen -l <ip:port> listen for incoming requests\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"
|
"--to -t <ip:port> destination to forward requests to\n"
|
||||||
"--daemon -d daemon mode, fork into background\n"
|
"--daemon -d daemon mode, fork into background\n"
|
||||||
"--pidfile -p <file> pidfile, default: /var/run/udpxd.pid\n"
|
"--pidfile -p <file> pidfile, default: /var/run/udpxd.pid\n"
|
||||||
@@ -110,7 +111,7 @@ void usage() {
|
|||||||
|
|
||||||
int main ( int argc, char* argv[] ) {
|
int main ( int argc, char* argv[] ) {
|
||||||
int opt, err;
|
int opt, err;
|
||||||
char *inip, *inpt, *srcip, *dstip, *dstpt;
|
char *inip, *inpt, *srcip, *srcpt, *dstip, *dstpt;
|
||||||
char pidfile[MAX_BUFFER_SIZE];
|
char pidfile[MAX_BUFFER_SIZE];
|
||||||
char user[128];
|
char user[128];
|
||||||
char chroot[MAX_BUFFER_SIZE];
|
char chroot[MAX_BUFFER_SIZE];
|
||||||
@@ -135,7 +136,7 @@ int main ( int argc, char* argv[] ) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
srcip = dstip = inip = dstpt = inpt = NULL;
|
srcip = srcpt = dstip = inip = dstpt = inpt = NULL;
|
||||||
|
|
||||||
/* set defaults */
|
/* set defaults */
|
||||||
strncpy(pidfile, "/var/run/udpxd.pid", 19);
|
strncpy(pidfile, "/var/run/udpxd.pid", 19);
|
||||||
@@ -171,19 +172,23 @@ int main ( int argc, char* argv[] ) {
|
|||||||
dstip = malloc(INET6_ADDRSTRLEN+1);
|
dstip = malloc(INET6_ADDRSTRLEN+1);
|
||||||
dstpt = malloc(6);
|
dstpt = malloc(6);
|
||||||
if (parse_ip(optarg, dstip, dstpt) != 0) {
|
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;
|
err = 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
srcip = malloc(INET6_ADDRSTRLEN+1);
|
srcip = malloc(INET6_ADDRSTRLEN+1+5); // +5 is for port
|
||||||
if(strlen(optarg) > INET6_ADDRSTRLEN) {
|
srcpt = malloc(6);
|
||||||
|
if(strlen(optarg) > INET6_ADDRSTRLEN+5) {
|
||||||
fprintf(stderr, "Bind ip address is too long!\n");
|
fprintf(stderr, "Bind ip address is too long!\n");
|
||||||
err = 1;
|
err = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
strncpy(srcip, optarg, INET6_ADDRSTRLEN);
|
if (strchr(optarg, ':') == NULL || parse_ip(optarg, srcip, srcpt) != 0) {
|
||||||
srcip[INET6_ADDRSTRLEN-1] = '\0';
|
strncpy(srcip, optarg, INET6_ADDRSTRLEN+5);
|
||||||
|
srcip[INET6_ADDRSTRLEN+5-1] = '\0';
|
||||||
|
strncpy(srcpt, "0", 2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'p':
|
case 'p':
|
||||||
@@ -225,11 +230,13 @@ int main ( int argc, char* argv[] ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(! err) {
|
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)
|
if(srcip != NULL)
|
||||||
free(srcip);
|
free(srcip);
|
||||||
|
if(srcpt != NULL)
|
||||||
|
free(srcpt);
|
||||||
if(dstip != NULL)
|
if(dstip != NULL)
|
||||||
free(dstip);
|
free(dstip);
|
||||||
if(inip != NULL)
|
if(inip != NULL)
|
||||||
|
|||||||
Reference in New Issue
Block a user