Added IPv6 support for 'external' command and -e

Now, 2 external addresses can be specified: one for IPv4 and one for
IPv6
This commit is contained in:
z3APA3A 2014-10-19 04:32:18 +04:00
parent a425dc40b3
commit f1e017394d
6 changed files with 52 additions and 24 deletions

View File

@ -732,7 +732,16 @@ static int h_internal(int argc, unsigned char ** argv){
} }
static int h_external(int argc, unsigned char ** argv){ static int h_external(int argc, unsigned char ** argv){
conf.extip = getip(argv[1]); int res;
#ifndef NOIPV6
struct sockaddr_in6 sa6;
res = getip46(46, argv[1], (struct sockaddr *)&sa6);
if(!res) return 1;
memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&conf.extsa:(void *)&conf.extsa6, &sa6, SASIZE(&sa6));
#else
res = getip46(46, argv[1], (struct sockaddr *)&conf.extsa);
if(!res) return 1;
#endif
return 0; return 0;
} }
@ -2040,7 +2049,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
{ {
char * args[] = {"auth", "iponly", NULL}; char * args[] = {"auth", "iponly", NULL};
h_auth(2, args); h_auth(2, (unsigned char **)args);
} }
res = readconfig(fp); res = readconfig(fp);

View File

@ -65,9 +65,11 @@ struct extparam conf = {
NULL, NULL, NULL, NULL,
NONE, NONE, NONE, NONE,
NULL, NULL,
{AF_INET}, #ifndef NOIPV6
INADDR_ANY, {AF_INET},{AF_INET6},{AF_INET},
0, #else
{AF_INET},{AF_INET},
#endif
NULL, NULL,
NULL, NULL,
doconnect, doconnect,

View File

@ -564,12 +564,12 @@ static void * ef_server_intsa(struct node * node){
return &((struct srvparam *)node->value) -> intsa; return &((struct srvparam *)node->value) -> intsa;
} }
static void * ef_server_extip(struct node * node){ static void * ef_server_extsa(struct node * node){
return &((struct srvparam *)node->value) -> extip; return &((struct srvparam *)node->value) -> extsa;
} }
static void * ef_server_extport(struct node * node){ static void * ef_server_extsa6(struct node * node){
return &((struct srvparam *)node->value) -> extport; return &((struct srvparam *)node->value) -> extsa6;
} }
static void * ef_server_acl(struct node * node){ static void * ef_server_acl(struct node * node){
@ -754,8 +754,8 @@ static struct property prop_server[] = {
{prop_server + 3, "targetport", ef_server_targetport, TYPE_PORT, "portmapper target port"}, {prop_server + 3, "targetport", ef_server_targetport, TYPE_PORT, "portmapper target port"},
{prop_server + 4, "starttime", ef_server_starttime, TYPE_DATETIME, "service started seconds"}, {prop_server + 4, "starttime", ef_server_starttime, TYPE_DATETIME, "service started seconds"},
{prop_server + 5, "intsa", ef_server_intsa, TYPE_SA, "ip address of internal interface"}, {prop_server + 5, "intsa", ef_server_intsa, TYPE_SA, "ip address of internal interface"},
{prop_server + 6, "extip", ef_server_extip, TYPE_IP, "ip address of external interface"}, {prop_server + 6, "extsa", ef_server_extsa, TYPE_SA, "ip address of external interface"},
{prop_server + 7, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"}, {prop_server + 7, "extsa6", ef_server_extsa6, TYPE_SA, "ipv6 address of external interface"},
{prop_server + 8, "auth", ef_server_auth, TYPE_STRING, "service authentication type"}, {prop_server + 8, "auth", ef_server_auth, TYPE_STRING, "service authentication type"},
{prop_server + 9, "acl", ef_server_acl, TYPE_ACE, "access control list"}, {prop_server + 9, "acl", ef_server_acl, TYPE_ACE, "access control list"},
{prop_server + 10, "singlepacket", ef_server_singlepacket, TYPE_INTEGER, "is single packet redirection"}, {prop_server + 10, "singlepacket", ef_server_singlepacket, TYPE_INTEGER, "is single packet redirection"},

View File

@ -176,7 +176,15 @@ int MODULEMAINFUNC (int argc, char** argv){
getip46(46, argv[i]+2, (struct sockaddr *)&srv.intsa); getip46(46, argv[i]+2, (struct sockaddr *)&srv.intsa);
break; break;
case 'e': case 'e':
srv.extip = getip((unsigned char *)argv[i]+2); {
#ifndef NOIPV6
struct sockaddr_in6 sa6;
error = !getip46(46, argv[i]+2, (struct sockaddr *)&sa6);
if(!error) memcpy((*SAFAMILY(&sa6)==AF_INET)?(void *)&srv.extsa:(void *)&srv.extsa6, &sa6, SASIZE(&sa6));
#else
error = !getip46(46, argv[i]+2, (struct sockaddr *)&srv.extsa);
#endif
}
break; break;
case 'p': case 'p':
*SAPORT(&srv.intsa) = htons(atoi(argv[i]+2)); *SAPORT(&srv.intsa) = htons(atoi(argv[i]+2));
@ -313,6 +321,10 @@ int MODULEMAINFUNC (int argc, char** argv){
srvinit2(&srv, &defparam); srvinit2(&srv, &defparam);
if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET; if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET;
if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port); if(!*SAPORT(&srv.intsa)) *SAPORT(&srv.intsa) = htons(childdef.port);
*SAFAMILY(&srv.extsa) = AF_INET;
#ifndef NOIPV6
*SAFAMILY(&srv.extsa6) = AF_INET6;
#endif
if(hostname)parsehostname(hostname, &defparam, childdef.port); if(hostname)parsehostname(hostname, &defparam, childdef.port);
@ -535,6 +547,10 @@ void srvinit(struct srvparam * srv, struct clientparam *param){
*SAFAMILY(&param->req) = *SAFAMILY(&param->sins) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET; *SAFAMILY(&param->req) = *SAFAMILY(&param->sins) = *SAFAMILY(&param->sincr) = *SAFAMILY(&param->sincl) = AF_INET;
pthread_mutex_init(&srv->counter_mutex, NULL); pthread_mutex_init(&srv->counter_mutex, NULL);
memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa)); memcpy(&srv->intsa, &conf.intsa, sizeof(srv->intsa));
memcpy(&srv->extsa, &conf.extsa, sizeof(srv->extsa));
#ifndef NOIPV6
memcpy(&srv->extsa6, &conf.extsa6, sizeof(srv->extsa6));
#endif
} }
void srvinit2(struct srvparam * srv, struct clientparam *param){ void srvinit2(struct srvparam * srv, struct clientparam *param){
@ -550,12 +566,9 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){
else srv->logformat = (unsigned char *)mystrdup((char *)srv->logformat); else srv->logformat = (unsigned char *)mystrdup((char *)srv->logformat);
} }
if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget); if(srv->logtarget) srv->logtarget = (unsigned char *)mystrdup((char *)srv->logtarget);
if(!*SAFAMILY(&srv->intsa)) *SAFAMILY(&srv->intsa) = AF_INET;
memcpy(&param->sincr, &srv->intsa, sizeof(param->sincr)); memcpy(&param->sincr, &srv->intsa, sizeof(param->sincr));
if(!srv->extip) srv->extip = conf.extip; /* FIX ME */
param->sins.sin_addr.s_addr = param->extip = srv->extip; memcpy(&param->sins, &srv->extsa, sizeof(param->sins));
if(!srv->extport) srv->extport = htons(conf.extport);
param->sins.sin_port = param->extport = srv->extport;
} }
void srvfree(struct srvparam * srv){ void srvfree(struct srvparam * srv){
@ -858,9 +871,13 @@ void freeconf(struct extparam *confp){
confp->authfunc = ipauth; confp->authfunc = ipauth;
confp->bandlimfunc = NULL; confp->bandlimfunc = NULL;
memset(&confp->intsa, 0, sizeof(confp->intsa)); memset(&confp->intsa, 0, sizeof(confp->intsa));
memset(&confp->extsa, 0, sizeof(confp->extsa));
#ifndef NOIPV6
memset(&confp->extsa6, 0, sizeof(confp->extsa6));
*SAFAMILY(&confp->extsa6) = AF_INET6;
#endif
*SAFAMILY(&confp->intsa) = AF_INET; *SAFAMILY(&confp->intsa) = AF_INET;
confp->extip = 0; *SAFAMILY(&confp->extsa) = AF_INET;
*SAPORT(&confp->intsa) = confp->extport = 0;
confp->singlepacket = 0; confp->singlepacket = 0;
confp->maxchild = 100; confp->maxchild = 100;
resolvfunc = NULL; resolvfunc = NULL;

View File

@ -356,10 +356,11 @@ struct srvparam {
unsigned logdumpsrv, logdumpcli; unsigned logdumpsrv, logdumpcli;
#ifndef NOIPV6 #ifndef NOIPV6
struct sockaddr_in6 intsa; struct sockaddr_in6 intsa;
struct sockaddr_in6 extsa6;
#else #else
struct sockaddr_in intsa; struct sockaddr_in intsa;
#endif #endif
unsigned long extip; struct sockaddr_in extsa;
pthread_mutex_t counter_mutex; pthread_mutex_t counter_mutex;
struct pollfd fds; struct pollfd fds;
FILE *stdlog; FILE *stdlog;
@ -372,7 +373,6 @@ struct srvparam {
unsigned char * logformat; unsigned char * logformat;
unsigned char * logtarget; unsigned char * logtarget;
unsigned char * nonprintable; unsigned char * nonprintable;
unsigned short extport;
unsigned short targetport; unsigned short targetport;
unsigned char replace; unsigned char replace;
time_t time_start; time_t time_start;
@ -484,11 +484,11 @@ struct extparam {
char * counterfile; char * counterfile;
#ifndef NOIPV6 #ifndef NOIPV6
struct sockaddr_in6 intsa; struct sockaddr_in6 intsa;
struct sockaddr_in6 extsa6;
#else #else
struct sockaddr_in intsa; struct sockaddr_in intsa;
#endif #endif
unsigned long extip; struct sockaddr_in extsa;
unsigned short extport;
struct passwords *pwl; struct passwords *pwl;
struct auth * authenticate; struct auth * authenticate;
AUTHFUNC authfunc; AUTHFUNC authfunc;

View File

@ -1,2 +1,2 @@
#define VERSION "3proxy-0.8b-devel" #define VERSION "3proxy-0.8b-devel"
#define BUILDDATE "140703033508" #define BUILDDATE "141019042604"