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){
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;
}
@ -2040,7 +2049,7 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int
{
char * args[] = {"auth", "iponly", NULL};
h_auth(2, args);
h_auth(2, (unsigned char **)args);
}
res = readconfig(fp);

View File

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

View File

@ -564,12 +564,12 @@ static void * ef_server_intsa(struct node * node){
return &((struct srvparam *)node->value) -> intsa;
}
static void * ef_server_extip(struct node * node){
return &((struct srvparam *)node->value) -> extip;
static void * ef_server_extsa(struct node * node){
return &((struct srvparam *)node->value) -> extsa;
}
static void * ef_server_extport(struct node * node){
return &((struct srvparam *)node->value) -> extport;
static void * ef_server_extsa6(struct node * node){
return &((struct srvparam *)node->value) -> extsa6;
}
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 + 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 + 6, "extip", ef_server_extip, TYPE_IP, "ip address of external interface"},
{prop_server + 7, "extport", ef_server_extport, TYPE_PORT, "port to use for outgoing connection"},
{prop_server + 6, "extsa", ef_server_extsa, TYPE_SA, "ip address of external interface"},
{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 + 9, "acl", ef_server_acl, TYPE_ACE, "access control list"},
{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);
break;
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;
case 'p':
*SAPORT(&srv.intsa) = htons(atoi(argv[i]+2));
@ -313,6 +321,10 @@ int MODULEMAINFUNC (int argc, char** argv){
srvinit2(&srv, &defparam);
if(!*SAFAMILY(&srv.intsa)) *SAFAMILY(&srv.intsa) = AF_INET;
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);
@ -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;
pthread_mutex_init(&srv->counter_mutex, NULL);
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){
@ -550,12 +566,9 @@ void srvinit2(struct srvparam * srv, struct clientparam *param){
else srv->logformat = (unsigned char *)mystrdup((char *)srv->logformat);
}
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));
if(!srv->extip) srv->extip = conf.extip;
param->sins.sin_addr.s_addr = param->extip = srv->extip;
if(!srv->extport) srv->extport = htons(conf.extport);
param->sins.sin_port = param->extport = srv->extport;
/* FIX ME */
memcpy(&param->sins, &srv->extsa, sizeof(param->sins));
}
void srvfree(struct srvparam * srv){
@ -858,9 +871,13 @@ void freeconf(struct extparam *confp){
confp->authfunc = ipauth;
confp->bandlimfunc = NULL;
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;
confp->extip = 0;
*SAPORT(&confp->intsa) = confp->extport = 0;
*SAFAMILY(&confp->extsa) = AF_INET;
confp->singlepacket = 0;
confp->maxchild = 100;
resolvfunc = NULL;

View File

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

View File

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