diff --git a/src/proxymain.c b/src/proxymain.c index 2dbc5af..ea434f9 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -346,6 +346,9 @@ int MODULEMAINFUNC (int argc, char** argv){ #endif } break; + case 'N': + getip46(46, (unsigned char *)argv[i]+2, (struct sockaddr *)&srv.extNat); + break; case 'p': *SAPORT(&srv.intsa) = htons(atoi(argv[i]+2)); break; diff --git a/src/socks.c b/src/socks.c index cb71e0e..97f58d4 100644 --- a/src/socks.c +++ b/src/socks.c @@ -173,9 +173,9 @@ void * sockschild(struct clientparam* param) { case 3: #ifndef NOIPV6 - param->sinsl = *SAFAMILY(¶m->req)==AF_INET6? param->srv->extsa6 : param->srv->extsa; + param->sinsl = *SAFAMILY(¶m->req)==AF_INET6? param->srv->extsa6 : (SAISNULL(¶m->srv->extNat)?param->srv->extsa:param->srv->extNat); #else - param->sinsl = param->srv->extsa; + param->sinsl = SAISNULL(¶m->srv->extNat)?param->srv->extsa:param->srv->extNat; #endif if ((param->remsock=so._socket(SASOCK(¶m->req), command == 2? SOCK_STREAM:SOCK_DGRAM, command == 2?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} param->operation = command == 2?BIND:UDPASSOC; @@ -461,7 +461,7 @@ struct proxydef childdef = { 1080, 0, S_SOCKS, - "" + "-N(EXTERNAL_IP) External NAT address to report to client for BIND\n" }; #include "proxymain.c" #endif diff --git a/src/structures.h b/src/structures.h index 08a14b7..4df9e07 100644 --- a/src/structures.h +++ b/src/structures.h @@ -445,9 +445,11 @@ struct srvparam { struct sockaddr_in6 intsa; struct sockaddr_in6 extsa6; struct sockaddr_in6 extsa; + struct sockaddr_in6 extNat; #else struct sockaddr_in intsa; struct sockaddr_in extsa; + struct sockaddr_in extNat; #endif pthread_mutex_t counter_mutex; struct pollfd fds;