mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-23 18:45:40 +08:00
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:
parent
a425dc40b3
commit
f1e017394d
13
src/3proxy.c
13
src/3proxy.c
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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"},
|
||||
|
@ -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(¶m->req) = *SAFAMILY(¶m->sins) = *SAFAMILY(¶m->sincr) = *SAFAMILY(¶m->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(¶m->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(¶m->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;
|
||||
|
@ -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;
|
||||
|
@ -1,2 +1,2 @@
|
||||
#define VERSION "3proxy-0.8b-devel"
|
||||
#define BUILDDATE "140703033508"
|
||||
#define BUILDDATE "141019042604"
|
||||
|
Loading…
Reference in New Issue
Block a user