From b99fa7aaa44efefc020fb01e02de631df5af7c61 Mon Sep 17 00:00:00 2001 From: z3APA3A <3APA3A@3proxy.ru> Date: Tue, 17 Oct 2017 17:07:35 +0300 Subject: [PATCH] Simplify transparent + add support for BSD PF/IPF --- Makefile.FreeBSD | 2 +- Makefile.Linux | 2 +- Makefile.Solaris | 2 +- Makefile.unix | 2 +- .../TransparentPlugin/transparent_plugin.c | 52 +++++++++++-------- 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Makefile.FreeBSD b/Makefile.FreeBSD index 9aae106..c421088 100644 --- a/Makefile.FreeBSD +++ b/Makefile.FreeBSD @@ -31,7 +31,7 @@ REMOVECOMMAND = rm -f TYPECOMMAND = cat COMPATLIBS = MAKEFILE = Makefile.unix -PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth +PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth TransparentPlugin include Makefile.inc diff --git a/Makefile.Linux b/Makefile.Linux index 4c42283..7470126 100644 --- a/Makefile.Linux +++ b/Makefile.Linux @@ -10,7 +10,7 @@ BUILDDIR = CC = gcc -CFLAGS = -g -O2 -c -pthread -DWITHSPLICE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL +CFLAGS = -g -O2 -c -pthread -DWITHSPLICE -DGETHOSTBYNAME_R -D_THREAD_SAFE -D_REENTRANT -DNOODBC -DWITH_STD_MALLOC -DFD_SETSIZE=4096 -DWITH_POLL -DWITH_NETFILTER COUT = -o LN = gcc DCFLAGS = -fpic diff --git a/Makefile.Solaris b/Makefile.Solaris index 290993c..578ec57 100644 --- a/Makefile.Solaris +++ b/Makefile.Solaris @@ -28,7 +28,7 @@ REMOVECOMMAND = rm -f TYPECOMMAND = cat COMPATLIBS = MAKEFILE = Makefile.Solaris -PLUGINS = StringsPlugin TrafficPlugin PCREPlugin +PLUGINS = StringsPlugin TrafficPlugin PCREPlugin TransparentPlugin include Makefile.inc diff --git a/Makefile.unix b/Makefile.unix index 37797a5..287f8b9 100644 --- a/Makefile.unix +++ b/Makefile.unix @@ -32,7 +32,7 @@ REMOVECOMMAND = rm -f TYPECOMMAND = cat COMPATLIBS = MAKEFILE = Makefile.unix -PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth +PLUGINS = StringsPlugin TrafficPlugin PCREPlugin PamAuth TransparentPlugin include Makefile.inc diff --git a/src/plugins/TransparentPlugin/transparent_plugin.c b/src/plugins/TransparentPlugin/transparent_plugin.c index 7668d15..d5a1677 100644 --- a/src/plugins/TransparentPlugin/transparent_plugin.c +++ b/src/plugins/TransparentPlugin/transparent_plugin.c @@ -6,14 +6,18 @@ */ + +#ifdef WITH_NETFILTER #include +#endif #include "../../structures.h" #include "../../proxy.h" +#ifdef WITH_NETFILTER #include #include #include #include - +#endif #ifdef __cplusplus extern "C" { @@ -38,35 +42,37 @@ static void* transparent_filter_open(void * idata, struct srvparam * param){ static FILTER_ACTION transparent_filter_client(void *fo, struct clientparam * param, void** fc){ -#ifdef SO_ORIGINAL_DST - struct sockaddr_in addr; socklen_t len; - unsigned u; - unsigned short p; - char addrbuf[24]; + char addrbuf[60]; + int i=0; - len = sizeof(addr); - if(getsockopt(param->clisock, SOL_IP, SO_ORIGINAL_DST,(struct sockaddr *) &addr, &len) || !addr.sin_addr.s_addr){ - return PASS; - } - u = ntohl(addr.sin_addr.s_addr); - p = ntohs(addr.sin_port); - sprintf(addrbuf, "%u.%u.%u.%u:%hu", - ((u&0xFF000000)>>24), - ((u&0x00FF0000)>>16), - ((u&0x0000FF00)>>8), - ((u&0x000000FF)), - p); + len = sizeof(param->req); - pl->parsehostname(addrbuf, param, 0); +#ifdef WITH_NETFILTER +#ifdef SO_ORIGINAL_DST + if(getsockopt(param->clisock, SOL_IP, SO_ORIGINAL_DST,(struct sockaddr *) ¶m->req, &len)){ return PASS; + } #else #error No SO_ORIGINAL_DST defined - param->srv->logfunc(param, (unsigned char *)"transparent_plugin: No SO_ORIGINAL_DST defined"); - return REJECT; + param->srv->logfunc(param, (unsigned char *)"transparent_plugin: No SO_ORIGINAL_DST defined"); + return REJECT; #endif - - +#else + if(!memcmp(¶m->req, ¶m->sincl,sizeof(param->req))){ + param->req = param->sincl; + param->sincl = param->srv->intsa; + } +#endif + addrbuf[i++] = '['; + i += pl->myinet_ntop(*SAFAMILY(¶m->req), SAADDR(¶m->req), (char *)addrbuf + i, sizeof(addrbuf)); + sprintf((char *)addrbuf+i, "]:%hu", ntohs(*SAPORT(¶m->req))); +#ifdef mystrdup +#undef mystrdup +#undef myfree +#endif + if(param->hostname) pl->myfree(param->hostname); + param->hostname = pl->mystrdup(addrbuf); return PASS; }